java.lang.IllegalArgumentException: method ID not in [0, 0xffff]: 65536 java
你的應用中的Dex 文件方法數超過了最大值65536的上限,簡單來講,應用爆棚了.android
那麼讓咱們看一下爲何會引發這種錯誤:git
在Android系統中,一個App的全部代碼都在一個Dex文件裏面。Dex是一個相似Jar的存儲了多有Java編譯字節碼的歸檔文件。由於Android系統使用Dalvik虛擬機,因此須要把使用Java Compiler編譯以後的class文件轉換成Dalvik可以執行的class文件。這裏須要強調的是,Dex和Jar同樣是一個歸檔文件,裏面仍然是Java代碼對應的字節碼文件。當Android系統啓動一個應用的時候,有一步是對Dex進行優化,這個過程有一個專門的工具來處理,叫DexOpt。DexOpt的執行過程是在第一次加載Dex文件的時候執行的。這個過程會生成一個ODEX文件,即Optimised Dex。執行ODex的效率會比直接執行Dex文件的效率要高不少。可是在早期的Android系統中,DexOpt有一個問題,也就是這篇文章想要說明並解決的問題。DexOpt會把每個類的方法id檢索起來,存在一個鏈表結構裏面。可是這個鏈表的長度是用一個short類型來保存的,致使了方法id的數目不可以超過65536個。當一個項目足夠大的時候,顯然這個方法數的上限是不夠的。儘管在新版本的Android系統中,DexOpt修復了這個問題,可是咱們仍然須要對低版本的Android系統作兼容.github
目前比較經常使用的方法:(1) 應用插件化,好比使用我正在參與開發的插件化框架 : https://github.com/singwhatiwanna/dynamic-load-apk ,若是有建議或者相關的問題,歡迎到Github上積極參與. (2) 分割Dex,多工程: 把所須要的.class文件或者是Jar文件和一些源碼一塊兒編譯生成一個Jar文件。而後使用Android SDK提供的dx工具把Jar文件轉成Dex文件。咱們能夠提早對它進行ODex操做,讓它在被DexClassLoader加載的時候,跳過DexOpt的部分工做,從而加快加載的過程. 這兩種方法並不衝突,插件化除了解決應用爆棚,還有不少其餘的優勢,能夠看我以前的文章,再也不復述.
web
固然,Google看來也意識到了目前應用方法數爆棚的問題, 目前在已經在API 21中提供了通用的解決方案,那就是android-support-multidex.jar. 這個jar包最低能夠支持到API 4的版本(Android L及以上版本會默認支持mutidex).框架
以上內容轉載自http://blog.csdn.net/t12x3456/article/details/40837287,而且博客中講解了使用androidstudio開發android時,應用android-support-multidex.jar,配置build.gradle文件來解決方法數超限。eclipse
因爲如今不少還在使用eclipse,因此也試着下載eclipse的gradle插件來解決方法數超限問題,目前仍未成功。可是跳過gradle配置文件來看本質,其實就是將項目中一個dex文件分紅了多個dex文件,而後在安裝程序運行時class.dex中Application會去加載其餘dex文件。由此能夠設想將android項目中的部分jar包打包成dex文件,並命名爲classes2.dex,而後放入項目中,在打包時會一併打入apk文件,而打包爲classes2.dex的jar包則使用編譯依賴到工程中(例如android.jar)。具體作法是:ide
一、先將引用的jar包合併打包爲dex文件,並命名爲classes2.dex工具
合併jar : 手動合併:將jar包解壓放入同一文件夾,將此文件夾命名爲.jargradle
使用ant合併:須要配置ant環境,而後新建build.xml文件(下面是xml內容)
命令行輸入:ant -buildfile 路徑\build.xml
<?xml version="1.0" encoding="utf-8"?>
<project name="b" basedir="E:\libs" default="makeSuperJar">
<target name="makeSuperJar" description="description">
<jar destfile="all.jar">
<zipfileset src="activation.jar"/>
<zipfileset src="additionnal.jar"/>
<zipfileset src="alipaysdk.jar"/>
</jar>
</target>
</project>
而後將合併後的jar經過sdk中的dx命令轉爲dex文件
注:Application 中的靜態全局變量會比MutiDex的 instal()方法優先加載,因此建議避免在 Application類中使用引用classes2.dex文件的靜態變量
二、將classes2.dex文件複製到你主工程的src目錄下,這樣在打包時會一併打入apk中。
三、將步驟1中的合併jar文件依照android,jar方式引入,這樣在打包時就不會打入apk
經過以上三步就能夠解決eclipse中問題:Unable to execute dex: method ID not in [0, 0xffff]: 65536
另:若是已使用androidstudio解決以上問題,則能夠將apk文件解壓,將classes2.dex、classes3.dex....文件及它們的反編譯文件應用與項目中,至關於上面的步驟1.