Android gradle plugin v3.3.0 -> 使用 proguard 时找不到 R$raw

Posted

技术标签:

【中文标题】Android gradle plugin v3.3.0 -> 使用 proguard 时找不到 R$raw【英文标题】:Android gradle plugin v3.3.0 -> can't find R$raw when using proguard 【发布时间】:2019-06-10 12:36:30 【问题描述】:

刚刚更新到 android gradle 插件版本 3.3.0

我们有以下设置(不确定哪些重要):

具有 3 个库模块(数据、域、实用程序)的应用程序项目(app)

已启用数据绑定 (databinding.enabled true)

Proguard 已启用(proguardFiles 'proguard-rules.pro')

当我使用以下方式构建应用程序时:

./gradlew assembleDevRelease

我收到以下错误:

can't find referenced class my.package.data.R$raw

当我使用以下方式构建应用程序时:

./gradlew :app:assembleDevRelease

应用程序构建良好,生成一个我可以安装的混淆 *.apk

问题:

assembleRelease:app:assembleRelease有什么区别

- 为什么切换到 android gradle 插件 3.3.0 会影响我必须调用哪个任务来构建我的 apk?我们在 CI 管道中的任何地方都使用 assembleRelease 来构建我们的 apk。

android gradle 插件 3.3.0 中导致任务 assembleRelease 中断的哪些变化?我们在 CI 管道中的任何地方都使用 assembleRelease 来构建我们的 apk。

有什么建议可以让 'assembleRelease' 再次工作吗? (更新 Proguard 配置?启用 R8?)

【问题讨论】:

【参考方案1】:

assembleRelease:app:assembleRelease有什么区别

前者在相对于当前级别的所有模块上运行assembleRelease 任务。后者仅在 app 模块(及其依赖项)上运行它。

为什么切换到 android gradle plugin 3.3.0 会影响我必须调用哪个任务来构建我的 apk?我们在 CI 管道中的任何地方都使用 assembleRelease 来构建我们的 apk。

该问题没有足够的信息可以肯定地说,但release notes 中列出了许多更改。例如,此问题可能与:

更快地为库项目生成 R 类:以前,Android Gradle 插件会为项目的每个依赖项生成一个R.java 文件,然后将这些 R 类与应用的其他类一起编译。该插件现在直接生成一个包含应用程序编译的 R 类的 JAR,而无需先构建中间 R.java 类。此优化可能会显着提高包含许多库子项目和依赖项的项目的构建性能,并提高 Android Studio 中的索引速度。

【讨论】:

谢谢,我很确定更改与我们面临的问题有关。但我不知道在哪里寻找“恢复”旧行为。或者禁用什么。 我们只是开始在我们的构建管道中到处使用app:assembleRelease。在我们的例子中,这会导致构建速度稍微快一些,问题就消失了……目前,我们使用的是 3.5.1 版本,我还没有检查该版本中是否仍然存在问题。

以上是关于Android gradle plugin v3.3.0 -> 使用 proguard 时找不到 R$raw的主要内容,如果未能解决你的问题,请参考以下文章

Gradle之Android Gradle Plugin 主要 Task 分析

Android Studio Gradle Plugin开发入门指南

Android Studio Gradle Plugin开发入门指南

Android自定义Aop的Gradle Plugin

Android Gradle 5.0 更新:原因:org.jetbrains.plugins.gradle.tooling.util

Android Gradle 插件Gradle 自定义 Plugin 插件 ⑥ ( 在 buildSrc 模块中依赖 Android Gradle 插件 | 完整代码示例 )