问题标签 [android-r8]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2315 浏览

android - R8 完整模式的真正作用是什么(积极优化)?

R8 官方文档说要激活额外的优化,我必须在文件中插入这个gradle.properties

文档说,为了使应用程序工作,我必须设置一些保留规则,但没有关于它如何工作以及它执行什么操作的详细信息:

由于额外的优化使 R8 的行为与 ProGuard 不同,它们可能需要您包含额外的 ProGuard 规则以避免运行时问题。例如,假设您的代码通过 Java 反射 API 引用了一个类。默认情况下,R8 假定您打算在运行时检查和操作该类的对象(即使您的代码实际上不这样做),它会自动保留该类及其静态初始化程序。

但是,当使用“完整模式”时,R8 不会做出此假设,并且如果 R8 断言您的代码在运行时不会使用该类,它会从您的应用程序的最终 DEX 中删除该类。也就是说,如果要保留类及其静态初始化程序,则需要在规则文件中包含一个保留规则来执行此操作。

文档建议的常见问题解答的链接仅说明了这一点:

R8全模式

在完整模式下,R8 执行更积极的优化,这意味着可能需要额外的 ProGuard 配置规则。本节重点介绍使用完整模式时出现的一些常见问题。

android.enableR8.fullMode真正如何运作?

非常感谢!

0 投票
1 回答
1280 浏览

android - Xamarin Android 应用程序在使用 r8 收缩编译时崩溃

我想让我的应用程序更小。起初,我是用 proguard 来解决这个问题的,然后我今天找到了 R8。我无法使用 proguard 缩小我的应用程序。R8也不行。

我将 R8 与Visual Studio Professional 2019一起使用。编译成功并出现一些警告,但是在我使用 R8 在发布模式下编译我的应用程序后,我的应用程序崩溃了。与proguard相同。警告如下所述。在调试模式或发布模式下编译时它工作正常而不收缩。

这是我在手机上运行应用程序时获得的设备日志。它发生在应用程序显示其飞溅期间。

在第三行可以看到 “DryIoc.ContainerException: Undefined Method '"GetDefault"' in Type DryIoc.ReflectionTools (包括 non-public=True)”。 我假设 R8 删除了 DryIoc 中的 GetDefault 方法,因为我可以在 DryIoc 代码的第 12,052 行看到 GetDefault 方法。 https://github.com/dadhi/DryIoc/blob/master/src/DryIoc/Container.cs

然后我在 proguard.cfg 中写了“keep”,如下所示。但它似乎不起作用。错误是一样的,应用程序的大小也是一样的。

我不确定它是否相关,但是当我使用 R8 编译此应用程序时收到了一些警告。它说没有办法解决两个 mscrolib 版本之间的冲突。到目前为止,我也找不到解决这些警告的方法。

这是当前Android项目下的proguard.cfg。

关于 DryIoc 的最后三个规则似乎不起作用。它不会改变归档结果的大小。

谢谢!

0 投票
1 回答
1180 浏览

android - 具有 DataBinding 和 R8 的 Android 动态功能

我在动态功能模块中使用 DataBinding 时遇到问题。

我无法生成与我的片段相关的绑定对象isMinifyEnabled = true

通常,我尝试使用此代码来执行此操作: val viewDataBinding: FragmentFeature1Binding = DataBindingUtil.inflate(inflater, layoutId, container, false) 但返回的inflate()值始终为 null 而没有任何附加消息。我尝试FragmentFeature1Binding直接使用膨胀布局,但我得到了相同的结果。

当我将片段移动到app模块中时,一切正常。

我的应用程序build.gradle.kts

我的特点1 build.gradle.kts

我的proguard-rules.pro

如果没有 R8,一切都会正常工作,所以我认为缺少一些规则,但我尝试了一些配置,遗憾的是谷歌没有官方配置。

0 投票
0 回答
504 浏览

android - Firebase / Fabric Crashlytics 和 Proguard / R8

我有一个项目,我已从 Fabric 迁移到 firebase Crashlytics。这一切最初都很好,我按预期收到了 Firebase 的崩溃报告。在过去的几个月里,Firebase 不再显示任何崩溃报告,而 Fabric 仍然显示。

应用程序构建过程当前使用 R8,但我也尝试使用 Proguard 和 R8 Full Mode 无济于事。

我检查了 Proguard 的配置,并在 proguard 规则文件中得到了我认为正确的规则:

如果我在未签名/保护它的情况下运行应用程序,则会按预期收到崩溃(使用强制崩溃Crashlytics.getInstance().crash())。

其他奇怪的事情是,当使用 强制保护的构建崩溃时Crashlytics.getInstance().crash(),而不是崩溃并显示标准的 android 弹出窗口说应用程序已关闭,应用程序反而冻结并坐在那里什么都不做,除非我强制关闭它。

打开 Firebase Crashlytics 登录adb并查看日志(使用命令adb logcat -s Fabric CrashlyticsCore)后,我只看到了经过保护的构建:

与非防护版本的以下内容相比:

我现在不知道还有什么问题,因为自从问题开始以来,关于 proguard 的任何内容都没有改变。有谁知道这可能不起作用的任何其他原因以及如何解决它们?

0 投票
2 回答
1849 浏览

android - Proguard (R8) 否定操作员不工作以保留某些包以外的任何东西

proguard 中的否定符(感叹号)应该允许我保留除 apache 库之外的东西:

根据这些答案。这就是要走的路:

但是,它混淆了我的 APK 中的所有类。

这是我的 build.gradle 的一部分(我有 Android Studio 3.5.3)

在我添加-printconfiguration到我的proguard-rules.pro文件后,我看到有很多-keep规则遵循我的 -keep class !org.apache.**

Ezekiel Baniaga建议的这种方法也没有奏效。相反,它保留了包括 apache 包在内的所有内容:

proguard-rules.pro

0 投票
2 回答
456 浏览

android - 在 Android 中使用 R8 和 Proguard 时如何保护数据模型类免受逆向工程的影响?

现在,在对 android 应用程序 APK 文件进行逆向工程时,我可以看到纯文本中的数据模型类,因为我使用了@keep注释。如果没有注释,应用程序将崩溃,因为这些文件正在被 R8 删除。

如何通过确保在逆向工程中看不到它们来保护数据模型文件?

0 投票
1 回答
175 浏览

android - 有没有办法混淆类名而不是 R8 的成员

我有一堆用 GSON 进行(反)序列化的改造请求/响应类。

我目前使用@Keep 来确保 R8 不会将它们抽象化,或者混淆属性名称(GSON 需要这些名称)。

有什么方法可以混淆类名而不混淆属性名等...

0 投票
0 回答
2529 浏览

android - 如何使用 Android R8 为远程 aar 文件保留类名和方法名?

我正在通过创建一个 aar 文件来编写 Android Studio 库。我将此文件安装在专用网络的 Maven 存储库中。我现在试图让用户只知道类名和方法名,在 Stackoverflow library obfuscation using proguard中的这个问题的帮助下,但没有成功。我成功地做到了只有几个类名和构造函数名,而方法名被混淆为字母(a(),b()......)。现在,当我像这样在 build.gradle 文件中本地获取库时,一切正常

但不是那样

第一个包括显示所有类及其名称和方法名称,而第二个仅显示少数类名和构造函数名称,正如我之前所说。

项目的 build.gradle 文件

保护文件

应用程序的 build.gradle 文件

我可以做些什么来解决这个问题?先感谢您!

0 投票
1 回答
80 浏览

android - 如何在 Android Gradle 插件上的 R8Transform 之后添加新的 Transform?

我想在 R8Transform 之后的所有方法中插入一些代码。我怎样才能做到?

当我registerTransform()在我的插件中使用时,它总是发生在 R8Transform 之前。

我想我可以使用反射(hacker R8Transform)来做到这一点,这是唯一的方法吗?

0 投票
1 回答
120 浏览

android - 如何在 Bazel 项目中为 d8 设置命令行标志?

例如,如果我想设置--min-api为 26:https ://r8.googlesource.com/r8/+/b9cb6ae34047f19320885d9e2c594f81364fa896/src/main/java/com/android/tools/r8/D8CommandParser.java#120

我已经尝试了.bazelrc使用 Bazel-s标志的各种组合,以查看使用其标志调用的子命令,但我没有看到任何我想要的添加:

  • build:d8 --define=min-api=26
  • build:d8 --min-api=26
  • build:d8 --min-api 26

理想情况下,尽管这将设置在 BUILD 文件中的某个位置,因此它可以针对每个目标进行配置。