Android方法數不能超過65K的解決方案

作爲一個Android程序開發猿,如果你還沒遇到Conversion to Dalvik format failed:Unable to execute dex:method ID not in [0,0xffff]:65536這個異常的話,只能說明要麼你是大牛,要麼就是還只停留在碼農的階段。其實這個異常是谷歌限制的放法數不能超過65K的限制,隨着你的程序的不斷擴大,總有一天會遇到,以前我待的公司都是做的外包項目,做完了直接交付,也不維護的,所以基本不會遇到這樣的異常,偶爾遇到,也是採用的最簡單的方法去解決,的確,這樣能通過編譯,但是遺憾的是在2.3的系統的Android手機上直接crash,報INSTALL_FAILED_DEXOPT異常,因爲是外包項目嘛,所以這些手機直接忽略。後來換了家公司,開始做自己的產品,沒有自己的框架,全靠第三方的開源jar包支撐,日積月累,項目工程月來源大,唉,終於,久違的方法數超出的異常出現了,迫於工作壓力,只能尋找合適的方法去解決,最後通過分包機制完美解決,下面一起來分享下這個解決方法,希望對大家能有所幫助,讓你們少走彎路。

原因:

1.一個Dex文件中存儲方法id用的是short類型數據,所以dex中的放法術不能擦後果65k

2.在2.3系統之前虛擬機內存只分配了5M


解決辦法1:(不夠徹底,表面的)

在Project.proterty中配置dex.force.jumbo=true,能編譯通過,但是在2.3的機器上直接crash。


解決辦法2:(徹底,完美)
1.打開項目的build.gradle文件,添加android-support-multidex.jar的以來文件

    compile 'com.android.support:multidex:1.0.0'

2.設置虛擬機堆內存大小,避免編譯期間OOM,一般設置2g夠了

dexOptions {
        javaMaxHeapSize "2g"
    }
3.添加其他配置(multiDexEnabled true)

defaultConfig {
        applicationId "com.tb.demo"
        minSdkVersion 14
        targetSdkVersion 21
        versionCode 67
        versionName "3.1.0"
        // Enabling multidex support.
        multiDexEnabled true
    
4.在Application中做設置

如果你的程序有自定義的Application,那麼可以選擇將你的Application繼承MultiDexApplication,或者在你的Application中添加以下代碼

@Override  
protected void attachBaseContext(Context base) {  
    super.attachBaseContext(base);  
    MultiDex.install(this);  
}  

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package android.support.multidex;

import android.app.Application;
import android.content.Context;
import android.support.multidex.MultiDex;

public class MultiDexApplication extends Application {
    public MultiDexApplication() {
    }

    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
    }
}


配置完成,恭喜你,分包機制已經配置完成,直接編譯即可通過,他將生成2個Dex文件,完美解決65K的限制


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章