android MultiDex配置突破64K方法数限制

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.csdn.net/u012438830/article/details/78468424

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值