APK的編譯打包流程:
編譯–>DEX–>打包–>簽名和對齊
image.png
1、編譯
Java編譯器對工程本身的java代碼進行編譯,這些java代碼有三個來源:app的源代碼,由資源文件生成的R文件(aapt工具),以及有aidl文件生成的java接口文件(aidl工具)。產(chǎn)出為.class文件。
①工程的資源文件(res文件夾下的文件),通過AAPT打包成R.java類(資源索引表),以及.arsc資源文件
②如果有aidl,通過aidl工具,打包成java接口類
③把Java文件和aidl.java和R.java編譯成.class文件
2、dex
.class文件和依賴的三方庫文件通過dex工具生成Delvik虛擬機可執(zhí)行的.dex文件,包含了所有的class信息,包括項目自身的class和依賴的class。產(chǎn)出為.dex文件。
dx工具的主要作用是將java字節(jié)碼轉換成Dalvik字節(jié)碼,在此過程中會壓縮常量池,消除一些冗余信息等。
3、打包
apkbuilder工具將.dex文件和編譯后的資源文件生成未經(jīng)簽名對齊的apk文件。這里編譯后的資源文件包括兩部分,一是由aapt編譯產(chǎn)生的編譯后的資源文件,二是依賴的三方庫里的資源文件。產(chǎn)出為未經(jīng)簽名的.apk文件。
4、簽名和對齊
分別由Jarsigner和zipalign對apk文件進行簽名和對齊,生成最終的apk文件。
AAPT
前面講到,apk的打包流程第一步包含AAPT編譯資源文件生成R.java文件,那AAPT又是什么呢
AAPT- Android Asset Packaging Tool
,看這個全稱可以看出,他是android的資源打包工具,
- 輸入:res文件夾所有的資源(layout\drawable\string\array等),asset下的資源,AndroidManifest.xml,Android.jar文件
- 工具: aapt 地址(/your sdk path/build-tools/your build tools version/aapt)
- 輸出:res下的資源都會被編譯成一個資源索引文件resource.arsc以及一個R.java類。asset下的資源不會編譯,?直接壓縮進apk。