参考
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中的类即为实际所需
任何查找都不能保证所有依赖都找到,所以,需要多次测量,确保没有问题
网友评论