1.Android开发过程中,随着应用不断增加新功能,引入新库,apk会越来越大,到达一定规模后就可能遇到方法数65536超限问题,这方法数包括Android framework方法、library的方法、自己写的方法。Android平台的Java虚拟机Dalvik执行Dex程序时,使用的是short类型来索引DEX文件中的方法。这就意味着单个Dex文件可被引用的方法总数被限制为64x1024
, 即65536
。
2.为了避免突破64K方法数限制,需要使用multidex来生成多个dex文件。在Android5.0 (API level 21)之前版本时默认Dalvik限制每个apk只能有一个字节码classed.dex
文件,通常用用multidex support library来管理额外的dex文件。Android5.0及更高版本使用支持从apk中加载多个dex文件的ART运行时机制,在应用安装时,加载classed(...N).dex文件并编译成一个.oat
文件以支持在Android设备上运行。
3.使用Gradle配置Multidex,第一步更改Gradle配置来支持multidex,第二步把自己的application从原来的继承父类换成MultidexApplication。Gradle配置如:
android {
compileSdkVersion 25
buildToolsVersion "25.0.2"
defaultConfig {
...
minSdkVersion 14
targetSdkVersion 25
...
// Enabling multidex support.
multiDexEnabled true
}
...
}
dependencies {
compile 'com.android.support:multidex:1.0.1'
}
当没有自己的application时,AndroidManifast.xml里的配置如:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.xxx.yyy">
<application
...
android:name="android.support.multidex.MultiDexApplication">
...
</application>
</manifest>
有自己的application时,可以通过复写attachBaseContext()方法并调用MultiDex.install(this)来支持multidex,即无需修改manifest文件或者可以让自己的application继承Application 改为继承MultiDexApplication,而无需修改manifest文件或复写attachBaseContext()方法如:
public class BaseApplication extends MultiDexApplication {
@Override
public void onCreate() {
super.onCreate();
}
}
4.Multidex虽然可以解决我们的方法数问题,但是还是存在自己的局限性
(1).如果二DEX文件太大,安装分割dex文件是一个复杂的过程,可能会导致应用程序无响应(ANR)的错误。在这种情况下,你应该尽量的减小dex文件的大小和删除无用的逻辑,而不是完全依赖于multidex。
(2).在Android 4.0设备(API Level 14)之前,由于Dalvik linearalloc bug(问题22586),multidex很可能是无法运行的。如果希望运行在Level 14之前的Android系统版本,请先确保完整的测试和使用。
(3).应用程序使用了multiedex配置的,会造成使用比较大的内存。当然,可能还会引起dalvik虚拟机的崩溃(issue 78035)。
(4).对于应用程序比较复杂的,存在较多的library的项目。multidex可能会造成不同依赖项目间的dex文件函数相互调用,找不到方法。
5.优化Multidex的开发和构建
在我们开发过程当中,最小sdk版本低于21时,multidex的配置,对系统apk的构建、签名、打包复杂性大大的增加,比较耗时,所以在开发环境配置最小版本为21,生产环境改为业务需求的更低版本来优化我们的开发进度。
android {
productFlavors {
// Define separate dev and prod product flavors.
dev {
// The actual minSdkVersion for the application.
minSdkVersion 21
}
prod {
minSdkVersion 14
}
}
...
}
dependencies {
compile ‘com.android.support:multidex:1.0.1‘
}
转载请注明:http://blog.youkuaiyun.com/u012438830/article/details/78468424