使用 multidex 时如何使 classes.dex 尽可能小?
How do I make classes.dex as small as possible, when using multidex?
我们的应用程序大约有 10 万个方法。我们使用 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 中。无论我们 add/remove/tune 是什么,它总是将刚好低于绝对限制 (65536) 的方法打包到那里。然后溢出遗体进入classes2.dex.
为了保证亚马逊有足够的空间将他们的 2000 种方法注入到主 dex 文件中,我想确保只有 类 是绝对需要在主 dex 文件中的, .
我该怎么做?
您是否尝试过使用标志 --minimal-main-dex?这将确保仅将 --main-dex-list 中列出的 类 放入主 dex 中。我发现这个 guide to be helpful. Also, here is a list of commands 用于 dx 工具以及每个命令的作用。
解决方案是在 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'
}
}
我们的应用程序大约有 10 万个方法。我们使用 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 中。无论我们 add/remove/tune 是什么,它总是将刚好低于绝对限制 (65536) 的方法打包到那里。然后溢出遗体进入classes2.dex.
为了保证亚马逊有足够的空间将他们的 2000 种方法注入到主 dex 文件中,我想确保只有 类 是绝对需要在主 dex 文件中的, .
我该怎么做?
您是否尝试过使用标志 --minimal-main-dex?这将确保仅将 --main-dex-list 中列出的 类 放入主 dex 中。我发现这个 guide to be helpful. Also, here is a list of commands 用于 dx 工具以及每个命令的作用。
解决方案是在 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'
}
}