Android D8 DEX 編譯器
Android Studio 3.1(++) 版本中,將 D8 作為新版本開發(fā)工具默認(rèn)的 Dex 編譯器。那么什么是 D8 呢,D8 與之前的 Dex 打包器有何區(qū)別呢?
安卓項(xiàng)目在打包生成 Apk 安裝文件的過程中,最重要的一步便是將我們所寫的 java 代碼編譯過成 .class 字節(jié)文件再打包轉(zhuǎn)化成一個(gè)或多個(gè) .dex 格式的代碼壓縮文件。這種 dex 文件便是 Android 虛擬機(jī)所能識別、解析并運(yùn)行的程序。
Google 一直在致力于提升 Dex 文件的編譯和運(yùn)行優(yōu)化工作,并開發(fā)出稱之為下一代 dex 編譯器:D8。其實(shí)早在 AS 3.0 Beta 版本中,Google 已經(jīng)引入 D8 的測試使用。直到當(dāng)前 3.1 新版本的發(fā)布,才正式將其作為默認(rèn) Dex 編譯器。
Android Studio 3.1 版本起 gradle 默認(rèn)采用 D8 進(jìn)行編譯, AS 3.1之前版本可以采用 android.enableD8=true 來開啟 D8 編譯,如 3.1 版本或后續(xù)版本禁止 D8 編譯,可以通過在 android.enableD8=false 來禁止 D8
*R8
Android enableAapt2
上線前產(chǎn)品要求替換 啟動(dòng)頁圖片,這是甩過來一張 jpg 格式的圖片,由于整個(gè)工程都是采用 png 格式,所以就在 AS 中動(dòng)態(tài)的修改了圖片的的后綴名稱, 這時(shí)再去編譯就會(huì)甩一個(gè)異常信息給你
Error: java.util.concurrent.ExecutionException: com.android.builder.internal.aapt.v2.Aapt2Exception: AAPT2 error: check logs for details
這是需要在 gradle.properties 文件中申明
android.enableAapt2=false
或者在 build.gradle 文件中 buildTypes 節(jié)點(diǎn)中添加
aaptOptions.cruncherEnabled = false
aaptOptions.useNewCruncher = false
禁止 Gradle 檢查 png 的合法性
*stackoverflow stackoverflow
android multi dex 64k
隨著產(chǎn)品的不斷完善,代碼量的不斷增加,最后在打包時(shí) android multi dex 64k 方法數(shù)限制就映入眼前了, 關(guān)于解決方法 網(wǎng)上有很多做法,這里列出 Google 官方對 64K 限制的解決方法
*Google 官方對 dex 64k 介紹 {"自備梯子"}
當(dāng)然可以添加混淆來剔除無用的函數(shù),也可以通過 dexOptions 來設(shè)置
dexOptions {
javaMaxHeapSize "2g"
additionalParameters += '--multi-dex'
additionalParameters += '--set-max-idx-number=62000'
additionalParameters += '--minimal-main-dex'
}
// 方法超出后生成多個(gè) dex 文件
additionalParameters += '--multi-dex'
// 改變 dex 方法數(shù)上限 這里設(shè)置 62000
additionalParameters += '--set-max-idx-number=62000'
// -main-dex-list指定的所有class會(huì)打包到主dex中
{
這里也可以通過 multidex-config 文件 keep 某一個(gè)類文件到主 dex 文件中
如: multiDexKeepProguard file('multidex-config.txt')
}
additionalParameters += '--minimal-main-dex'
這里可以采用 useDexArchive 來禁用增量dexing
如:
android.useDexArchive=false
最后可以使用 FaceBook redex 來進(jìn)行壓縮, 關(guān)于 redex 優(yōu)化 facebook 文檔上有詳細(xì)的介紹