Android開發 解決方法數越界問題

2021-07-24 17:29:21 字數 3545 閱讀 3973

0.

前言

因為單個

dex檔案能夠包含的最大方法總數為

65536,

通常apk

包含乙個

dex檔案,因此

android

應用的方法總數不能超過這個數量,這包括

android

框架、第三方類庫和你自己開發的**

。隨著第三方類庫的加入,方法數就會迅速膨脹。直到遇見下面這個錯誤:

com.android.dex.dexindexoverflowexception: method id not in [0, 0xffff]: 65536

1.引入multidex

2014

年google

正式提出

multidex

為解決此問題的官方方案,即

使用gradle

構建多dex

應用。android 5.0之前需要引入extras/android/support/multidex/library/libs/android-support-multidex.jar, 5.0以後預設支援了multidex,所以在

bulid tool21.1以及以上版本

配置multidex是一件容易的事情。

1.1    

修改gradle

配置檔案

android 

...}

並在

dependencies

中新增multidex

的依賴:

dependencies

1.2    

在**中加入支援

multidex

的功能

根據的建議,共有三種可選方法:(1

)在manifest.xml的節點

中宣告android:name=」」

。(2)如果你已經有自己的類,讓

類繼承;(3

)如果你不想讓你的

類去繼承

,那麼可以選擇重寫

attachbasecontext()

方法:

@override 

protected void attachbasecontext(context base)

這樣當你的應用

方法數超過

65k就會生成兩個或更多

dex檔案

打入apk

包。

1.3   

自定義主

dex中必須要包含的類

如果有需求必須把某些類打入主

dex檔案,可以

自行配置乙個

maindexlist.txt

檔案置於

目錄下,並在

txt檔案內標明自定義想要被打入主

dex檔案的類,最後別忘了

multidex

的jar

包中有9

個類必須被打入主

dex檔案。

maindexlist.txt

檔案如下所示:

//自定義類

//jar包中的9個類

android/support/multidex/buildconfig.class

android/support/multidex/multidex$v14.class

android/support/multidex/multidex$v19.class

android/support/multidex/multidex$v4.class

android/support/multidex/multidex.class

android/support/multidex/multidexextractor$1.class

android/support/multidex/multidexextractor.class

android/support/multidex/ziputil$centraldirectory.class

android/support/multidex/ziputil.class

最後在gradle

中加入afterevaluate節點

進行如下配置即可:

afterevaluate .each   

dx.additionalparameters += '--multi-dex' //表示方法數越界生成多個dex

dx.additionalparameters += '--main-dex-list=' + listfile //類列表,這裡即txt檔案路徑

dx.additionalparameters += '--minimal-main-dex' //表示只有main-dex-list指定的類會被置於主dex

} }

2     

總結(1

)方法數自己想辦法

能減少就儘量減少

,實在不行就使用

multidex

方案,multidex

解決方法數越界

容易且高效

,但是不可避免的是

額外的dex

檔案會降低應用啟動速度。(

2)在應用安裝過程中系統會執行乙個名為

dexopt

的程式來優化

dex檔案

,dexopt

使用linearalloc

緩衝區來儲存應用的方法資訊

。android 2.x中該

緩衝區只有

5mb,

4.x提高到了

8mb或

16mb

。當方法數量過多(甚至不需要超過

65k)時,可能會超過緩衝區容量限制而

報錯。因此

multidex

方案maybe

會在4.0

以前的手機上失效。但是使用該方案產生很多個

dex檔案,緩衝區超過

16mb

一樣會在

4.0以後的手機上崩潰。所以在

4.0以前的手機上需要做相容性測試,

4.0以後的手機上也不能因為有了

multidex

方案而過於放縱

~3    5.0以後

從android5.0開始,使用art虛擬機器代替dalvik虛擬機器,art虛擬機器在應用安裝期間,會執行乙個預編譯的操作,掃瞄apk中所有的dex檔案並把他們編譯成乙個單一的.oat檔案,然後在應用執行的時候直接去載入這個.oat檔案,而不是乙個個的去載入.dex檔案。

Android中文亂碼解決方法

android中文亂碼解決方法 在手機與pc之間進行socket或http通訊時,常常會出現中文亂碼問題,其主要原因在於手機端字元編碼預設為utf 8,而伺服器pc端預設為gbk或gb2312。手機到pc的資訊編碼傳遞 接收 解碼顯示的過程為 手機端以utf 8編碼資訊 包括漢字 寫入socket輸...

Android滑動衝突解決方法

dispatchtouchevent ev 偽 public boolean dispatchtouchevent motionevent ev else return consume 1.外部攔截法 重寫父view的oninterceptouchevent override public bool...

android 編譯卡死解決方法

編譯到這裡,卡著不動時 generated files list out target product k79v1 64 obj ptgen mt6779 android scatter.txt out target product k79v1 64 obj ptgen mt6779 android...