您的位置:首页 > 移动开发

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

2016-07-21 08:51 344 查看

病症

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  dalvik multidex 64k