1.總述 apk打包總體流程

apk打包流程
2.工具列表
| 工具 | 描述 |
|---|---|
| aapt | Android資源打包工具 |
| aidl | Android接口描述語言轉(zhuǎn)化為跨進程通信.java文件的工具 |
| javac | Java編譯器 |
| proguard | 代碼混淆工具 |
| dx/d8 | 轉(zhuǎn)化.class文件為Dalvik VM能識別的.dex文件 |
| apkbuilder | 打包生成apk包 |
| jarsigner | 簽名工具 |
| zipalign | 字節(jié)碼對齊優(yōu)化工具 |
3.資源文件編譯

aapt:Android Asset Packaging Tool

資源合并流程

資源文件編譯
生成res資源,AndroidManifest文件,assets資源
- 生成R.java文件。賦予每一個非assets資源一個ID值,以常量的形式定義于R.java文件中
public final class R {
private R()
public static final class anim{...}
public static final class attr{...}
public static final class bool{...}
public static final class color{...}
public static final class dimen{...}
public static final class drawable{...}
public static final class id{...}
public static final class integer{...}
public static final class layout{...}
public static final class string{...}
public static final class style{...}
}
例
R.string.appname = 0x7f07006b
package_id(資源包) -- 0x7f
style_id(String類型) -- 07
index_id(當前類型中的序號) -- 006b
-
生成resources.arsc文件,用來描述那些具有ID值的資源的配置信息,它的內(nèi)容就相當于是一個資源索引表。包含了所有的id值的數(shù)據(jù)集合。在該文件中,如果某個id對應的是string,那么該文件會直接包含該值,如果id對應的資源是某個layout或者drawable資源,那么該文件會存入對應資源的路徑。
可以通過Analyze apk功能查看resource.arsc的文件結(jié)構(gòu):
resource.arsc文件結(jié)構(gòu)
4. aidl文件編譯
- aidl工具解析接口定義文件,然后生成響應的Java代碼接口供程序調(diào)用。如果在項目沒有使用到aidl文件,則可以跳過這一步。
- 輸入:aidl后綴的文件,位于工程src/main/aidl目錄
- 輸出:可用于進程通信的C/S端java代碼,位于build/generated/source/aidl/
5. java源碼編譯
- R.java和aidl生成的java文件,再加上工程的源代碼,使用javac編譯生成class文件
- 輸入:java源碼文件夾(另外還包括了aapt生成的R.java,aidl生成的java文件,以及BuildConfig.java)
- 輸出:對于gradle編譯,生成的class文件保存在build/intermediates/classes/
6. proguard代碼混淆
- javac完成代碼編譯后,一般還會對源碼進行混淆,類似于加密,目的是增加反編譯的難度,同時也將代碼名稱進行縮短,減少代碼占用體積
- 輸入:編譯后的.class文件,混淆規(guī)則配置文件proguard-rules.pro
- 輸出:被混淆后的.class文件,混淆前后的映射文件
7. 轉(zhuǎn)換為DEX文件
- dx工具生成可供Android系統(tǒng)虛擬機可以執(zhí)行的classes.dex文件。dx會將class轉(zhuǎn)換為Dalvik字節(jié)碼,生成常量池,消除冗余數(shù)據(jù)等
- 輸入:所有的.class文件
-
輸出:classes.dex文件
dex輸入輸出圖示
8.打包apk文件
- 打包生成apk文件。舊的apkbuilder腳本已經(jīng)廢棄,現(xiàn)在通過sdklib.jar的ApkBuilder類進行打包
- 輸入:.ap_資源包文件,class.dex文件,未變異的資源文件(asset資源等),libs等文件
- 輸出:apk文件
9.簽名apk文件
- 對apk文件進行簽名,簽名后才能在設備上進行安裝
- 輸入:上一步中生成的.apk文件、簽名文件(Debug or Release Keystore)
- 輸出:簽名后的apk文件
10.zipalign優(yōu)化
- zipalign對簽名后的apk文件進行對齊處理,使apk中所有資源文件距離文件起始偏移為4字節(jié)的整數(shù)倍,從而在通過內(nèi)存映射訪問apk文件時會更快,同事也減少了在設備上運行時的內(nèi)存消耗
- 輸入:簽名后的apk文件
- 輸出:對齊優(yōu)化的apk文件
APK典型文件包含
- AndroidManifest.xml 程序全局配置文件
- classes.dex Dalvik字節(jié)碼
- resources.arsc 資源索引表
- META-INF 該目錄下存放的是簽名信息
- res 該目錄存放資源文件
- assets 該目錄可以存放一些配置或資源文件

