APP中方法超过64K的解决办法

病症

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值