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

标签 android android-gradle-plugin android-build android-multidex

我们的应用程序大约有 10 万个方法。我们使用 multidex 构建应用程序没有任何问题(我们使用的是 gradle,最新的构建工具,multiDexEnabled truepreDexLibraries false

我们正在发布到亚马逊应用商店,他们非常聪明,他们在上传后任意注入(inject)大约 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 中。

为了保证 Amazon 有足够的空间将他们的 2000 种方法注入(inject)到主 dex 文件中,我想确保只有绝对需要在主 dex 文件中的类才是。

我该怎么做?

最佳答案

解决方案是在 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'
    }
}

关于android - 使用 multidex 时如何使 classes.dex 尽可能小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28401151/

相关文章:

java - 写入文件不会写入

android - 重复的 zip 条目 [commons-io-1.3.2.jar :org/apache/commons/io/CopyUtils. 类])

android - "com.swmansion.gesturehandler.react"出现错误

AndroidStudio 2.1.1 在 xml 中所做的更改不会在运行时更新

android - 构建 android - 如何在 mkbootimg 命令中加载内核镜像?

java - 如何通过按按钮重置 MDC 微调器(AutoCompleteTextview/ExposedDropdownMenu)中的选定项目

android - 将 Google Play 游戏与 Firebase Auth 结合使用

android - 在 Android 上执行文件 I/O - 它属于哪个线程

android - 没有这样的属性 : FOR_RUNTIME for class: org. gradle.api.attributes.Usage

android - 构建 apk 以调试和 Release模式,而无需每次更改 Android Google API key ?