近日,Android Developers在Google+上宣布了新的Multidex支持库,为方法总数超过65K的Android应用提供了官方支持。 html
若是你是一名幸运的Android应用开发者,正在开发一个前景广阔的应用,不断地加入新功能、添加新的类库,那么终有一天,你会不幸遇到这个错误: android
Conversion to Dalvik format failed: Unable to execute dex: method ID not in [0, 0xffff]: 65536 git
这个错误是Android应用的方法总数限制形成的。Android平台的Java虚拟机Dalvik在执行DEX格式的Java应用程序时,使用原生类型short来索引DEX文件中的方法。这意味着单个DEX文件可被引用的方法总数被限制为65536。一般APK包含一个classes.dex文件,所以Android应用的方法总数不能超过这个数量,这包括Android框架、类库和你本身开发的代码。 github
这个问题能够经过将一个DEX文件分拆成多个DEX文件解决。Facebook介绍了为Android应用开发的Dalvik补丁;Android Developers博客介绍了经过自定义类加载过程的方法来解决此问题。但这些方法有些复杂并且并不优雅。 app
随着新的MultiDex支持库发布,Google正式为解决此问题提供官方支持。构建超过65K方法数的应用介绍了如何使用Gradle构建多DEX应用。 框架
首先使用Android SDK Manager升级到最新的Android SDK Build Tools和Android Support Library R21。而后进行如下两步操做: ide
1.修改Gradle配置文件,启用MultiDex并包含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' }
2.让应用支持多DEX文件。在MultiDexApplication JavaDoc中描述了三种可选方法: 测试
@Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); MultiDex.install(this); }
通过以上步骤,你的应用已经能够实现多个DEX文件了。当应用构建时,构建工具会分析哪些类必须放在第一个DEX文件,哪些类能够放在附加的DEX文件中。当它建立了第一个DEX文件(classes.dex)后,若是有必要会继续建立附加的DEX文件,如classes2.dex, classes3.dex。Multidex的支持类库将被包含在应用的第一个DEX文件中,帮助实现对其它DEX文件的访问。 ui
文中还介绍了在开发多DEX应用时,经过设置productFlavors提升开发效率以及多DEX应用的测试方法。
Android 5.0和更高版本使用名为ART的运行时,它原生支持从APK文件加载多个DEX文件。在应用安装时,它会执行预编译,扫描classes(..N).dex文件而后将其编译成单个.oat文件用于执行。了解更多关于ART的信息。
虽然Google解决了应用总方法数限制的问题,但并不意味着开发者能够任意扩大项目规模。Multidex仍有一些限制:
避免应用过大、方法过多仍然是Android开发者要注意的问题。Mihai Parparita的开源项目dex-method-counts能够用于统计APK中每一个包的方法数量。
一般开发者本身的代码很难达到这样的方法数量限制,但随着第三方类库的加入,方法数就会迅速膨胀。所以选择合适的类库对Android开发者来讲尤其重要。
开发者应该避免使用Google Guava这样的类库,它包含了13000多个方