在 Android Studio 中启用 R8 Shrinker 时超出 GC 开销限制

Posted

技术标签:

【中文标题】在 Android Studio 中启用 R8 Shrinker 时超出 GC 开销限制【英文标题】:GC overhead limit exceeded when enable R8 Shrinker in Android Studio 【发布时间】:2019-06-07 06:58:04 【问题描述】:

我使用的是 android Studio 3.4 (Canary 9),当我构建我的应用程序时,它失败并出现以下错误

任务:app:transformClassesAndResourcesWithR8ForDebug

R8 是一个 实验特征。如果您遇到任何问题,请提交错误 在https://issuetracker.google.com,使用 'Shrinker (R8)' 作为组件 姓名。您可以通过更新 gradle.properties 来禁用 R8 'android.enableR8=false'。

AGPBI: "kind":"warning","text":"缺少类: java.lang.instrument.ClassFileTransformer","sources":[],"tool":"D8"

任务 :app:transformClassesAndResourcesWithR8ForDebug 失败

FAILURE:构建失败并出现异常。

出了什么问题:任务“:app:transformClassesAndResourcesWithR8ForDebug”执行失败。

超出 GC 开销限制

当我通过将android.enableR8=false 放入 gradle.properties 来禁用 R8 时。一切正常。

那么如何在不禁用 R8 Shrinker 的情况下修复此错误?因为我真的很想测试 R8 的功能。

【问题讨论】:

您对org.gradle.jvmargs 有特定设置还是使用默认设置? 在我的 AS 3.3 R8 中工作正常。 @shadowsheep 是的,它在 AS 3.3 上工作,但是当我升级时,它不再工作。顺便说一句,我没有使用任何自定义 jvm args 所以,尝试调整内存设置,例如 org.gradle.jvmargs=-XX\:MaxHeapSize\=1024m -Xmx4608M 或更多。让我们看看它是否解决了。告诉我。 @nhoxbypass 我得到了相同的 gc 开销错误。你找到解决办法了吗? 【参考方案1】:

正如您所说,您没有使用任何自定义JVM args,请尝试一下。

在您的gradle.properties 文件中尝试memory settings 的多个值。例如尝试设置

org.gradle.jvmargs=-Xmx4096m

根据评论部分的建议:

指定用于守护进程的 JVM 参数。

该设置对于调整内存设置特别有用。

org.gradle.jvmargs=-Xmx1536m

我在我的项目中使用了 R8,一切正常。

【讨论】:

使用 gradle 版本 5.1.1(在 gradle-wrapper.properties 中)这不起作用(也没有设置堆大小和 Xmx 为 4 GB),但实际 5.4.1 版本可以工作(也与仅将 Xmx 设置为 2 GB)。 确保使用 gradle.properties 而不是 gradle-wrapper.properties 使用 Android Studio 3.5.2 为我工作。这也提高了我的构建速度。 在 Jenkins 上使用 com.android.tools.build:gradle:4.2.1 构建时不起作用【参考方案2】:

有时添加 JVM 堆内存并不能解决问题,尤其是在内存有限的系统上,它会导致其他问题。我的建议是尝试更换垃圾收集器。

org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+UseConcMarkSweepGC

超过 GC 开销限制是默认情况下抛出的异常 java 8 垃圾收集器(并行)。就我而言,它解决了问题。

【讨论】:

以上是关于在 Android Studio 中启用 R8 Shrinker 时超出 GC 开销限制的主要内容,如果未能解决你的问题,请参考以下文章

Progruard 和 R8 被弃用 - Android Studio 3.6

无法从 R8 配置中删除“-ignorewarnings”(Android Proguard 问题)

R8 和 Proguard 规则

同时使用 ProGuard 和 R8

如何在android studio中启用proguard? [复制]

如何在android studio中启用proguard? [重复]