解决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 [, 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个方法问题的更多相关文章
- 解决Android单个dex文件不能超过65536个方法问题
当我们的项目代码过大时,编译运行时会报Unable to execute dex: method ID not in[0, 0xffff]: 65536)错误.当出现这个错误时说明你本身自己的工程代码 ...
- IDA动态调试Android的DEX文件
Android程序的dex文件的动态调试确实是个大问题,网上也有一些教程但是不是特别的详细,今天用到了IDA动态调试Android的DEX文件,特此记录一下. IDA 6.6新添加了对dex文件的调试 ...
- Android为什么方法数不能超过65535
言归正传,来聊聊为什么方法数不能超过65535?搬上Dalvik工程师在SF上的回答,因为在Dalvik指令集里,调用方法的invoke-kind指令中,method reference index只 ...
- 彻底解决Android 应用方法数不能超过65K的问题
作为一名Android开发者,相信你对Android方法数不能超过65K的限制应该有所耳闻,随着应用程序功能不断的丰富,总有一天你会遇到一个异常: Conversion to Dalvik forma ...
- IDA在内存中dump出android的Dex文件
转载自http://drops.wooyun.org/tips/6840 在现在的移动安全环境中,程序加壳已经成为家常便饭了,如果不会脱壳简直没法在破解界混的节奏.ZJDroid作为一种万能脱壳器是非 ...
- 解决Android 应用方法数不能超过65K的问题
Conversion to Dalvik format failed:Unable toexecute dex: method ID not in [0, 0xffff]: 65536 假设你的应用出 ...
- 解决android中Layout文件下的xml文件配好后,R类中不能自动生成相应代码
不能更新的原因: 1.在xml文件中代码错误或者格式错误 2.eclipse 编译器是老版本 3.布局文件的文件名有大写字母 4.含有相同文件名.格式的xml文件 解决方法: 1.找到出错的xml文件 ...
- 解决Android ListView 和 ScrollView 共存时冲突 问题 方法其一
转载请注明出处: http://www.goteny.com/articles/2013/11/8.html http://www.cnblogs.com/zjjne/p/3428480.html 当 ...
- [其他]Android SDK离线文件路径以及安装更新方法
一.离线安装Android SDK文件路径 转载自:http://www.oschina.net/code/snippet_1539302_45940 Google TV Addon, Android ...
随机推荐
- python 字符串模糊匹配 Fuzzywuzzy
Python提供fuzzywuzzy模块,不仅可用于计算两个字符串之间的相似度,而且还提供排序接口能从大量候选集中找到最相似的句子. (1)安装 pip install fuzzywuzzy (2)接 ...
- 死磕itchat源码--core.py
core.py文件中的Core类定义了itchat的所有接口.且,仅仅是定义了接口,全部在component包中实现重构.其用法如下表述: 缺省 源码如下: # -*- encoding: utf-8 ...
- python 生成HTmL报告页面 V1.3 修改字体颜色
HTML报告V1.3 根据文字内容显示不同的字体颜色: 代码如下: # -*- coding=utf-8 -*- import time,os """ V1.2 1.生成 ...
- mysql字符集和排序规则
1.关于字符集和排序规则所为字符集,就是用来定义字符在数据库中的编码的集合.常见的字符集有:utf8(支持中文)和AccIS(不支持中文) 数据库中的排序规则用来定义字符在进行排序和比较的时候的一种规 ...
- request.getScheme()、 request.getServerName() 、 request.getServerPort() 、 request.getContextPath()
<% String basePath = request.getScheme() + "://" + request.getServerName() + ":&qu ...
- 亚马逊免费服务器搭建Discuz!论坛过程(二)
1: 登录服务器 在实例页面,点击连接连接,按照如下步骤,即可登录服务器. 登录成功之后,如下所示.你就可以随意玩耍了. 2: 系统优化 证书登录当然安全,但是不太方便并且麻烦,本人还是习惯用户名密 ...
- Fleury算法 求欧拉回路
Fleury算法 #include <iostream> #include <cstdio> #include <cstring> #include <cma ...
- ReentrantLock(排他锁)
在多线程操作时.保证一块共享资源的原子性.第一想到的就是用synchronized关键字 在jdk5提供一个更灵活更强大的 ReentrantLock 使用reentrantLock.lock();获 ...
- 非form表单提交的数据就要用@requestbody注解获取http传过来的值,尤其json
非form表单提交的数据就要用@requestbody注解获取http传过来的值,尤其json
- Cloud Card是否能干掉App
算下来有一年没写blog了.这一年算是潜心做一件事情,随着云OS 3.0已公布.总算能够向外界表达了我们想做个啥,非常多人也開始质疑,Cloud Card究竟是个啥?云OS 3.0算不算自主研发的OS ...