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的限制


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值