文章目錄
APK結構
apk是一個壓縮包,裏面有lib,META-INF,classes.dex,res,resources.arsc文件夾和文件。下面看看它們各自的作用。
名稱 | 內容 | 詳細 |
---|---|---|
lib | 放的是so動態鏈接庫 | apk打包不需要處理的動態庫 |
META-INF | 簽名文件夾 | 三個簽名證書(MANIFEST.MF、CERT.SF、CERT.RSA)。MANIFEST.MF文件是對每個文件的SHA-256-Digest;CERT.SF是對每個文件的頭3行進行SHA-256-Digest;CERT.RSA這個文件保存了簽名和公鑰證書。 |
classes.dex | 執行文件 | java編譯後的Android可執行的dex文件 |
AndroidManifest.xml | 聲明文件 | 記錄應用的名字、版本、權限、引用的庫文件等信息 |
res | 資源文件 | 有animator,anim,color,drawable,layout,menu,raw等文件夾 |
resources.arsc | 編譯後的二進制資源文件 | 記錄了所有的應用程序資源目錄的信息,包括每一個資源名稱、類型、值、ID以及所配置的維度信息。 這是一個索引文件。 |
初略流程
谷歌官方給出的打包流程圖。
先是把代碼編譯成Dex,然後是和資源文件整合成一個APK,再者加簽名,最後出來之前還要用zipalign工具優化一下。
細化流程
上面這個圖主要是有7個打包流程。
1.打包資源文件,生成R.java文件
aapt來打包res資源文件,生成R.java、resources.arsc和res文件。
- res目錄
文件 | 描述 |
---|---|
animator | 放屬性動畫 |
anim | 放補間動畫 |
color | 顏色資源 |
drawable | 存放XML、Bitmap文件,或者.png, .9.png, .jpg, .gif文件等圖像資源。打包過程中可能會被優化,比如色彩數可能會被優化,256色變8色。 |
layout | 佈局資源,佈局的xml文件。 |
menu | 應用程序菜單 |
raw | 直接複製到設備中的任意文件。用參數是資源的ID調用,R.raw.somefilename。和assets 不同的是,raw下面不能有目錄,而和assets可以有目錄。 |
values | 數值XML文件用來描述數組、顏色、尺寸、字符串和樣式值等 |
xml | 應用配置信息 |
- R.java文件
R.java是我們在編寫代碼的時候會用到的,裏面有靜態內部類,資源等。 - resources.arsc文件
resources.arsc這個文件記錄了所有的應用程序資源目錄的信息,包括每一個資源名稱、類型、值、ID以及所配置的維度信息。是一個資源索引表,在給定資源ID和設備配置信息的情況下能快速找到資源。
2.處理aidl文件,生成相應的Java文件
aidl(Android Interface Definition Language,Android接口描述語言),位於android-sdk/platform-tools目錄下。aidl工具解析接口定義文件然後生成相應的Java代碼接口供程序調用。如果項目沒用到aidl則跳過這一步。
3.編譯項目源代碼,生成class文件
Java Compiler階段。項目中所有的Java代碼,包括R.java和.aidl文件,都會變Java編譯器(javac)編譯成.class文件,生成的class文件位於工程中的bin/classes目錄下。
4.轉換所有的class文件,生成classes.dex文件
dex階段。通過dx工具,將.class文件和第三方庫中的.class文件處理生成classes.dex文件。該工具位於android-sdk/platform-tools 目錄下。dx工具的主要工作是將Java字節碼轉成成Dalvik字節碼、壓縮常量池、消除冗餘信息等。
5.打包生成APK文件
apkbuilder階段。通過apkbuilder工具,將aapt生成的resources.arsc和res文件、assets文件和classes.dex一起打包生成apk。打包的工具apkbuilder位於 android-sdk/tools目錄下。
6.對APK文件進行簽名
Jarsigner階段。通過Jarsigner工具,對上面的apk進行debug或release簽名。
7. 對簽名後的APK文件進行對齊處理
通過zipalign工具,將簽名後的apk進行對齊處理。工具位於android-sdk/tools目錄下。對齊的主要過程是將APK包中所有的資源文件距離文件起始偏移爲4字節整數倍,這樣通過內存映射訪問apk文件時的速度會更快。對齊的作用就是減少運行時內存的使用。
總結一下
詳細打包流程。