本文译自http://developer.android.com/tools/building/multidex.html#about
构建超过65536方法数的安卓程序
随着安卓平台的不断发展,安卓应用的大小也在不断增加。当你的应用和引用库的大小达到了一定的规模,你会遇到构建的错误,错误指出,你的应用达到了安卓应用构建架构(build architecture)的限制,早期版本中错误信息如下:
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。这个数字是很重要的,他代表了在一个可执行Dalvik(dex)字节码文件中可饮用的方法总数。如果你在构建一个安卓应用程序的时候遇到了这个错误,祝贺你,你已经有了相当多的代码!这个文档解释了如何越过这个限制从而可以继续构建你的app。
注意:本文的指导继承了来自于安卓开发者的博文Custom Class Loading in Dalvik.
关于65k的引用限制
安卓应用(APK)文件包含着以可执行Dalvik(DEX)文件表示的可执行字节码文件,这个文件中包含着在app中执行的编译代码。DEX的说明中限制在一个DEX文件中可被引用的方法总数不能超过65536,包括安卓框架(framework)的方法,库(library)方法和你自己代码中的方法。如果希望超过这个限制则需要在安卓构建的过程中生成多个DEX文件,我们称之为multidex配置。
Multidex支持安卓5.0以前的系统
Multidex支持安卓5.0及更高版本的系统
避免65k的限制
在Gradle下为你的APP配置Multidex
- 改变你的Gradle构建配置使得能够支持multidex
- 修改manifest去引用MultiDexApplication类
修改你的app Gradle 构建文件配置包括支持库以及能够输出multidex,如下所示
android {
compileSdkVersion 21
buildToolsVersion "21.1.0"
defaultConfig {
...
minSdkVersion 14
targetSdkVersion 21
...
// Enabling multidex support.
multiDexEnabled true
}
...
}
dependencies {
compile 'com.android.support:multidex:1.0.0'
}
注意:在你的Gradle 构建文件中,你可以指定multiDexEnabled
设置在defaultConfig,
buildType
, 或者productFlavor或者
在manifest中的application元素中增加来自multidex支持库中的MultiDexApplication类
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.android.multidex.myapplication">
<application
...
android:name="android.support.multidex.MultiDexApplication">
...
</application>
</manifest>
当我们在app中增加了这些配置,安卓构建工具够早了一个原生的DEX(classes.dex)并且支持(classes2.dex,classes3.dex)等等,构建系统也会将这些信息打包到apk中。
注意:如果app使用了扩展的Application类,你可以覆盖(override)他的attachBaseContext()方法并且调用MultiDex,install(this)从而支持multidex。如需了解更多信息,请参考MultiDexApplication文档。