Proguard 和 com.google.android.gms.common.api.internal.BasePendingResult$ReleasableResultGuardian

Posted

技术标签:

【中文标题】Proguard 和 com.google.android.gms.common.api.internal.BasePendingResult$ReleasableResultGuardian【英文标题】:Proguard and com.google.android.gms.common.api.internal.BasePendingResult$ReleasableResultGuardian 【发布时间】:2019-10-17 20:55:59 【问题描述】:

play-services-base-16.0.1.aar (mvnrepository) 有proguard.txt,内容如下:

# b/35135904 Ensure that proguard will not strip the mResultGuardian.
-keepclassmembers class com.google.android.gms.common.api.internal.BasePendingResult 
  com.google.android.gms.common.api.internal.BasePendingResult$ReleasableResultGuardian mResultGuardian;

但是您可以在classes.jar 中看到mResultGuardian 的类型已经被混淆为BasePendingResult.zaa。我想这就是我得到的原因

Note: the configuration refers to the unknown class 'com.google.android.gms.common.api.internal.BasePendingResult$ReleasableResultGuardian'

这应该如何工作?我是 Proguard 的新手,对正在发生的事情只有非常基本的了解,所以请让你的答案简单:)

项目详情:

gradlew version: 5.4
build plugin: com.android.tools.build:gradle:3.2.0

很遗憾,我现在无法将 gradle build 插件更新为 3.3.*3.4.*,因为某些脚本不兼容,需要进行大量重构。

app/proguard.txt(来自我看到的建议):

-keep class com.google.android.gms.analytics.**  *; 
-keep class com.google.android.gms.gcm.**  *; 
-dontwarn com.google.android.gms.**

但这无济于事。

UPD

我最终升级到 com.android.tools.build:gradle:3.4.1(必须调整一些 api 更改)这解决了问题,但我仍然不明白应该如何使用这样的规则。

【问题讨论】:

【参考方案1】:

“如果在您的项目中设置了 proguard,它会在构建过程中为我们完成一些工作:缩小、混淆、重新打包和优化。如果您使用 gradle,启用它很简单,只需在 build.gradle 中为您的 release buildType 设置 minifyEnabled 为 true 并传递默认的 android 优化规则集。

这将有助于缩小、加速和保护您的应用。然而,它主要通过删除从未被调用的代码并重命名剩下的代码来工作。在您遇到反思之前,这一切都很好。 反射使您可以编写可以根据名称(以及其他内容)查找和执行其他代码的代码”

“如果您或您的应用程序中的任何库使用反射,您也可以使用 ProGuard,您可以在此处指定有关您的应用程序 ProGuard 的哪些类、方法和其他部分应该单独保留的规则。你可以在一个文件中列出所有这些规则,然后通过 build.gradle 中的 proguardFiles 方法将它们传递给 ProGuard。一般约定是将此文件称为 proguard-rules.pro”

这些doc1、doc2 为您提供有关如何使用规则的更多信息

【讨论】:

以上是关于Proguard 和 com.google.android.gms.common.api.internal.BasePendingResult$ReleasableResultGuardian的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 和 Proguard

同时使用 ProGuard 和 R8

Proguard和R8有啥区别?

Proguard 和错误

Java 和 ProGuard - 使用类加载器 AntClassLoader 找不到 taskdef 类 proguard.ant.ProGuardTask

Android - Proguard 和改造 2?