使用multidex时,如何使classes.dex尽可能小?

时间:2015-02-09 00:36:52

标签: android android-gradle android-build multidex android-multidex

我们的应用程序大约有100k方法。使用multidex构建应用程序没有问题(我们使用gradle,最新构建工具multiDexEnabled truepreDexLibraries 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文件中的类才是。

我该怎么做?

2 个答案:

答案 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)

您是否尝试使用标志--minimal-main-dex?这将确保只将--main-dex-list中列出的类放在主dex中。我发现这个guide很有帮助。此外,这里是dx工具的commands列表以及每个命令的作用。