1. 程式人生 > >徹底解決Android 應用方法數不能超過65K的問題

徹底解決Android 應用方法數不能超過65K的問題

尊重原創 :http://blog.csdn.net/yuanzeyao/article/details/41809423

作為一名Android開發者,相信你對Android方法數不能超過65K的限制應該有所耳聞,隨著應用程式功能不斷的豐富,總有一天你會遇到一個異常:

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

可能有些同學會說,解決這個問題很簡單,我們只需要在Project.proterty中配置一句話就Ok啦,

dex.force.jumbo=true

是的,加入了這句話,確實可以讓你的應用通過編譯,但是在一些2.3系統的機器上很容易出現

INSTALL_FAILED_DEXOPT異常

對於以上兩個異常,我們先來分析一下原因:

1、Android系統中,一個Dex檔案中儲存方法id用的是short型別資料,所以導致你的dex中方法不能超過65k

2、在2.3系統之前,虛擬機器記憶體只分配了5M

知道了原因,我們就來一個個的解決上面的問題,首先對於65k的問題,我們在應用層是無法改變android系統的結構的,所以我們無法將資料型別從short改變為int或者其他型別,也就是說一個dex中的方法數不能超過65k是我們無法逾越的鴻溝,我們只能減少一個dex中的方法數,首先最容易想到的方案就是去掉一些無用的Jar包,以及將一些屬性設定為public,從而可以去掉get/set方法,這種方法只能臨時解決問題,隨著時間的推移,總有一天還是會出現方法數超過65k的,畢竟一個應用一般是在加功能,不會減功能。

下面我來向大家介紹兩種主流的解決方案,一種是以微信為代表的,將一些功能做成外掛,動態載入,另一種方案是以facebook為代表的分包方案,將一個apk中的dex檔案分割成多個dex檔案,然後動態的去載入dex檔案。其實這兩種方案的核心思想是一樣的,外掛是把未來要開發的新功能做成apk和dex動態載入,而分包方案是將已經完成的功能分成多個dex檔案動態載入,其實我個人覺得外掛方案比分包方案更好的解決了65k的問題,因為外掛方案不僅能夠解決65k問題,還能讓我們的應用體積減小,而分包只能解決65k的問題。

關於外掛開發,做成動態載入,我在很早之前一篇文章中就寫過其基本思想,有興趣的同學可以看看

《實現Android 動態載入APK(Fragment or Activity實現)》

http://blog.csdn.net/yuanzeyao/article/details/38565345

下面我們重點介紹分包機制

我們知道一個apk檔案裡面有一個dex檔案,這個dex檔案裡面都是經過優化了的class檔案,所謂分包,就是講一個dex檔案分成多個dex檔案,這裡我們約定一下,第一個dex叫做main.dex,第二個叫做second.dex,通常在分包的時候,我們需要將應用啟動就需要使用的類放入到main.dex中,把不是立馬就需要使用的類放入到second.dex中,對於Android系統,他只會預設載入main.dex的,second.dex對於他來說可能只是一個資原始檔,它是不會主動去載入second.dex,所以我在應用啟動的過程中,我們需要為second.dex建立好一個類載入器,便於我在使用second.dex中的類時,能夠裡面載入該類。

關於如何載入second.dex也有好多做法,用的比較多的主要有一下幾種

1、最簡單的做法就是使用DexClassLoader進行載入,並將該DexClassLoader的父載入器設定為PathClassLoader

2、使用DexClassLoader載入,並將DexClassLoader的父載入器設定成PathClassLoader的父載入器,將PahtClassLoader的父載入器設定成DexClassLoader,仔細品味一下1和2的區別

3、將second.dex的路徑放入到PathClassLoader的載入路徑中

對於第2中方案,在有一種情況下是不能使用的,比如當second.dex通過DexClassLoader載入,但是second.dex中使用了一個類,這個類在main.dex中,這個時候就會丟擲類找不到的異常,所以這種方案只能擁有second.dex不會用到main.dex類的時候

以上說的都是理論,下面我們來實戰一下

我這裡會介紹兩種方案,一種是基於gradle構建Android專案,一種是基於Ant構建Android專案

方案一:基於gradle構建Android專案,並實現分包

環境要求:AndroidStudio0.9以上,gradle外掛0.14.2以上

1、如果你的工程在eclipse中,那麼你需要將該工程匯入到Android中,此時需要你升級adt22以上

2、開啟你工程的build.gradle檔案,檢查gradle外掛是否是0.14.2版本之後,因為0.14.2之後gradle外掛才支援分包


3、開啟工程下某一個Moudle的build.gradle檔案,新增對android-support-multidex.jar的依賴

相關推薦

徹底解決Android 應用方法不能超過65K的問題

尊重原創 :http://blog.csdn.net/yuanzeyao/article/details/41809423作為一名Android開發者,相信你對Android方法數不能超過65K的限制應該有所耳聞,隨著應用程式功能不斷的豐富,總有一天你會遇到一個異常:Conv

徹底解決Android 應用方法不能超過65536的問題

尊重原創 :http://blog.csdn.net/yuanzeyao/article/details/41809423 還可以參考: 作為一名Android開發者,相信你對Android方法數不能超過65536的限制應該有所耳聞,隨著應用程式功能不斷的豐富

解決Android 應用方法不能超過65K的問題

end apk pop override ets col tail -a enable Conversion to Dalvik format failed:Unable toexecute dex: method ID not in [0, 0xffff]: 65

android 方法超過65k解決dex方法超過65536

65k android應用程序方法超限 解決android dex文件方法數過 最近有朋友在問我,為什麽我就加了一個類/一個庫突然跑不起來了。 排查方式: 1、確認你的代碼/引用沒有問題 2、檢查是否是65k問題 今天主要是解決 排查方式2的步驟,這個原因主要是因為你的apk包方法數過大。 現在

安卓應用方法超過64k解決辦法:分割Dex

con 文件 jar extends iter 介紹 安卓 只需要 option 你的安卓項目功能很強大,對接了好多第三方開源庫,項目越做越完善,代碼越敲越爽。可是突然有一天報異常了。 錯誤:The number of method references in a .dex

Android工程方法超過64k,The number of method references in a .dex file cannot exceed 64K.

一個 ref multidex context pre method ips .html conf 最近將一個老的Eclipse項目轉到Android Studio後,用gradle添加了幾個依賴,項目可以make,但是一旦run就報錯 Error:The number

Android 使用android-support-multidex解決Dex超出方法的限制問題,讓你的應用不再爆棚

動態改變 配置 移動 back mis 文件的 文件格式 .info jar包 如有轉載,請聲明出處: 時之沙: http://blog.csdn.net/t12x3456 (來自時之沙的csdn博客) 隨著應用不斷叠代,業務線的擴

android studio:::解決方法超過65536的方法,三步

text app multi 一行代碼 dex ide 解決 andro com 1.在build.gradle(Module: app) 中的defaultConfig{}中添加 multiDexEnabled true 2.在build.gradle(Modul

方法超過限制,Google官方解決方案連結:https://developer.android.com/studio/build/multidex.html

方法數超過限制,Google官方解決方案連結:https://developer.android.com/studio/build/multidex.html 對了,如果參考第三種方案,發現 Multidex.install(this); 這一行程式碼總是報錯,嘗試用這行程式碼: Mu

Android 中配置方法超過 64K 的應用

隨著 Android 平臺的持續成長,Android 應用的大小也在增加。當您的應用及其引用的庫達到特定大小時,您會遇到構建錯誤,指明您的應用已達到 Android 應用構建架構的極限。早期版本的構建系統按如下方式報告這一錯誤: Conversion to Dalvik

解決應用中的Dex檔案方法超過了最大值65536的上限

在android studio的依賴裡面加 compile 'com.android.support:multidex:1.0.1' 再加入,用來增加java堆記憶體大小: dexOptions{ javaMaxHeapSize "4g" } 還要允許分割方法

Android 方法超過64k限制的解決辦法

android { compileSdkVersion COMPILE_SDK_VERSION as int buildToolsVersion BUILD_TOOLS_VERSION

Android 解決65535的限制 使用android-support-multidex解決Dex超出方法的限制問題,讓你的應用不再爆棚

 隨著應用不斷迭代,業務線的擴充套件,應用越來越大(比如集成了各種第三方sdk或者公共支援的jar包,專案耦合性高,重複作用的類越來越多),相信很多人都遇到過如下的錯誤: UNEXPECTED TOP-LEVEL EXCEPTION:   java.lang.Ill

解決安卓中單個dex方法超過65535的方法

ati oid 超過 sta get ble text enabled 方法 1、百度下載 60K-methods.jar包,復制至libs文件夾中,添加到gradle中 2、在build.gradle中的defaultConfig{}下添加 multiDexEnable

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

大型商業性的app,業務越來越多;並且專案中引用了許多的sdk以及公共jar包,導致dex檔案中的方法數超過65536;導致程式不能編譯執行,如何解決? 錯誤截圖: 應用中Dex檔案中的方法數超過了最大值65536的上限,就是應用爆棚. oogle看來也意識到了目前應用方

Android進階之使用multidex(產生多個dex)解決Dex超出方法65535的限制

1 概述 1.1 為什麼要拆包 隨著應用不斷迭代,業務線的擴充套件,應用越來越大(比如集成了各種第三方sdk或者公共支援的jar包,專案耦合性高,重複作用的類越來越多),出現了一個 dex 包裝不下的情況,出現65536問題。 1.2 為什麼方法數不能

簡述Android 解決65536/64K方法限制方案

在Android專案開發中,尤其是開發類似淘寶,京東,微信,直播等大型專案中,由於產品的迭代,業務模組的快速增長,到了一定的規模後難免會遇到65536/64K方法數的問題。 它是個什麼鬼? 這個問題,網上還有其他人說65方法數問題,本質上都市指Andro

徹底解決Android GPS沒法定位這一頑固問題

ive 解決 lan 搜集 final inf 密鑰 基站 問題 大家去網上搜索Android定位location為null沒法定位問題。預計有一大

android studio方法總數超過64K報錯Error:The number of method references in a .dex file cannot exceed 64K.

開發中記錄點滴 1.問題描述 Error:The number of method references in a .dex file cannot exceed 64K. Error:Execution failed for task ':app:transformC

Android方法總數超過64K時(Android Studio)

1. 問題描述 Error:The number of method references in a .dex file cannot exceed 64K. Error:Execution f