APK編譯過程
- Android通過
AAPT工具
將.xml資源文件編譯成R.java的二進制文件,除了assets、raw目錄下的文件; - 將java文件編譯成.class文件;
- 通過dex工具將.class文件轉換成.dex文件
- 優化dex文件 : Davlik模式下使用
dexopt
工具將.dex文件優化得到.odex
文件 ; Art模式下使用dexoat
工具將.dex文件優化得到.oat
文件; apkbuilder
會將.dex文件和未被編譯的文件編譯成apk;apkSinger
對apk簽名;zipalign
對簽名後的apk進行優化
APK包內容
Android 安裝的apk文件實際上是以.zip結尾的壓縮文件,解壓後的文件內容如上圖所示
AndroidManifest.xml對應源代碼中的AndroidManifest.xml, 但這裏是編譯過的,文件內容已經不同了;
assets對應源代碼的assets目錄, 是直接複製過來的;
classes.dex(classes2.dex、classes3.dex等等)是包含所有Java文件對應的字節碼,其中
classes.dex
是程序主包;lib目錄對應源代碼中的libs目錄,包含so文件;
META-INF目錄包含CERT.RSA、CERT.SF、MANIFEST.MF等, 保存了各個資源文件的SHA1值,用於校驗資源文件是否被篡改,從而防止二次打包時資源文件被替換;
res目錄對應源碼的res目錄, 包含各種圖片、xml等;
resources.arsc包含了各個資源文件的映射, 可以理解爲索引, 通過該文件能找到對應的資源文件信息。
APK運行過程
通過ClassLoader
將.dex文件加載到虛擬機中