APP中方法超过64K的解决办法
2016-07-21 08:51
344 查看
病症
Conversion to Dalvik format failed: Unable to execute dex: method ID not in [0, 0xffff]: 65536
trouble writing output: Too many field references: 131000; max is 65536. You may try using --multi-dex option.
有上述提示错误或者类似的字样时,你就很可能中招了。
65536是在一个单独的dex文件中,可以调用的引用(可以理解为方法数)的最大数目。
这些引用包括:安卓framework 方法,library 方法和你自己定义的方法。
方法
很显然一个dex可以允许65536的方法,使用多个不就结了吗?下面讲述一下mulitdex的配置方法。在Android 5之前
在Android5之前,默认一个app中只有一个dex文件,我们可以通关过添加support包来完成。
1.修改build.gradle配置
android { compileSdkVersion 21 buildToolsVersion "21.1.0" defaultConfig { ... minSdkVersion 14 targetSdkVersion 21 ... // Enabling multidex support. multiDexEnabled true } ... } dependencies { //add multidex support library compile 'com.android.support:multidex:1.0.0' }
2.对Application进行调整
这里有三种方法
1.如果你没有定义你自己的Application
声明android.support.multidex.MultiDexApplication,作为你的Application
2.如果已经定义你的Application
这里有两种方法:
1.修改extends Application为 extends MultiDexApplication
2.在原来的Application中添加如下代码:
protected void attachBaseContext(Context base) { super.attachBaseContext(base); MultiDex.install(this); }
在Android5之后
api 21系统的运行环境ART,默认支持多dex文件。在APP安装时,ART将所有的dex文件,预编译成一个.oat文件供app调用。
精简代码,避免64K限制
虽然有multidex解决方案,仍然有许多不近人意的地方,所以,我们应该尽可能的避免64k问题。1.删除没有用的代码&&相关类库中的代码
包含一个大的类库,仅仅使用一小部分的功能,尤其需要严格处理
2.使用Proguard工具,精简代码
Multidex support library限制
1.由于Dalvik linearAlloc bug (Issue 22586)问题,APP在android4一下,可能无法运行,需要做大量的测试;2.在APP启动的时候,可能会引发ANR(Android Not Response);
3.会造成更多的内存开销,导致APP崩溃;
4.由于APP内代码调用的复杂性,可能导致某些功能无法使用。
在APP开发时,加快build
使用multidex打包时,需要对放入primary dex的class进行复杂计算,导致build时间显著增加。通过下面的配置,可以在开发中加快build过程。android { productFlavors { // Define separate dev and prod product flavors. dev { // dev utilizes minSDKVersion = 21 to allow the Android gradle plugin // to pre-dex each module and produce an APK that can be tested on // Android Lollipop without time consuming dex merging processes. minSdkVersion 21 } prod { // The actual minSdkVersion for the application. minSdkVersion 14 } } ... } dependencies { compile 'com.android.support:multidex:1.0.0' }
在minSDK>=api 21,APP自动支持多dex文件,build时,仅仅需要将修改的dex进行更新一下即可。
翻译地址
https://developer.android.com/studio/build/multidex.html#dev-build相关文章推荐
- Android中的Dalvik和ART详解及区别分析
- 丢失Android系统库或者Conversion to Dalvik format failed with error 1错误的解决
- Dalvik字节码的类型,方法与字段表示方法
- android Dalvik虚拟机工作原理介绍
- 《精通Android3》之Dalvik VM剖析
- Android system
- Andriod基本框架
- davlik heap out of memory
- Conversion to Dalvik format failed: Unable to exec 4000 ute dex
- Android基本知识
- Android Zygote解析
- dalvik虚拟内存管理之二—:垃圾收集
- davlik虚拟机内存管理之一——内存分配
- dalvik虚拟内存管理之三——调试信息
- Gradle1.5.0之后如何控制dex包内的方法数上限?
- smali代码插入和调试
- Android DexIndexOverflow错误解析和解决方案
- Android 性能优化方法
- Android 提示超出64K的解决办法
- Android(jave)中关于finalize必须要注意的几件事