解决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 ...
随机推荐
- 自定义View实现拖动小圆球,并随机改变其颜色
//简单实现package com.example.demo1; import android.content.Context;import android.graphics.Canvas;impor ...
- PAT_A1111#Online Map
Source: PAT A1111 Online Map (30 分) Description: Input our current position and a destination, an on ...
- eas之编辑界面中分录默认携带的标题栏
this.kdtEntrys_detailPanel.setTitle("物件内容"); KDContainer kdtEntrys_Container = (KDContai ...
- 【剑指Offer】34、第一个只出现一次的字符
题目描述: 在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写). 解题思路: ...
- SQL第一节课
phpmyadmin create table 表名( 列名 数据类型 是否为空 (是否主键|是否唯一|外键关系), 列名 数据类型...(最后一列不加逗号)) create database 数据库 ...
- 阿里云服务器centos7环境下安装xampp后,mysql有进程,但是却没有监听3306端口
配置阿里云服务器centos7中xampp环境时出现了一种情况: 在centos中可以使用命令进入mysql 修改后也可以远程用phpmyadmin连接mysql 但是用navicat却无法连接 先修 ...
- 设置随机 User-Agent
本文转载自以下网站: Scrapy 中设置随机 User-Agent 的方法汇总 https://www.makcyun.top/web_scraping_withpython14.html 一行代码 ...
- ls命令:显示文件或目录
ls:显示目录下的内容及相关属性信息 [命令详解] [功能说明] ls命令可以理解为英文list的缩写,其功能是列出目录的内容及其内容属性信息(list directory contents).该命令 ...
- Java设计模式之 — 模板方法(Template Method)
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/8744002 今天你还是像往常一样来上班,一如既往地开始了你的编程工作. 项目经理告 ...
- Spring Cloud-config(十一)
说明 用于分布式中统一的配置管理,是一个单独的微服务 简单例子 准备git 1.我自己在本地环境搭建了git服务器 也可以使用github 可参考:https://www.cnblogs.com/LQ ...