原因:
Dalvik可執行文件.dex中的Java方法數引用超過65536,64k的計算方法是65536除以1024,65K的計算方法是65536除以1000,如果方法數超過64k編譯器編譯將無法通過.
解決原理:分包:
但是現在一個大的應用,尤其是集成第三方庫的,很容易超過這個數目,所以Android 5.0 之后的版本谷歌試用了名為ART的虛擬機來代替Dalvik虛擬機,ART支持從APK文件中加載多個.dex文件. 在安裝期間,他會執行一個預編譯操作,對.dex文件編譯成一個個單一的.oat文件,在運行應用時去加載.oat文件,而不是.dex文件
解決方法:
1: 在Module中的bulid.gradle中添加:** multiDexEnabled true**
android { defaultConfig { minSdkVersion 17 targetSdkVersion 25 versionCode 1 versionName "1.0.0.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" multiDexEnabled true }
2:在Module中的bulid.gradle中添加:compile 'com.android.support:multidex:1.0.1'
dependencies { /**第三方依賴庫**/ compile 'com.android.support:multidex:1.0.1' }
3:在的的Application中,onCreate方法里, super.onCreate()方法之前調用:** MultiDex.install(this);**
public class MyApplication extends Application { @Override public void onCreate() { MultiDex.install(this); super.onCreate(); } }
碎碎念:
不建議使用MultiDex Support Library來將APK中單一的dex拆分成多個,從而規避64k方法數限制引起的變異錯誤 ,因為會在大多數情況下降低應用的性能
1.減少不必要的依賴,對于lib的體積,方法數,性能進行考察,選擇合適的庫
2.使用Proguard移除無用的代碼,配置并在Release版本中使能ProGuard,它的壓縮功能通過分析字節碼,能夠檢測并移除沒有使用到的類,字段,方法和屬性,
更多問題加群:584275290