我们的应用程序大约有100k方法。使用multidex构建应用程序没有问题(我们使用gradle,最新构建工具multiDexEnabled true
和preDexLibraries false
。
我们正在向亚马逊应用商店发布,并且凭借他们的智慧,他们在上传后随意注入约2000种方法。我们已经与他们联系,告诉我们应该缩小我们的主要classes.dex文件,并将更多内容移到辅助dex文件中。
对于我们如何能够如此精细地控制其中的内容,我感到有些失落。我正在观看构建过程,并看到build/intermediates/multi-dex/[flavor]/maindexlist.txt
。这似乎是要保存在主dex文件中的文件列表。它不是那么大,有大约500个条目。
我也看到了同一个目录components.flags
。这是一个自动生成的ProGuard配置缩小到此。在运行之后,它输出到(同一目录仍然)componentClasses.jar
。
这个componentClasses jar看起来恰到好处。它具有相当小的(约占总数的10%)类,这些类绝对需要在主dex文件中。
但是当它到达dex步骤时,它仍然尽可能多地包装到主要的classes.dex中。无论我们添加/删除/调整什么,它总是包含在绝对限制(65536)方法之下。然后将遗骸溢出到classes2.dex。
为了保证亚马逊有将2000个方法注入主要dex文件的空间,我想确保只有绝对需要在该主要dex文件中的类才是。
我该怎么做?
答案 0 :(得分:2)
解决方案是在dex步骤中使用'--set-max-idx-number'参数
我通过将以下内容添加到我的gradle文件的根级别
来实现此目的afterEvaluate {
tasks.matching {
it.name.startsWith('dex')
}.each { dx ->
if (dx.additionalParameters == null) {
dx.additionalParameters = []
}
dx.additionalParameters += '--set-max-idx-number=60000'
}
}
答案 1 :(得分:0)