1图张、問題描述
在**Android 5.0 **以下的部分機(jī)型中會(huì)出現(xiàn)沒有找到相關(guān)類的錯(cuò)誤赊琳。即:java.lang.NoClassDefFoundError
2跛溉、問題原因:
隨著項(xiàng)目業(yè)務(wù)越來(lái)越多焊切,工程代碼越來(lái)越大,方法也越來(lái)越多芳室。
由于专肪,dexopt
是一個(gè)程序,在應(yīng)用安裝的時(shí)候堪侯,系統(tǒng)會(huì)通過 dexopt
來(lái)優(yōu)化 dex
文件嚎尤,在優(yōu)化過程中 dexopt
采用一個(gè)固定大小的緩沖區(qū)來(lái)存儲(chǔ)應(yīng)用中所有的方法信息,這個(gè)緩沖區(qū)就是 LinearAlloc
伍宦。LinearAlloc
緩沖區(qū)在新版本的android中是 8 MB芽死,或者 16 MB,但是在android2.2
次洼,android2.3
上面只有5mb关贵,當(dāng)您的apk中的方法數(shù)比較多時(shí),盡管它還沒有達(dá)到 65535 的方法數(shù)限制卖毁,但是他的存儲(chǔ)空間可能已經(jīng)超過了 5 MB 坪哄,這種情況下 dexopt
程序就會(huì)報(bào)錯(cuò),從而導(dǎo)致安裝失敗势篡。
但是在部分 Android4.X
的手機(jī)中翩肌,可能安裝過程是正常的,但是在運(yùn)行應(yīng)用過程中禁悠,虛擬機(jī)解析 dex
文件時(shí)念祭,由于單個(gè) dex
中方法數(shù),造成解析過程中丟失部分類碍侦。從而出現(xiàn)上面問題中描述的現(xiàn)象粱坤。
3隶糕、解決方案:
step1:配置build.gradle (app)
注意:
在 android studio 和 gradle 編譯環(huán)境中,如果使用multidex站玄,首先要使用 android sdk build tools 21.1 及以上版本枚驻。
android {
compileSdkVersion 22
buildToolsVersion "23.3.0"
defaultConfig {
minSdkVersion 15
targetSdkVersion 22
// Enabling multidex support. 開關(guān)
multiDexEnabled true
}
dependencies {
// 添加依賴
compile 'com.android.support:multidex:1.1.0'
}
step2:
使用自定義的 Application 繼承 MultiDexApplication 這個(gè)類,或者重寫 Application 的方法 attachBaseContext()
株旷,并調(diào)用 MultiDex.install(this)
;
@Override
protected voidattachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(base);
}
step3:
加入該操作之后出現(xiàn) build 內(nèi)存溢出處理再登,在 android{}
模塊中加入 dexoptions
。
android {
...
dexOptions{ javaMaxHeapSize "4g"}
...
}
4晾剖、Multidex造成的影響:
- 1锉矢、應(yīng)用啟動(dòng)速度會(huì)降低,由于用用啟動(dòng)時(shí)會(huì)加載額外的 dex 文件齿尽,將會(huì)造成啟動(dòng)速度降低沽损,而且有可能會(huì)造成 ANR ,所以盡可能的第二個(gè) dex 不要太大。
- 2循头、由于 dalvik LinearAlloc 的 bug 绵估,這可能會(huì)導(dǎo)致multidex的應(yīng)用無(wú)法在 android4.0 之前的手機(jī)上運(yùn)行。
參考
http://www.reibang.com/p/d2d6e87e5a42
http://www.reibang.com/p/8b4f711da0bb