解決Android單個dex檔案不能超過65535個方法問題

來源:互聯網
上載者:User

標籤:runtime   start   index   otf   sed   限制   oid   還需要   找不到   

一、找坑:Google規定單個dex檔案中的方法不能超過65536的限制

我們編寫項目過程中在工程的lib檔案夾下引用的第三方外掛程式jar包太多或者項目過大,編譯運行時就有可能報出com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536錯誤。看到這個錯誤說明你的方法加起來已經超過了65536這個數目。但是Google規定單個dex檔案中的方法不能超過65536的限制。

如所示,Android Studio 中的Message顯示了錯誤

這裡是具體的錯誤碼:

Error:Execution failed for task ‘:app:transformClassesWithDexForDebug‘.  > com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536  

遇到這個坑的時候找了半天的jar包重複,也是一時糊塗,吸取教訓

好了,錯誤已經找到我們來解決問題,坑總是要填的。

二、填坑

有網友說在module的build.gradle檔案中添加依據話就解決了  :

  defaultConfig {        applicationId "com.xxx.xxx"        minSdkVersion 18        targetSdkVersion 25        versionCode 1        versionName "1.0"        multiDexEnabled true    }

multiDexEnabled true

運行編譯後你可能沒發現問題,但是有些情況下APP直接就蹦了,坑還是好多啊

我這裡就跳進來了,竟然報了一堆的錯,如下是錯誤提示的error

java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.xxx.xxx/com.xxx.xxx.ui.actmain.MainAct}: java.lang.ClassNotFoundException: Didn‘t find class "com.xxx.xxx.ui.actmain.MainAct" on path: DexPathList[[zip file "/data/app/com.xiaodongwa.vronline-2.apk"],nativeLibraryDirectories=[/data/app-lib/com.xxx.xxx-2, /vendor/lib, /system/lib]]     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2190)     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2313)     at android.app.ActivityThread.access$1100(ActivityThread.java:141)     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1238)     at android.os.Handler.dispatchMessage(Handler.java:102)     at android.os.Looper.loop(Looper.java:136)     at android.app.ActivityThread.main(ActivityThread.java:5336)     at java.lang.reflect.Method.invokeNative(Native Method)     at java.lang.reflect.Method.invoke(Method.java:515)     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:871)     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:687)     at dalvik.system.NativeStart.main(Native Method)  Caused by: java.lang.ClassNotFoundException: Didn‘t find class "com.xxx.xxx.ui.actmain.MainAct" on path: DexPathList[[zip file "/data/app/com.xxx.xxx-2.apk"],nativeLibraryDirectories=[/data/app-lib/com.xxx.xxx-2, /vendor/lib, /system/lib]]     at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)     at java.lang.ClassLoader.loadClass(ClassLoader.java:497)     at java.lang.ClassLoader.loadClass(ClassLoader.java:457)     at android.app.Instrumentation.newActivity(Instrumentation.java:1064)     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2181)     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2313)      at android.app.ActivityThread.access$1100(ActivityThread.java:141)      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1238)      at android.os.Handler.dispatchMessage(Handler.java:102)      at android.os.Looper.loop(Looper.java:136)      at android.app.ActivityThread.main(ActivityThread.java:5336)      at java.lang.reflect.Method.invokeNative(Native Method)      at java.lang.reflect.Method.invoke(Method.java:515)      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:871)      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:687)      at dalvik.system.NativeStart.main(Native Method) 

看到這一片紅瞬間就崩潰了,還以為就加依據代碼就夠了,看來不是,一片血海中找到了關鍵區段

ClassNotFoundException: Didn‘t find class "com.xxx.xxx.ui.actmain.MainAct" on path: DexPathList[[zip file "/data/app/com.xxx.xxx-2.apk"],nativeLibraryDirectories=[/data/app-lib/com.xxx.xxx-2, /vendor/lib, /system/lib]]   在 Caused by:部分發現:Didn‘t find class "com.xiaodongwa.vronline.ui.actmain.MainAct" on path: DexPathList[[zip file "/data/app/com.xiaodongwa.vronline-2.apk"]

這句嚴重錯誤就是在DexPathList中找不到那個MainAct的類,dex讀起來好熟悉,這不是我們打包以後的.dex檔案的尾碼麼,這就涉及到了Android多分包技術MultiDex

OK,繼續填坑

三、詳解多分包技術的

實現多分包技術,我們首先需要使用Android SDK Build Tools 21.1及以上的版本,完成後還需要在dependencies中添加multidex的依賴,記得不要忘記添加上邊提到的那句話

1、multiDexEnabled true

2、添加依賴

dependencies {      compile ‘com.android.support:multidex:1.0.1‘  }  

方案一、讓應用的中自己定義的Application繼承MultiDexApplication 

public class MyApplication extends MultiDexApplication{  ……  }  

切記不要忘記在manifest.xml檔案中修改啟動的Application為自己定義的Application,否則程式會崩潰

方案二、重寫Application 的attachBaseContext方法,這個方法是在onCreate之前執行的 

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

這樣編譯運行程式即可解決問題了

如有錯誤或者問題歡迎指教

解決Android單個dex檔案不能超過65535個方法問題

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.