天天看點

用android-support-multidex解決Dex超出方法數的限制問題

大型商業性的app,業務越來越多;并且項目中引用了許多的sdk以及公共jar包,導緻dex檔案中的方法數超過65536;導緻程式不能編譯運作,如何解決?

錯誤截圖:

用android-support-multidex解決Dex超出方法數的限制問題

應用中Dex檔案中的方法數超過了最大值65536的上限,就是應用爆棚.

oogle看來也意識到了目前應用方法數爆棚的問題, 目前在已經在API 21中提供了通用的解決方案,那就是android-support-multidex.jar. 這個jar包最低可以支援到API 4的版本(Android L及以上版本會預設支援mutidex).

一個DEX檔案中method個數采用使用原生類型short來索引檔案中的方法,也就是4個位元組共計最多表達65536個method,field/class的個數也均有此限制。對于DEX檔案,則是将工程所需全部class檔案合并且壓縮到一個DEX檔案期間,也就是Android打包的DEX過程中, 單個DEX檔案可被引用的方法總數被限制為65536。(包括第三方jar包)

分割Dex,多工程: 把所需要的.class檔案或者是Jar檔案和一些源碼一起編譯生成一個Jar檔案。然後使用Android SDK提供的dx工具把Jar檔案轉成Dex檔案。

具體內建:

第一步:

dependencies {
        compile 'com.android.support:multidex:1.0.1'
    }
           

第二步:

從sdk\extras\android\support\multidex\library\libs 目錄将android-support-multidex.jar導入工程中

第三步:

如果你的工程中已經含有Application類,那麼讓它繼承android.support.multidex.MultiDexApplication類,

如果你的Application已經繼承了其他類并且不想做改動,那麼還有另外一種使用方式,覆寫attachBaseContext()方法: 例如:

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

第四步:在build.gradle檔案的defaultConfig的節點下 添加一行代碼:

android {
    defaultConfig {
        applicationId "com.xunpige.nengwu"
        minSdkVersion 14
        targetSdkVersion 21

        multiDexEnabled true 
    }
}
           

注意事項:

對于dex 的--multi-dex 選項設定與預編譯的library工程有沖突,是以如果你的應用中包含引用的lirary工程,需要将預編譯設定為false:

android {
    dexOptions {
        javaMaxHeapSize "4g"
        preDexLibraries = false
    }
}
           

在 dexOptions 中有一個字段用來增加java堆記憶體大小.

DEX檔案安裝到裝置的過程非常複雜,如果第二個DEX檔案太大,可能導緻應用無響應。此時應該使用ProGuard減小DEX檔案的大小。

由于Dalvik linearAlloc的Bug,應用可能無法在Android 4.0之前的版本啟動,如果你的應用要支援這些版本就要多執行測試。

繼續閱讀