做android開發的,或多或少都應該聽說過方法數65535的限制,我這原先沒注意過,一直認為寫的幾個小程序不太可能超過, 最新嘗試Rx, 把RxJava,RxAndroid,RxBinding一系列包導入后,AS就不干活了,一度害的我找了半天原因,還以為導入的出問題了,最后才發現是這個原因,順便找了下解決辦法, 記錄下
About the 64K Reference Limit
產生的原因,按照文檔的說法是, 在 android的app中,所有的代碼,都會被打包成一個Dex文件,用于給Dalvik虛擬機執行, 而Dalvik設計時,限制了單個Dex文件 最多包含65535個方法(包含framework,library的方法); 而65535=64*1024, 就被叫做"64K reference limit"
查了下具體原因, 好像是 在android啟動app時,有一步對Dex優化, 這個過程有個叫 DexOpt的工具來實現, DexOpt在第一次加載Dex時執行,會生成一個ODEX文件, 即Optimised Dex; ODEX的效率會比直接執行Dex的效率高很多, 但是DexOpt有一個問題, DexOpt會把所有類的方法id進行檢索,存在一個鏈表中間, 而鏈表的長度是用short類型表示, 從而導致方法id的數目不能超過65535;
而android給出的解決辦法就是,生成多個dex文件
解決辦法
在api 21中, 提供了一個官方的解決辦法 multidex support library
集成方法也很簡單,就兩步
- 修改gradle配置, 導入mutidex的依賴, 并且允許mutildex
- 如果工程又Application類, 將Application改為繼承android.support.multidex.MultiDexApplication類, 如果Application類無法改或者不想該繼承, 則可以重寫attachBaseContext(),并調用下MultiDex.install(this)
gradle配置
android {
compileSdkVersion 21
buildToolsVersion "21.1.0"
defaultConfig {
...
minSdkVersion 14
targetSdkVersion 21
...
// Enabling multidex support.
multiDexEnabled true
}
...
}
dependencies {
compile 'com.android.support:multidex:1.0.0'
}
application
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
[參考]
https://developer.android.com/studio/build/multidex.html
http://blog.csdn.net/t12x3456/article/details/40837287