一、找坑:谷歌规定单个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 [, 0xffff]:

遇到这个坑的时候找了半天的jar包重复,也是一时糊涂,吸取教训

好了,错误已经找到我们来解决问题,坑总是要填的。

二、填坑

有网友说在module的build.gradle文件中添加依据话就解决了  :

  defaultConfig {
applicationId "com.xxx.xxx"
minSdkVersion
targetSdkVersion
versionCode
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:)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:)
at android.app.ActivityThread.access$(ActivityThread.java:)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:)
at android.os.Handler.dispatchMessage(Handler.java:)
at android.os.Looper.loop(Looper.java:)
at android.app.ActivityThread.main(ActivityThread.java:)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:)
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:)
at java.lang.ClassLoader.loadClass(ClassLoader.java:)
at java.lang.ClassLoader.loadClass(ClassLoader.java:)
at android.app.Instrumentation.newActivity(Instrumentation.java:)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:)
at android.app.ActivityThread.access$(ActivityThread.java:)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:)
at android.os.Handler.dispatchMessage(Handler.java:)
at android.os.Looper.loop(Looper.java:)
at android.app.ActivityThread.main(ActivityThread.java:)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:)
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个方法问题的更多相关文章

  1. 解决Android单个dex文件不能超过65536个方法问题

    当我们的项目代码过大时,编译运行时会报Unable to execute dex: method ID not in[0, 0xffff]: 65536)错误.当出现这个错误时说明你本身自己的工程代码 ...

  2. IDA动态调试Android的DEX文件

    Android程序的dex文件的动态调试确实是个大问题,网上也有一些教程但是不是特别的详细,今天用到了IDA动态调试Android的DEX文件,特此记录一下. IDA 6.6新添加了对dex文件的调试 ...

  3. Android为什么方法数不能超过65535

    言归正传,来聊聊为什么方法数不能超过65535?搬上Dalvik工程师在SF上的回答,因为在Dalvik指令集里,调用方法的invoke-kind指令中,method reference index只 ...

  4. 彻底解决Android 应用方法数不能超过65K的问题

    作为一名Android开发者,相信你对Android方法数不能超过65K的限制应该有所耳闻,随着应用程序功能不断的丰富,总有一天你会遇到一个异常: Conversion to Dalvik forma ...

  5. IDA在内存中dump出android的Dex文件

    转载自http://drops.wooyun.org/tips/6840 在现在的移动安全环境中,程序加壳已经成为家常便饭了,如果不会脱壳简直没法在破解界混的节奏.ZJDroid作为一种万能脱壳器是非 ...

  6. 解决Android 应用方法数不能超过65K的问题

    Conversion to Dalvik format failed:Unable toexecute dex: method ID not in [0, 0xffff]: 65536 假设你的应用出 ...

  7. 解决android中Layout文件下的xml文件配好后,R类中不能自动生成相应代码

    不能更新的原因: 1.在xml文件中代码错误或者格式错误 2.eclipse 编译器是老版本 3.布局文件的文件名有大写字母 4.含有相同文件名.格式的xml文件 解决方法: 1.找到出错的xml文件 ...

  8. 解决Android ListView 和 ScrollView 共存时冲突 问题 方法其一

    转载请注明出处: http://www.goteny.com/articles/2013/11/8.html http://www.cnblogs.com/zjjne/p/3428480.html 当 ...

  9. [其他]Android SDK离线文件路径以及安装更新方法

    一.离线安装Android SDK文件路径 转载自:http://www.oschina.net/code/snippet_1539302_45940 Google TV Addon, Android ...

随机推荐

  1. OSI参考模型(转)

    一.OSI参考模型 自下而上:物理层(物理介质,比特流).数据链路层(网卡.交换机).网络层(IP协议).传输层(TCP/UDP协议).会话层(创建/建立/断开连接).表示层(翻译,编码,压缩,加密) ...

  2. LA 4327

    Panagola, The Lord of city F likes to parade very much. He always inspects his city in his car and e ...

  3. [luogu3244 HNOI2015] 落忆枫音(容斥原理+拓扑排序)

    传送门 Description 给你一张 n 个点 m 条边的DAG,1 号节点没有入边.再向这个DAG中加入边 x→y ,求形成的新图中以 1 为根的外向树形图数 模 10^9+7 . Input ...

  4. Windows 安装react native

    1.下载node.js (https://nodejs.org/en/) 2.安装node.js,安装完成后按住 图标键+R ,输入CMD进入命令行终端,输入npm -v C:\Users\Admin ...

  5. redis-windows上的安装与其他命令

    为什么用Redis 数据库的IO是一个性能瓶颈,需要用redis来解决,100个IO并发已经很不错了,因为数据库天生就需要写磁盘,而redis不需要实时写磁盘而又可以存入数据库 安装 以服务的方式启动 ...

  6. Linux系统下怎样配置SSH?怎样开启SSH?

    SSH作为Linux远程连接重要的方式,怎样配置安装linux系统的SSH服务.怎样开启SSH?以下来看看吧(本例为centos系统演示怎样开启SSH服务) 1.登陆linux系统,打开终端命令.输入 ...

  7. [2-SAT] poj 3207 Ikki's Story IV - Panda's Trick

    题目链接: id=3207">http://poj.org/problem? id=3207 Ikki's Story IV - Panda's Trick Time Limit: 1 ...

  8. 【java项目实战】ThreadLocal封装Connection,实现同一线程共享资源

    线程安全一直是程序员们关注的焦点.多线程也一直是比較让人头疼的话题,想必大家以前也遇到过各种各种的问题.我就不再累述了.当然,解决方案也有非常多,这篇博文给大家提供一种非常好的解决线程安全问题的思路. ...

  9. Windows下Go语言 幽灵蛛的配置

    这里是环境变量 目录结构 在这其中,我主要需要观察src

  10. Linux - 网络相关指令

    系统时间与开关机 查看系统时间 date 查看硬件日期 hwclock 学习Linux不必全部指令都会,只要记住主要常用的几个就可以了.--MK 关机命令 shutdown init reboot p ...