Android 应用的Dex有64K引用限制,超过限制后就不得不优化工程代码将方法数限制在64K以内或者使用分包方案,比如在build.grdle中使用mutiDexEnabled 开启分包,
android {
defaultConfig {
...
minSdkVersion 15
targetSdkVersion 28
multiDexEnabled true
}
...
}
在开启分包方案,并依赖分包库后,可以通过multiDexKeepFile来声明主Dex文件中需要的类
android {
buildTypes {
release {
multiDexKeepFile file 'multidex-config.txt'
...
}
}
}
Tinker在应用开启分包后,需要将自己的类也放到主Dex中才能完成补丁包的生成以及后续的热修复过程,所以Tinker生成了自己的keep文件,然后通过脚本修改multiDexKeepFile的值,达到维持所需类在主Dex中的目的。
Android 5.0之前(API 21 之前)使用Dalvik执行应用代码,默认情况下Dalvik限制每个APK只能使用单个dex文件,这个通过分包方案可以绕过这个限制,即通过分包支持库管理其它Dex文件和其所包含代码的访问,但是在Android 5.0 以后 (API 21以后)系统使用ART,其原生支持从APK中加载多个Dex文件,ART在应用安装时只需预编译,将多个dex文件编译成单个的.oat文件,供系统执行,因此当minSdkVersion大于等于21后不再需要分包库的支持,只需开启mutiDexEnabled即可,但同时multiDexKeepFile属性将会失效,这个就导致Tinker的Keep文件失效,从导致了之后补丁包生成失败,那么只能通过另一种方式去指定分包方案了,如下:
dexOptions{
...
additionalParameters = ['--main-dex-list=' + projectDir + '/maindexlist.txt']
}
这种方式在minSdkVersion大于21后依然生效,但是maindexlist.txt的文件配置依然是个问题,如果不嫌麻烦的话可以将需要放到主Dex中的类按照声明规则逐一的人工添加进去,最好的方式使用插件或脚本生成