Android 解決方法數 65536 (65k) 限制

weixin_34320159發表於2016-07-27

可能出現的錯誤資訊:

Conversion to Dalvik format failed: Unable to execute dex: method ID not in [0, 0xffff]: 65536

說明:這個方法是谷歌提供的.連結如下:
https://developer.android.com/studio/build/multidex.html

解決步驟:

1.步驟1:

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' }

2.步驟2:

讓應用支援多DEX檔案。在MultiDexApplication JavaDoc中描述了三種可選方法:

1.在AndroidManifest.xml的application中宣告

android.support.multidex.MultiDexApplication;

2.如果你已經有自己的Application類,讓其繼承MultiDexApplication;

3.如果你的Application類已經繼承自其它類,你不想/能修改它,那麼可以重寫attachBaseContext()方法:

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

附言:

Multidex仍有一些限制:

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

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

  3. 同樣因為Dalvik linearAlloc的限制,如果請求大量記憶體可能導致崩潰。Dalvik linearAlloc是一個固定大小的緩衝區。在應用的安裝過程中,系統會執行一個名為dexopt的程式為該應用在當前機型中執行做準備。dexopt使用LinearAlloc來儲存應用的方法資訊。Android 2.2和2.3的緩衝區只有5MB,Android 4.x提高到了8MB或16MB。當方法數量過多導致超出緩衝區大小時,會造成dexopt崩潰。
    Multidex構建工具還不支援指定哪些類必須包含在首個DEX檔案中,因此可能會導致某些類庫(例如某個類庫需要從原生程式碼訪問Java程式碼)無法使用。

相關文章