如何修复编译时的 MultiDex 崩溃

发布于 2025-02-18 15:36:51 字数 2612 浏览 4 评论 0

是否有那么一天,你曾经在编译你的项目时候因为以下这样的错误而失败了:

trouble writing output: Too many field references: 131000; max is 65536. You may try using --multi-dex option.

为啥?也许是最新的 Play 服务更新造成的,又或许是你应用中的某某统计 SDK 造成的。但是有一点是可以肯定的:你的应用成为了拥有超过六万五千个方法或变量的应用之一。

若在一年之前,这也许是个大问题。当时有一些办法可以避免这个问题,包括一些拆分 dex 文件的方法,但这些方法往往并不完全奏效。

MultiDex?

幸运的是,自从谷歌引入了 MultiDex 机制,上述情况就非常容易解决了。在你的 build.gradle 中做如下配置即可:

android {
  // ...
  defaultConfig {
    // ...
    multiDexEnabled true
  }
}

缺点

Multidex 也有一些缺点 。首先, 编译时间增加 。其次,在 Delvik 虚拟机下(非 ART),由于 classloader 需要读取多个 dex 文件,所以 应用的启动时间会大幅增加

但更严重的是,他有时候会造成你的 编译崩溃 。是的,编译崩溃,不是应用崩溃。

UNEXPECTED TOP-LEVEL ERROR: java.lang.OutOfMemoryError: GC overhead limit exceeded at com.android.dx.cf.code.ExecutionStack.copy(ExecutionStack.java:66) at com.android.dx.cf.code.Frame.makeExceptionHandlerStartFrame(Frame.java:397) at com.android.dx.cf.code.Ropper.processBlock(Ropper.java:916) at com.android.dx.cf.code.Ropper.doit(Ropper.java:742) at com.android.dx.cf.code.Ropper.convert(Ropper.java:349) at com.android.dx.dex.cf.CfTranslator.processMethods(CfTranslator.java:280) at com.android.dx.dex.cf.CfTranslator.translate0(CfTranslator.java:137) at com.android.dx.dex.cf.CfTranslator.translate(CfTranslator.java:93) at com.android.dx.command.dexer.Main.processClass(Main.java:729) at com.android.dx.command.dexer.Main.processFileBytes(Main.java:673) at com.android.dx.command.dexer.Main.access$300(Main.java:83) at com.android.dx.command.dexer.Main$1.processFileBytes(Main.java:602) at com.android.dx.cf.direct.ClassPathOpener.processArchive(ClassPathOpener.java:284) at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:166) at com.android.dx.cf.direct.ClassPathOpener.process(ClassPathOpener.java:144) at com.android.dx.command.dexer.Main.processOne(Main.java:632) at com.android.dx.command.dexer.Main.processAllFiles(Main.java:505) 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)

以上这些错误大致意思就是我们在生成 Dex 阶段内存不足了。

解决办法(太长不想看了)

感谢那谁给我意见(不好意思忘了是谁了,时间有点久了),在绞尽脑汁了一段时间之后,我找到了一个非常简单的解决办法。

那就是在你相应 module 的 build.gradle 文件中做出如下配置:

android {
  // ...
  dexOptions {
    javaMaxHeapSize “2048M”
  }
}

搞定!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

文章
评论
26 人气
更多

推荐作者

qq_aHcEbj

文章 0 评论 0

qq_ikhFfg

文章 0 评论 0

把昨日还给我

文章 0 评论 0

wj_zym

文章 0 评论 0

巴黎夜雨

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文