Android方法數超過65535的解決辦法

在這裏插入圖片描述
歡迎在我的公衆號aserbao給我留言,無償服務!同時,歡迎大家來加入交流討論羣,一起討論Android開發技術!羣二維碼定時在我公衆號更新!
在這裏插入圖片描述

來來來,各位看官,看一看,瞧一瞧,隨便評論點個贊!走過路過千萬不要錯過,之前沒遇到今後一定會遇到,之前遇到了加深一下印象也不錯。

大家好,我是小朱,聽哥一句勸,在開發的時候能自己寫的儘量別用別人的,能用小的包替代的,咱們就不用大包替代。這不,一不小心方法數就超過65535了。😌,如何解決這個問題,且聽我慢慢道來。

首先你開發一段時間過後,你可能會遇到如下異常,沒遇到你今後也會遇到的:

Conversion to Dalvik format failed:
Unable to execute dex: method ID not in [0, 0xffff]: 65536
trouble writing output:
Too many field references: 131000; max is 65536.
You may try using --multi-dex option.

可能還會有其他異常,不一一列舉,但凡出現65535這個數字,八九不離十都是同一個原因造成的,那就是恭喜你:你的方法總數超過65535了!俗稱“64K引用限制”

How解決呢?

在Android 5.0之前的版本Dalvik可執行文件必須使用分包支持。也就是導入multidex包,後面會詳細講解。

注意 :如果您的項目配置時所面向的 Dalvik 可執行文件分包使用的是 minSdkVersion 20 或更低版本,並且您將其部署到運行 Android 4.4(API 級別 20)或更低版本的目標設備上,則 Android Studio 會停用 Instant Run。

在Android5.0及之後的版本,因爲使用ART運行,原生支持從 APK 文件加載多個 DEX 文件。ART 在應用安裝時執行預編譯,掃描 classesN.dex 文件,並將它們編譯成單個 .oat 文件,供 Android 設備執行。因此,如果您的 minSdkVersion 爲 21 或更高值,則不需要 Dalvik 可執行文件分包支持庫。

當minSdkVersion 爲 21 或更高值時,使用Instant Run時,Android Studio 還是會自動將應用配置給Dalvik虛擬機,由於 Instant Run 僅適用於調試版本的應用,您仍需配置發佈構建進行 Dalvik 可執行文件分包,以規避 64K 限制。

說來說去還是得,無論你minSdkVersion的版本多少,只要你超過方法數超過64K,你就得分包,否則你調試不了。區別在於,如果你不分包,一個可以打包運行,一個不行。

How避免65535?

怎麼優化?兩點很重要:

  • 檢查自己的項目第三方包,能不用就不用,能自己寫就自己寫,能用小包代替就用小包,比如Google Guava這種類庫,包含13e3個方法。儘量使用一些小而精簡的庫。
  • 使用代碼壓縮移除不使用的代碼。怎麼各移法呢?簡單來說就是運行ProGuard讓交付的APK中不包含有未使用的代碼。

How to 分包?

既然無法避免,該來的總要來,那麼兄弟,這個異常就要對不住了,我要開始解決你了 。
在這裏插入圖片描述

1. 將multiDexEnabled 設置爲 true

android {
    defaultConfig {
        ...
        minSdkVersion 21 
        targetSdkVersion 28
        multiDexEnabled true
    }
    ...
}

如果您的minSdkVersion 設置爲21及更高,那麼現在就結束了。如果您的 minSdkVersion 設置爲 20 或更低值,那麼不好意思,你還要多走幾步,往下看。

2. 導包

如果您的 minSdkVersion 設置爲 20 或更低值,那麼需要引入multidex包。操作如下:

 android {
    defaultConfig {
        ...
        minSdkVersion 15 
        targetSdkVersion 28
        multiDexEnabled true
    }
    ...
}

dependencies {
  implementation 'com.android.support:multidex:1.0.3'
}

3. 代碼配置

配置有兩種方式:

第一種:繼承MultiDexApplication

public class AserbaoApplication extends MultiDexApplication {
……
}

第二種,在Application的attachBaseContext()方法中聲明:

public class MyApplication extends SomeOtherApplication {
  @Override
  protected void attachBaseContext(Context base) {
     super.attachBaseContext(base);
     MultiDex.install(this);
  }
}

Dalvik 可執行文件分包支持庫的侷限性

  1. 啓動期間在設備數據分區中安裝 DEX 文件的過程相當複雜,如果輔助 DEX 文件較大,可能會導致應用無響應 (ANR) 錯誤。在此情況下,您應該通過 ProGuard 應用代碼壓縮以儘量減小 DEX 文件的大小,並移除未使用的那部分代碼。
  2. 由於存在 Dalvik linearAlloc 錯誤,使用 Dalvik 可執行文件分包的應用可能無法在運行的平臺版本早於 Android 4.0(API 級別 14)的設備上啓動。如果您的目標 API 級別低於 14,請務必針對這些版本的平臺進行測試,因爲您的應用可能會在啓動時或加載特定類羣時出現問題。代碼壓縮可以減少甚至有可能消除這些潛在問題。
  3. 由於存在 Dalvik linearAlloc 限制(,因此,如果使用 Dalvik 可執行文件分包配置的應用發出非常龐大的內存分配請求,則可能會在運行期間發生崩潰。儘管 Android 4.0(API 級別 14)提高了分配限制,但在 Android 5.0(API 級別 21)之前的 Android 版本上,應用仍有可能遭遇這一限制。

參考文章

官方鏈接之-配置方法數超過 64K 的應用

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