APK結構
apk是一個壓縮包,里面有lib,META-INF,classes.dex,res,resources.arsc文件夾和文件。下面看看它們各自的作用。
初略流程
谷歌官方給出的打包流程圖。
先是把代碼編譯成Dex,然后是和資源文件整合成一個APK,再者加簽名,最后出來之前還要用zipalign工具優化一下。
細化流程
上面這個圖主要是有7個打包流程。
1.打包資源文件,生成R.java文件
aapt來打包res資源文件,生成R.java、resources.arsc和res文件。
- res目錄
- 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文件時的速度會更快。對齊的作用就是減少運行時內存的使用。
總結一下