android MultiDex分包

作者: 众少成多积小致巨 | 来源:发表于2019-08-21 22:49 被阅读0次

    参考

    64k限制

    Dalvik Executable 规范将可在单个 DEX 文件内可引用的方法总数限制在 65,536,其中包括 Android 框架方法、库方法以及您自己代码中的方法。也即64K限制

    Android 5.0(API 级别 21)及更高版本使用名为 ART 的运行时,后者原生支持从 APK 文件加载多个 DEX 文件。ART 在应用安装时执行预编译,扫描classesN.dex文件,并将它们编译成单个.oat文件,供 Android 设备执行。

    因此,分包库只针对Dalvik, 即5.0以下

    分包

    build.gradle文件中,android---defaultconfig中添加   multiDexEnabled true 启用分包

    启用分包,不区分android版本(5.0以下只不过需要分包库才能分包而已,5.0以上只需要配置即可自动分包)

    5.0以下版本需要使用分包支持库: com.android.support:multidex:1.0.3

    添加依赖  implementation'com.android.support:multidex:1.0.3'

    使用分包 配置Application,1)Application 继承MultiDexApplication 2) 在attachBaseContext方法中增加代码: MultiDex.install(this)

    局限性

    1、启动期间在设备数据分区中安装 DEX 文件的过程相当复杂,如果辅助 DEX 文件较大,可能会导致应用无响应 (ANR) 错误

    2、由于存在 Dalvik linearAlloc 错误,在5.0以下版本,安装运行内存大小限制,导致,不能启动或者运行失败

    解决方案

    1、限制分包大小,解决Dalvik linearAlloc 错误带来的问题

    dexOptions {

       javaMaxHeapSize"4g"

        additionalParameters +='--multi-dex'

        additionalParameters +='--set-max-idx-number=48000'

        additionalParameters +='--minimal-main-dex'

    }

    最大为48000,可以略小,看自己应用,还需要多测试

    限制每个分包大小

    2、指定主包加载类

    除了下图,还有另外一种配置,是等效的  multiDexKeepProguard('multidex-config.pro'), 配置文件均是放在build.gradle同目录下,名字随意

    只不过这两种配置文件内容格式不一致

    keepfile    :  com/example/MyClass.class   

    keepProguard  :  -keep class com.example.MyClass

    主包配置

    3、减少无用的类和启动尽量减少不必要的逻辑

    主包配置类

    由于分包,会报一些错误:ClassNotFoundException、NoClassDefFoundError等

    log中会打印一些: not find, fail find 等找不到类、方法的字眼

    这些类都需要添加到配置文件中

    1、debug版本编译时,在build\intermediates\multi-dex\debug 下有maindexlist.txt文件,copy里面内容作为配置文件初始内容,测试报错后补充相应类

    2、使用类依赖工具cda工具,根据启动必须类作为起始类(Application,主activity,和必要服务)查找所有依赖类作为初始配置内容,测试报错后补充

    3、使用其它插件,比如DexKnifePlugin

    配置文件内容多余或者重复都没有关系,但是少了会报错

    重复使用excel可以去重,多余,可以使用AS自带的Analyze apk来分析,classes.dex中的类即为实际所需

    任何查找都不能保证所有依赖都找到,所以,需要多次测量,确保没有问题

    相关文章

      网友评论

        本文标题:android MultiDex分包

        本文链接:https://www.haomeiwen.com/subject/xzjwsctx.html