關(guān)于 64K 引用限制
是指單個(gè)DEX文件內(nèi)可引用的方法總數(shù)不超過(guò)65,536
,即64 X 1024
豹绪,所以稱為64K引用限制
逻翁。
可執(zhí)行文件分包支持
Android5.0(21)后的ART原生支持從 APK 文件加載多個(gè) DEX 文件玫膀,所以只要minSdkVersion
為21或更高浊吏,就不需要 Dalvik 可執(zhí)行文件分包支持庫(kù)。5.0之前的系統(tǒng)是需要Dalvik 可執(zhí)行文件分包支持庫(kù)的帆焕。
規(guī)避 64K 限制的方法
- 檢查您的應(yīng)用的直接和傳遞依賴項(xiàng)
不要僅僅為了使用依賴庫(kù)的幾個(gè)方法惭婿,就引入依賴庫(kù)。 - 通過(guò) ProGuard 移除未使用的代碼
使用混淆的壓縮功能,移除未使用到的代碼财饥。
配置Dalvik 可執(zhí)行文件分包
multiDexEnabled true
compile 'com.android.support:multidex:1.0.1'
Multidex.install(this);
聲明主 DEX 文件中需要的類
如果出現(xiàn) java.lang.NoClassDefFoundError
换吧,使用multiDexKeepFile
或multiDexKeepProguard
把該類添加到主DEX文件。
優(yōu)化開(kāi)發(fā)構(gòu)建中的 Dalvik 可執(zhí)行文件分包
Dalvik 可執(zhí)行文件分包配置會(huì)大幅增加構(gòu)建處理時(shí)間钥星,因?yàn)橐獩Q定哪些類放在主DEX式散,哪些類放在鋪DEX是非常復(fù)雜的,所以非常耗時(shí)打颤。
可以利用productFlavors
來(lái)搞一個(gè)開(kāi)發(fā)定制和發(fā)布定制,對(duì)于開(kāi)發(fā)定制漓滔,將minSdkVersion
設(shè)置為 21编饺,這樣開(kāi)發(fā)的時(shí)候構(gòu)造將更快。
以下是配置示例:
android {
defaultConfig {
...
multiDexEnabled true
}
productFlavors {
dev {
// Enable pre-dexing to produce an APK that can be tested on
// Android 5.0+ without the time-consuming DEX build processes.
minSdkVersion 21
}
prod {
// The actual minSdkVersion for the production version.
minSdkVersion 14
}
}
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'),
'proguard-rules.pro'
}
}
}
dependencies {
compile 'com.android.support:multidex:1.0.1'
}
您完成此配置變更后响驴,可以為增量式構(gòu)建使用應(yīng)用的 devDebug 變體透且,后者集 dev 產(chǎn)品定制與 debug 構(gòu)建類型的屬性于一身。這將創(chuàng)建已啟用 Dalvik 可執(zhí)行文件分包且禁用 proguard 的可調(diào)試應(yīng)用(因?yàn)?minifyEnabled 默認(rèn)為 false)豁鲤。這些設(shè)置會(huì)使適用于 Gradle 的 Android 插件執(zhí)行以下操作:
- 執(zhí)行 pre-dexing:將每個(gè)應(yīng)用模塊和每個(gè)依賴項(xiàng)構(gòu)建為單獨(dú)的 DEX 文件秽誊。
- 將每個(gè) DEX 文件加入 APK,并且不做任何修改(不執(zhí)行代碼壓縮)琳骡。
- 最重要的是锅论,模塊 DEX 文件不執(zhí)行合并操作,因此可以避免為確定主 DEX 文件的內(nèi)容而進(jìn)行長(zhǎng)時(shí)間的計(jì)算楣号。
這些設(shè)置的好處是最易,可以進(jìn)行快速的增量式構(gòu)建,因?yàn)橹挥行薷倪^(guò)的模塊的 DEX 文件才會(huì)在后續(xù)構(gòu)建期間重新計(jì)算并重新打包炫狱。但是藻懒,這些構(gòu)建的 APK 只能用于在 Android 5.0 設(shè)備上進(jìn)行測(cè)試。不過(guò)视译,由于是以定制形式實(shí)現(xiàn)配置嬉荆,您保留了使用與發(fā)布相適的最低 API 級(jí)別和 ProGuard 代碼壓縮執(zhí)行正常構(gòu)建的能力。