【问题标题】:How do I make classes.dex as small as possible, when using multidex?使用 multidex 时,如何使 classes.dex 尽可能小?
【发布时间】:2015-05-28 07:08:49
【问题描述】:

我们的应用大约有 10 万个方法。我们使用 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 文件中的类。

我该怎么做?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我实际上找到了解决方案,使用--set-max-idx-number。我已经在这里添加了答案,谢谢提醒!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-05
      • 2016-02-19
      • 1970-01-01
      • 1970-01-01
      • 2020-09-14
      • 2020-12-05
      相关资源
      最近更新 更多