Android/java:从 ProGuard 到 R8 的过渡/迁移?

Posted

技术标签:

【中文标题】Android/java:从 ProGuard 到 R8 的过渡/迁移?【英文标题】:Android/java: Transition / Migration from ProGuard to R8? 【发布时间】:2019-03-19 23:31:08 【问题描述】:

我想知道如何从 ProGuard 过渡/迁移到 R8

我应该从我的 Gradle 文件中删除与 Proguard 相关的行并添加 android.enableR8 = true 行吗?

谢谢。

【问题讨论】:

伙计们,您可能会发现这很有帮助 - ***.com/a/60786850/4694013 【参考方案1】:

Proguard 由 GuardSquare 开发和维护,而 R8 由 Android 团队开发和维护,这意味着它们是两个不同的产品,尽管 R8 与 Proguard 兼容。

从这里看到https://www.guardsquare.com/en/blog/proguard-and-r8

ProGuard 和 R8 的兼容性

对开发者来说,好消息是 R8 向后兼容 ProGuard。如果你有工作 ProGuard 配置(可能从 *** 不拘一格地复制), 你可以把它带到R8。它目前仍然忽略一些 选项。值得注意的是,R8 没有实现选项 -whyareyoukeeping 和 -addconfigurationdebugging,我们认为这对快速至关重要 正如我们在之前的博客中所解释的那样,得到一个有效的配置。

是的,android.enableR8 = true 将启用 R8 功能。

另外请注意,R8 目前(截至 Android Studio 3.2.1 时)不支持 Android 存档库 (AAR) 项目。仅在构建 APK 文件时使用。


编辑#1

来自@Archie, 如果您使用的是 Gradle 插件版本 3.4.0 及更高版本,R8 默认为 on

见:https://developer.android.com/studio/releases#r8-default


编辑#2

对于从 Proguard 到 R8 的转换,您可以按照以下步骤操作:

1.禁用 Proguard

更新 buildTypes 配置以禁用 Proguard,例如对于release 构建类型:

   android 
       ...
       buildTypes 
           release 
               useProguard false // <-- disable proguard
               minifyEnabled true // <-- enable minification
               proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
           
       
       ...
   

在 Android Studio 3.4 上,useProguard 默认为 false。 R8默认开启。

2。 (可选)设置完整的 R8 配置报告文件

在您的proguard-rules.pro 中添加以下行,以输出 R8 在构建项目时应用的所有规则的完整报告。

// You can specify any path and filename.
-printconfiguration <your-path>/full-r8-config.txt

3.生成混淆应用。

./gradlew assembleRelease

4. (可选)微调和故障排除

找到您的 &lt;your-path&gt;/full-r8-config.txt 以微调配置或进行故障排除(如果有)。

参考资料:

https://developer.android.com/studio/build/shrink-code.html#configuration-files

【讨论】:

您知道在哪里启用android.enableR8 = true 吗?我在一个“旧”的空项目中遇到了这个问题(刚刚做了一系列 Android 开发人员更新)。我不知道在哪里启用该设置,所以我擦除了项目并创建了一个新项目,希望我可以将该信息添加为评论,但在 grepping 新文件后我发现我没有此行的条目。 将此行添加到 gradle.properties 如果您使用的是 Gradle 版本 3.3.0 及更高版本,则默认情况下 R8 处于打开状态。见:developer.android.com/studio/releases#r8-default R8 从 3.4.0 开始默认开启,而不是 3.3.0。您链接的变更日志部分适用于 3.4.0。如果您对 ProGuard 和 R8 之间的一些行为差异感兴趣,我工作的公司 PreEmptive Solutions 已经整理了一些文档,试图在此处涵盖这些差异:r8-docs.preemptive.com。 还有一件事是 useProguard 将从 DSL 中弃用。如果有人想继续使用 proguard 而不是 R8,请在 gradle.properties 中设置 android.enableR8 = false。见:issuetracker.google.com/issues/129758703

以上是关于Android/java:从 ProGuard 到 R8 的过渡/迁移?的主要内容,如果未能解决你的问题,请参考以下文章

Android/Java 混淆:R8 与(ProGuard 或 DexGuard)?

Android:Java:Proguard:如何:验证我的 jar(不同的 jar 项目)/apk 是不是已成功处理? (我正在考虑对其进行逆向工程)

在启用 Proguard 的情况下将 Play 服务从 8.1 更新到 8.3

Proguard 使用 Google Play 服务库返回错误

升级 gradle 后 Proguard 行为发生变化,从构建的 apk 中省略类

从 Proguard 获取“未解决的引用”和“找不到超类”警告