问题标签 [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.
android - R8 完整模式的真正作用是什么(积极优化)?
R8 官方文档说要激活额外的优化,我必须在文件中插入这个gradle.properties
:
文档说,为了使应用程序工作,我必须设置一些保留规则,但没有关于它如何工作以及它执行什么操作的详细信息:
由于额外的优化使 R8 的行为与 ProGuard 不同,它们可能需要您包含额外的 ProGuard 规则以避免运行时问题。例如,假设您的代码通过 Java 反射 API 引用了一个类。默认情况下,R8 假定您打算在运行时检查和操作该类的对象(即使您的代码实际上不这样做),它会自动保留该类及其静态初始化程序。
但是,当使用“完整模式”时,R8 不会做出此假设,并且如果 R8 断言您的代码在运行时不会使用该类,它会从您的应用程序的最终 DEX 中删除该类。也就是说,如果要保留类及其静态初始化程序,则需要在规则文件中包含一个保留规则来执行此操作。
文档建议的常见问题解答的链接仅说明了这一点:
R8全模式
在完整模式下,R8 执行更积极的优化,这意味着可能需要额外的 ProGuard 配置规则。本节重点介绍使用完整模式时出现的一些常见问题。
android.enableR8.fullMode
真正如何运作?
非常感谢!
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 的最后三个规则似乎不起作用。它不会改变归档结果的大小。
谢谢!
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,一切都会正常工作,所以我认为缺少一些规则,但我尝试了一些配置,遗憾的是谷歌没有官方配置。
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 的任何内容都没有改变。有谁知道这可能不起作用的任何其他原因以及如何解决它们?
android - Proguard (R8) 否定操作员不工作以保留某些包以外的任何东西
proguard 中的否定符(感叹号)应该允许我保留除 apache 库之外的东西:
根据这些答案。这就是要走的路:
- 如何用 Proguard 否定类名
- 为大型 Android 应用程序中的两个包启用 Proguard
- Android proguard 忽略除一个之外的所有类
- Proguard Android 不会混淆除少数类之外的任何内容
- Proguard:如何保留除特定条件之外的所有内容?
- 我们可以缩小所有类,但只用 proguard 混淆一些类吗?
但是,它混淆了我的 APK 中的所有类。
这是我的 build.gradle 的一部分(我有 Android Studio 3.5.3)
在我添加-printconfiguration
到我的proguard-rules.pro
文件后,我看到有很多-keep
规则遵循我的 -keep class !org.apache.**
Ezekiel Baniaga建议的这种方法也没有奏效。相反,它保留了包括 apache 包在内的所有内容:
proguard-rules.pro
android - 在 Android 中使用 R8 和 Proguard 时如何保护数据模型类免受逆向工程的影响?
现在,在对 android 应用程序 APK 文件进行逆向工程时,我可以看到纯文本中的数据模型类,因为我使用了@keep
注释。如果没有注释,应用程序将崩溃,因为这些文件正在被 R8 删除。
如何通过确保在逆向工程中看不到它们来保护数据模型文件?
android - 有没有办法混淆类名而不是 R8 的成员
我有一堆用 GSON 进行(反)序列化的改造请求/响应类。
我目前使用@Keep 来确保 R8 不会将它们抽象化,或者混淆属性名称(GSON 需要这些名称)。
有什么方法可以混淆类名而不混淆属性名等...
android - 如何使用 Android R8 为远程 aar 文件保留类名和方法名?
我正在通过创建一个 aar 文件来编写 Android Studio 库。我将此文件安装在专用网络的 Maven 存储库中。我现在试图让用户只知道类名和方法名,在 Stackoverflow library obfuscation using proguard中的这个问题的帮助下,但没有成功。我成功地做到了只有几个类名和构造函数名,而方法名被混淆为字母(a(),b()......)。现在,当我像这样在 build.gradle 文件中本地获取库时,一切正常
但不是那样
第一个包括显示所有类及其名称和方法名称,而第二个仅显示少数类名和构造函数名称,正如我之前所说。
项目的 build.gradle 文件
保护文件
应用程序的 build.gradle 文件
我可以做些什么来解决这个问题?先感谢您!
android - 如何在 Android Gradle 插件上的 R8Transform 之后添加新的 Transform?
我想在 R8Transform 之后的所有方法中插入一些代码。我怎样才能做到?
当我registerTransform()
在我的插件中使用时,它总是发生在 R8Transform 之前。
我想我可以使用反射(hacker R8Transform)来做到这一点,这是唯一的方法吗?
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 文件中的某个位置,因此它可以针对每个目标进行配置。