歡迎在我的公衆號aserbao給我留言,無償服務!同時,歡迎大家來加入交流討論羣,一起討論Android開發技術!羣二維碼定時在我公衆號更新!
來來來,各位看官,看一看,瞧一瞧,隨便評論點個贊!走過路過千萬不要錯過,之前沒遇到今後一定會遇到,之前遇到了加深一下印象也不錯。
大家好,我是小朱,聽哥一句勸,在開發的時候能自己寫的儘量別用別人的,能用小的包替代的,咱們就不用大包替代。這不,一不小心方法數就超過65535了。😌,如何解決這個問題,且聽我慢慢道來。
首先你開發一段時間過後,你可能會遇到如下異常,沒遇到你今後也會遇到的:
Conversion to Dalvik format failed:
Unable to execute dex: method ID not in [0, 0xffff]: 65536
trouble writing output:
Too many field references: 131000; max is 65536.
You may try using --multi-dex option.
可能還會有其他異常,不一一列舉,但凡出現65535這個數字,八九不離十都是同一個原因造成的,那就是恭喜你:你的方法總數超過65535了!俗稱“64K引用限制”
How解決呢?
在Android 5.0之前的版本Dalvik可執行文件必須使用分包支持。也就是導入multidex包,後面會詳細講解。
注意 :如果您的項目配置時所面向的 Dalvik 可執行文件分包使用的是 minSdkVersion 20 或更低版本,並且您將其部署到運行 Android 4.4(API 級別 20)或更低版本的目標設備上,則 Android Studio 會停用 Instant Run。
在Android5.0及之後的版本,因爲使用ART運行,原生支持從 APK 文件加載多個 DEX 文件。ART 在應用安裝時執行預編譯,掃描 classesN.dex 文件,並將它們編譯成單個 .oat 文件,供 Android 設備執行。因此,如果您的 minSdkVersion 爲 21 或更高值,則不需要 Dalvik 可執行文件分包支持庫。
當minSdkVersion 爲 21 或更高值時,使用Instant Run時,Android Studio 還是會自動將應用配置給Dalvik虛擬機,由於 Instant Run 僅適用於調試版本的應用,您仍需配置發佈構建進行 Dalvik 可執行文件分包,以規避 64K 限制。
說來說去還是得,無論你minSdkVersion的版本多少,只要你超過方法數超過64K,你就得分包,否則你調試不了。區別在於,如果你不分包,一個可以打包運行,一個不行。
How避免65535?
怎麼優化?兩點很重要:
- 檢查自己的項目第三方包,能不用就不用,能自己寫就自己寫,能用小包代替就用小包,比如Google Guava這種類庫,包含13e3個方法。儘量使用一些小而精簡的庫。
- 使用代碼壓縮移除不使用的代碼。怎麼各移法呢?簡單來說就是運行ProGuard讓交付的APK中不包含有未使用的代碼。
How to 分包?
既然無法避免,該來的總要來,那麼兄弟,這個異常就要對不住了,我要開始解決你了 。
1. 將multiDexEnabled 設置爲 true
android {
defaultConfig {
...
minSdkVersion 21
targetSdkVersion 28
multiDexEnabled true
}
...
}
如果您的minSdkVersion 設置爲21及更高,那麼現在就結束了。如果您的 minSdkVersion 設置爲 20 或更低值,那麼不好意思,你還要多走幾步,往下看。
2. 導包
如果您的 minSdkVersion 設置爲 20 或更低值,那麼需要引入multidex包。操作如下:
android {
defaultConfig {
...
minSdkVersion 15
targetSdkVersion 28
multiDexEnabled true
}
...
}
dependencies {
implementation 'com.android.support:multidex:1.0.3'
}
3. 代碼配置
配置有兩種方式:
第一種:繼承MultiDexApplication
public class AserbaoApplication extends MultiDexApplication {
……
}
第二種,在Application的attachBaseContext()方法中聲明:
public class MyApplication extends SomeOtherApplication {
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
}
Dalvik 可執行文件分包支持庫的侷限性
- 啓動期間在設備數據分區中安裝 DEX 文件的過程相當複雜,如果輔助 DEX 文件較大,可能會導致應用無響應 (ANR) 錯誤。在此情況下,您應該通過 ProGuard 應用代碼壓縮以儘量減小 DEX 文件的大小,並移除未使用的那部分代碼。
- 由於存在 Dalvik linearAlloc 錯誤,使用 Dalvik 可執行文件分包的應用可能無法在運行的平臺版本早於 Android 4.0(API 級別 14)的設備上啓動。如果您的目標 API 級別低於 14,請務必針對這些版本的平臺進行測試,因爲您的應用可能會在啓動時或加載特定類羣時出現問題。代碼壓縮可以減少甚至有可能消除這些潛在問題。
- 由於存在 Dalvik linearAlloc 限制(,因此,如果使用 Dalvik 可執行文件分包配置的應用發出非常龐大的內存分配請求,則可能會在運行期間發生崩潰。儘管 Android 4.0(API 級別 14)提高了分配限制,但在 Android 5.0(API 級別 21)之前的 Android 版本上,應用仍有可能遭遇這一限制。