APK 的編譯打包流程

打包所需要工具:

包括aapt.exe aapt2.exe aidl.exe dx.bat等工具。
1.打包資源文件
AAPT,全稱Android Asset Packaging Tool,所以這個構建工具就是用來打包資源文件的。
資源文件包括:圖片,res目錄下的xml文件,AndroidManifest.xml文件;
處理資源文件主要包括兩步:
1、編譯:將資源文件編譯為二進制格式。
把所有的Android資源文件進行解析,生成擴展名為.flat的二進制文件。比如是png圖片,那么就會被壓縮處理,采用.png.flat的擴展名。
2、鏈接:合并所有已編譯的文件并打包到一個軟件包中。
首先,這一步會生成輔助文件,比如R.java(R文件),R文件大家應該都比較熟悉,就是一個資源索引文件,我們平時引用也都是通過R.的方式引用資源id。
最后,會將R文件和之前的二進制文件進行打包,打包到一個APK壓縮包(沒有dex文件、沒有簽名)。
2.處理.aidl file
.aidl(Android Interface Description Language)文件需要通過 aidl 工具轉換成編譯器能夠處理的 Java 接口文件。
3.編譯java文件
用到的工具就是大家熟知的javac,通過它將java文件編譯成.class文件。
4.生成dex文件
因為.class 并不是 Android 系統(tǒng)所能識別的格式,所以還需要通過 dex 工具將它們轉化為相應的 Dalvik 字節(jié)碼(包含壓縮常量池以及清除冗余信息等工作)。這個過程中還會加入應用所依賴的所有 “第三方庫”
再談談這三個工具(dx/r8/d8)的區(qū)別:
dx是最早的轉換工具,用于轉換class文件為dex文件。
Android Studio 3.1之后,引入了D8編譯器和 R8 工具。
5.生成APK包
這一步就是生成APK文件,將manifest文件、resources文件、dex文件、assets文件等等打包成一個壓縮包,也就是apk文件。通過apkbuilder等工具打包成apk文件。
6.簽名
在生成APK文件之后,必須對該apk文件進行簽名,否則無法被安裝。
之前大家比較熟知的簽名工具是JDK提供的jarsigner,而apksigner是Google專門為Android提供的簽名和簽證工具。目前簽名類型有V1、V2、V3、V4簽名。
問題:
APK 簽名:v1 v2 v3 v4簽名有什么區(qū)別?
總結:
v1 簽名實際上就是 JAR 簽名的方案,它不會保護 APK 內(nèi)的所有問題,存在安全和效率問題
v2 簽名是一種全文件簽名方案,增加了 APK 簽名塊(APK Signing Block),但仍無法解決更換簽名的問題。但目前主流仍是v2簽名。
v3 簽名是 v2 的升級版,也被稱為 v2+。在 V2 插入的簽名塊(Apk Signature Block V2)中,又添加了一個新快(Attr 塊),它使用鏈表存儲了所有的簽名信息,驗證時就像 CA 證書的證明過程。只要舊簽名證書在手,我們就可以通過它在新的 APK 文件中,更改簽名。
v4 簽名是為了 增量安裝 技術而產(chǎn)生的一種新的簽名方案。
參考:https://cloud.tencent.com/developer/article/2086637
為什么 XML 資源文件要從文本格式編譯成二進制格式?
1、空間占用更小:因為所有 XML 元素的標簽、屬性名稱、屬性值和內(nèi)容所涉及到的字符串都會被統(tǒng)一收集到一個字符串資源池中,并且會去重。有了這個字符串資源池,原來使用字符串的地方就會被替換成一個索引到字符串資源池的整數(shù)值,從而可以減少文件的大小。
2、解析效率更高:二進制格式的 XML 文件解析速度更快。這是由于二進制格式的 XML 元素里面不再包含有字符串值,因此就避免了進行字符串解析,從而提高了解析效率。