gpt4 book ai didi

android-gradle-plugin - --main-dex-list 中的类太多,超出主 dex 容量

转载 作者:行者123 更新时间:2023-12-03 10:13:19 29 4
gpt4 key购买 nike

我正在尝试运行检测测试用例,但在 dex 转换时出现以下错误
意外的顶级异常(exception):

com.android.dex.DexException: Too many classes in --main-dex-list, main dex capacity exceeded
at com.android.dx.command.dexer.Main.processAllFiles(Main.java:494)
at com.android.dx.command.dexer.Main.runMultiDex(Main.java:334)
at com.android.dx.command.dexer.Main.run(Main.java:244)
at com.android.dx.command.dexer.Main.main(Main.java:215)
at com.android.dx.command.Main.main(Main.java:106)

:App:dexDebug FAILED

如何在gradle中解决这个问题?

最佳答案

我们先来了解一下问题:

在 Lollipop 之前的设备上,框架只加载主 dex。要支持多 dex 应用程序,您必须使用所有辅助 dex 文件明确修补应用程序类加载器(这就是为什么您的应用程序类必须扩展 MultiDexApplication 类或调用 MultiDex#install )。

这意味着您的应用程序的主 dex 应包含在类加载器修补之前可能访问的所有类。

您将收到 java.lang.ClassNotFoundException如果您的应用程序代码在成功修补应用程序类加载器之前将尝试引用打包在您的辅助 dex 文件之一中的类。

我已经 documented here插件如何决定哪些类应该打包在 main-dex 中。
如果这些类引用的方法总数超过 65,536 个限制,则构建将失败并显示 Too many classes in --main-dex-list, main dex capacity exceeded错误。

对于这个问题,我可以想到三种可能的解决方案:

  • (最简单的解决方案,但不适合大多数
    应用程序)将您的 minSdkVersion 更改为 21。
  • 缩小您的应用程序代码。这在之前讨论过很多次(见 herehere)。
  • 如果以上解决方案都不适合您,您可以尝试使用 my workaround对于这个问题 - 我正在修补 Android gradle 插件以在主 dex 中不包含 Activity 类。这有点hacky,但对我来说效果很好。

  • an issue在有关此错误的 Android 错误跟踪器中。希望工具团队能尽快提供更好的解决方案。

    更新 (4/27/2016)

    Gradle 插件的 2.1.0 版允许过滤 main-dex 列表类。
    警告:这是使用不受支持的 api,将来会被替换。

    例如,要排除所有事件类,您可以执行以下操作:
    afterEvaluate {
    project.tasks.each { task ->
    if (task.name.startsWith('collect') && task.name.endsWith('MultiDexComponents')) {
    println "main-dex-filter: found task $task.name"
    task.filter { name, attrs ->
    def componentName = attrs.get('android:name')
    if ('activity'.equals(name)) {
    println "main-dex-filter: skipping, detected activity [$componentName]"
    return false
    } else {
    println "main-dex-filter: keeping, detected $name [$componentName]"
    return true
    }
    }
    }
    }
    }

    您也可以查看我的 example project这证明了这个问题(并应用了上述过滤)。

    更新 2 (7/1/2016)

    Gradle 插件的 2.2.0-alpha4 版本(使用 build-tools v24)终于通过 reducing multidex keep list to a minimum 解决了这个问题.
    不应再使用 2.1.0 中不受支持(和未记录)的过滤器。我更新了我的 sample project ,证明现在无需任何自定义构建逻辑即可成功构建。

    关于android-gradle-plugin - --main-dex-list 中的类太多,超出主 dex 容量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32721083/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com