流程
- 編譯
- DEX
- 打包
- 簽名
- 對齊
對齊的作用
根本目的是幫助操作系統(tǒng)更高效率的根據(jù)請求索引資源,可以減少CPU訪問內存的次數(shù),但是缺點是增加了存儲空間
android 編譯流程:

android-build-flow.jpg
APK包結構
r 文件夾
項目工程中的 res目錄,包括圖片、字符串等等
該目錄下的資源會被映射到R.java文件中
assets 文件夾
文件夾目錄保留工程中assets目錄,其他工程下的、jar包中的assets也會合并到該assets目錄下,該目錄下的資源不會被映射到R.java文件中,訪問的時候需要AssetManager類
lib 文件夾
包含所有的so文件,so目錄的路徑保留原有的路徑
META-INF目錄
信息描述,簽名
所有文件的SHA1-Digest 簽名,防止其他程序篡改apk包中的文件
AndroidManifest文件
用來做組件查找
classes.dex文件
虛擬機執(zhí)行的文件
resources.arsc文件
資源文件索引
D8 R8 和 DEX 的區(qū)別
D8 和 DX 比較
- 編譯速度更快
- 輸出的 .dex 文件更小
- 同時卻能保持相同乃至更出色的應用運行時性能。
- D8通過脫糖支持Java8,開啟android.enableD8.desugaring的話,會影響所有讀寫.class字節(jié)碼的開發(fā)工具,因為會使用JAVA8格式。如果不想.class文件中有JAVA8則可以將android.enableD8.desugaring關閉,則可以將JAVA8的特性轉為JAVA7的特性。
D8脫糖
脫糖合并進D8可以減少編譯時間,優(yōu)化更多代碼,但是字節(jié)碼處理工具必須支持JAVA8
- .class -> desugar -> ... -> D8 -> .DEX
- .class -> [desugar-D8] -> .DEX
Jack編譯器
之前的編譯
- graph LR
- Java_Source-.Javac.->Java_ByteCode
- Java_ByteCode-.dx.->dex
Jack編譯:依賴Java字節(jié)碼的第三方庫在新的編譯器體系下就不能使用了,成本偏大
- graph LR
- Java_Source-.Jack_Compiler.-dex
R8
- R8的流程
- desugaring(脫糖)
- shrinking (壓縮)
- obfuscating(混淆)
- optimizing (優(yōu)化)
- dexing (打包成dex)
- R8包含D8所有功能
- R8新增的功能
- 代碼壓縮:安全地從App及其庫依賴項中刪除未使用的類,字段,方法和屬性。
- 資源壓縮:從打包的App中刪除未使用的資源,包括應用程序庫依賴項中未使用的資源。它與代碼壓縮一起使用,這樣一旦刪除了未使用的代碼,也可以安全地刪除不再引用的資源。
- 代碼混淆:使用簡短無意義的名稱重命名代碼里的類,字段和方法,從而減少DEX文件大小。R8和Proguard 相比,R8 可以更快地縮減代碼,同時改善輸出大小
- 代碼優(yōu)化:刪除未使用的代碼或重寫代碼使其更簡潔。
dex 拆分
refrence
- [Android D8 編譯器 和 R8 工具]https://blog.csdn.net/Mr_dsw/article/details/90141647
- [使用dx將class轉dex總結] http://www.itdecent.cn/p/16efe657ec7e