MultiDex分包

摘要

由于经常在sdk项目中用到multiDex,对于android官网大段的描述且没有重心(嗯没错,都是重点!),所以摘录官网进行总结,对于常见的问题也总结了一下,以此来帮助你快速了解multiDex,当然,如果时间富裕的话还是推荐可以去android官网通读看一下.。

1,简单说下multiDex的由来

android 5.0(API 21)之前平台使用是Dalvik虚拟机,通过Dalvik运行时执行代码,但是Dalvik会限制apk应用只能使用一个classes.dex字节码文件.并且Dalvik Executable(Dex)字节码文件的代码可调用引用总数只有65536(另一种说法是,DexOpt会将每一个类的方法id检索起来,存在一个链表结构中,这个链表结构长度是一个short类型,导致id存储不能超过65536个).当我们在打包构建应用时(API 21之前),如果生成的Dex超过65536就会提示构建失败,方法数超出65536.又称’64K’引用限制.
android 5.0以后平台升级为ART,我们知道ART是在应用安装时执行预编译.也就是说安装时会扫描查找apk应用中所有的classesN.dex文件,合并后编译成.oat文件,直接执行.oat.
由于android 5.0以后对于apk应用的安装加载机制变了,android官方推出了可以兼容android5.0之前和5.0之后的65536解决方案,就是通过multiDex这种方式在打包构建应用时进行处理.

2.multiDex的局限

简单来说,就是multiDex并不能完全解决掉65535问题,如果你的应用最低兼容版本低于 minSDKVersion 21时,可能会存在一些其他问题,如果除主dex外,其他dex太大有可能会导致应用的ANR错误,所以希望你尽可能减少Dex的文件大小,就是优化精简你的代码(推荐去阅读R8相关).

总之,说了那么多,简而言之就一句话,你的应用如果想兼容低端机(minSdkVersion xx),那么你就需要在这些android系统版本上尽可能的进行全面测试,因为你的应用有可能会再用户那里启动或者加载某些类组件时导致崩溃.

所以这种方案存在一定限制,如果你构建的应用(multiDex构建的多个dex)在云测或者第三方测试机构跑过报告,应该会碰到在一些低端机设备上(android2x,到4.x设备)应用安装失败或运行时崩溃问题(LinearAlloc).

那么为什么会出现这样的情况呢,官方自己挖的坑自己也填不好吗?

对的,因为不好填,Dex加载原理这块也很复杂,后面单说.网上流行的很多种插件化技术解决方案,出现的原因其中之一就是为了解决这个问题.这块我们先不展开了,后面单独展开.

3.multiDex的使用

这里直接插入官网的不是就可以了吗?为啥还要说明一下?

嗯,对的这里会介绍两种方式,官网推荐的方式,以及官网为说明的可以自定义限制方法数的方式

先说官网介绍的配置方式

1,导入multiDex的依赖, implementation “androidx.multidex:multidex:2.0.1”
2,声明使用multiDex构建时应用 multiDexEnabled true
3,代码配置,如果有自定义application就在方法中对multiDex进行install调用,如果没有自定义application直接继承MultiDexApplication即可
4,multiDeKeepFile属性配置 就是你希望那些类文件在主dex中,通常来说,应用启动初始化直接加载的类文件都需要放到主dex,module中新建multidex-config.txt 或者使用multiDexKeepProguard方式进行配置,经过测试两种方式都可以
5,如果想要限制主Dex方法数,看下面的额外说明

以下是官网配置代码的写法代码片.
module build.gradle

android {
    defaultConfig {
        ...
        minSdkVersion 15
        targetSdkVersion 28
        //启用multiDex
        multiDexEnabled true
    }
    ...
    buildTypes {
        release {
             //那些类文件需要保持在主dex
        	multiDexKeepFile file('multidex-config.txt')
            //上面和下面两种任选其一即可,推荐下面这种配置,会更简洁
            // 配置文件用法和ProGuard一样
            //-keep class com.example.** { *; } // All classes in the com.example package
			//-keep class com.example.MyClassToo
            multiDexKeepProguard file('multidex-config.pro')
        }
    }
    
    //如果不需要指定主dex的方法数下面这个可以不用配置
    //另外注意的是additionalParameters这个参数是有限制的,在android studio 3.2.1版本之后就无法使用了,dx.jar已经找不到这个参数了,如果你要指定这个参数请使用3.2.1之前的版本(这里只对比了android studio 3.1.)
    dexOptions {
        javaMaxHeapSize "4g"
        preDexLibraries = false
        keepRuntimeAnnotatedClasses false
        additionalParameters = ['--multi-dex',
                                '--set-max-idx-number=55000'//设置主Dex方法数最多55000
                                , '--minimal-main-dex']
    }
}

dependencies {
  implementation "androidx.multidex:multidex:2.0.1"
}

Application.java中
有继承自定义application

public class MyApplication extends SomeOtherApplication {
  @Override
  protected void attachBaseContext(Context base) {
     super.attachBaseContext(base);
      //multiDex 实现方法调用即可,最好放在该方法首行,在其他逻辑执行之前进行调用
     MultiDex.install(this);
  }
}

无自定义继承application

public class MyApplication extends MultiDexApplication { ... }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值