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

来源:互联网 发布:淮北淘宝家具安装 编辑:程序博客网 时间:2024/06/02 03:19

病症

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

1 0
原创粉丝点击