zoukankan      html  css  js  c++  java
  • 解决Android单个dex文件不能超过65535个方法问题

    一、找坑:谷歌规定单个dex文件中的方法不能超过65536的限制

    我们编写项目过程中在工程的lib文件夹下引用的第三方插件jar包太多或者项目过大,编译运行时就有可能报出com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536错误。看到这个错误说明你的方法加起来已经超过了65536这个数目。但是谷歌规定单个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);  
        }  
    }  
     

    这样编译运行程序即可解决问题了

    如有错误或者问题欢迎指教

  • 相关阅读:
    设计模式单例模式的实现方式
    Springboot,SSM框架比较,区别
    多线程系列之自己实现一个 lock 锁
    springBoot 自动配置原理自己新建一个 starter
    Hashmap 实现方式 jdk1.7 和 1.8区别
    给WPF中的DataGrid控件添加右键菜单(ContextMenu),以便用户可以显示或者隐藏DataGrid中的列,并且下次运行时依然保持上次关闭时的列的布局
    WPF XAML页面 无智能感知
    【读书笔记】排列研究排列中的代数组合学
    使用Mathematica做序列的DTFT的几个例子
    BGF bivariate generating function 双变量生成函数
  • 原文地址:https://www.cnblogs.com/zhujiabin/p/7580977.html
Copyright © 2011-2022 走看看