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...