Android APP 編譯流程

流程

  1. 編譯
  2. DEX
  3. 打包
  4. 簽名
  5. 對齊

對齊的作用

根本目的是幫助操作系統(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

  1. .class -> desugar -> ... -> D8 -> .DEX
  2. .class -> [desugar-D8] -> .DEX
Jack編譯器

之前的編譯

  1. graph LR
  2. Java_Source-.Javac.->Java_ByteCode
  3. Java_ByteCode-.dx.->dex

Jack編譯:依賴Java字節(jié)碼的第三方庫在新的編譯器體系下就不能使用了,成本偏大

  1. graph LR
  2. Java_Source-.Jack_Compiler.-dex
R8
  • R8的流程
    1. desugaring(脫糖)
    2. shrinking (壓縮)
    3. obfuscating(混淆)
    4. optimizing (優(yōu)化)
    5. dexing (打包成dex)
  • R8包含D8所有功能
  • R8新增的功能
    • 代碼壓縮:安全地從App及其庫依賴項中刪除未使用的類,字段,方法和屬性。
    • 資源壓縮:從打包的App中刪除未使用的資源,包括應用程序庫依賴項中未使用的資源。它與代碼壓縮一起使用,這樣一旦刪除了未使用的代碼,也可以安全地刪除不再引用的資源。
    • 代碼混淆:使用簡短無意義的名稱重命名代碼里的類,字段和方法,從而減少DEX文件大小。R8和Proguard 相比,R8 可以更快地縮減代碼,同時改善輸出大小
    • 代碼優(yōu)化:刪除未使用的代碼或重寫代碼使其更簡潔。
dex 拆分
refrence
  1. [Android D8 編譯器 和 R8 工具]https://blog.csdn.net/Mr_dsw/article/details/90141647
  2. [使用dx將class轉dex總結] http://www.itdecent.cn/p/16efe657ec7e
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容