在 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 问题)