Android方法数不能超过65K的解决方案
作为一个Android程序开发猿,如果你还没遇到Conversion to Dalvik format failed:Unable to execute dex:method ID not in [0,0xffff]:65536这个异常的话,只能说明要么你是大牛,要么就是还只停留在码农的阶段。其实这个异常是谷歌限制的放法数不能超过65K的限制,随着你的程序的不断扩大,总有一天会遇到,以前我待的公司都是做的外包项目,做完了直接交付,也不维护的,所以基本不会遇到这样的异常,偶尔遇到,也是采用的最简单的方法去解决,的确,这样能通过编译,但是遗憾的是在2.3的系统的Android手机上直接crash,报INSTALL_FAILED_DEXOPT异常,因为是外包项目嘛,所以这些手机直接忽略。后来换了家公司,开始做自己的产品,没有自己的框架,全靠第三方的开源jar包支撑,日积月累,项目工程月来源大,唉,终于,久违的方法数超出的异常出现了,迫于工作压力,只能寻找合适的方法去解决,最后通过分包机制完美解决,下面一起来分享下这个解决方法,希望对大家能有所帮助,让你们少走弯路。
原因:
1.一个Dex文件中存储方法id用的是short类型数据,所以dex中的放法术不能擦后果65k
2.在2.3系统之前虚拟机内存只分配了5M
解决办法1:(不够彻底,表面的)
在Project.proterty中配置dex.force.jumbo=true,能编译通过,但是在2.3的机器上直接crash。
解决办法2:(彻底,完美)
1.打开项目的build.gradle文件,添加android-support-multidex.jar的以来文件
compile 'com.android.support:multidex:1.0.0'
2.设置虚拟机堆内存大小,避免编译期间OOM,一般设置2g够了
dexOptions { javaMaxHeapSize "2g" }
3.添加其他配置(multiDexEnabled true)
defaultConfig { applicationId "com.tb.demo" minSdkVersion 14 targetSdkVersion 21 versionCode 67 versionName "3.1.0" // Enabling multidex support. multiDexEnabled true
4.在Application中做设置 如果你的程序有自定义的Application,那么可以选择将你的Application继承MultiDexApplication,或者在你的Application中添加以下代码
@Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); MultiDex.install(this); }
//// Source code recreated from a .class file by IntelliJ IDEA// (powered by Fernflower decompiler)//package android.support.multidex;import android.app.Application;import android.content.Context;import android.support.multidex.MultiDex;public class MultiDexApplication extends Application { public MultiDexApplication() { } protected void attachBaseContext(Context base) { super.attachBaseContext(base); MultiDex.install(this); }}
配置完成,恭喜你,分包机制已经配置完成,直接编译即可通过,他将生成2个Dex文件,完美解决65K的限制
更多相关文章
- 单点登录(三)| JIRA 安装及 JIRA 集成 CAS 实践
- 编译Android内核时遇到的jdk问题
- Android(安卓)JNI小实例
- Android(安卓)eng版系统烧录
- Android多渠道Ant打包详细
- Android(安卓)P Image编译
- android apk 防止反编译技术第三篇-加密
- Android(安卓)NDK 开发教程六: application.mk
- Android(安卓)ADT插件配置