作为一个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的限制


更多相关文章

  1. 单点登录(三)| JIRA 安装及 JIRA 集成 CAS 实践
  2. 编译Android内核时遇到的jdk问题
  3. Android(安卓)JNI小实例
  4. Android(安卓)eng版系统烧录
  5. Android多渠道Ant打包详细
  6. Android(安卓)P Image编译
  7. android apk 防止反编译技术第三篇-加密
  8. Android(安卓)NDK 开发教程六: application.mk
  9. Android(安卓)ADT插件配置

随机推荐

  1. Android之应用资源的调用
  2. 新手学习linux需了解的内容
  3. 不仅是微软和诺基亚,谁都无法 fork Androi
  4. Android对Linux内核的增强:Low Memory Kil
  5. Android(安卓)应用程序
  6. Android的memory maps
  7. Android 开发视频推荐
  8. Android软件开发之盘点所有Dialog对话框
  9. android:绘图 (android.graphics包)
  10. android 跨应用程序广播发送接受