【问题标题】:How to fix Proguard issue with Google Drive REST API如何使用 Google Drive REST API 修复 Proguard 问题
【发布时间】:2016-11-02 11:21:22
【问题描述】:

我正在使用 Google Rest API v3 将我的 Android 应用程序连接到 Google Drive。当我在没有 Proguard (minifyEnabled=false) 的情况下运行时,一切都很好。但是,当我启用 proguard 时,会调用错误的 REST API 方法。当我在驱动器根别名“root”上调用 Drive.Files.get().execute 时,我得到 Drive.Files.list().execute 的结果。当我禁用“minifyEnabled”时,我看到了正确的结果。下面是控制 Proguard 运行的 build.gradle 部分:

buildTypes {
    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
    debug {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}

默认的 Proguard 文件是随 Android Studio 2.2 分发的未经修改的文件(不是优化版本)

这是我的 proguard-rules.pro 文件的内容

-keepattributes EnclosingMethod
-keepattributes InnerClasses
-dontoptimize

-keep class com.google.**
-keep class com.fasterxml.**
-dontwarn com.google.**

当我签入生成的 mapping.txt 时,我仍然看到 imo 应该“保留”的类中重命名的成员。例如:

com.google.api.client.auth.oauth.OAuthParameters -> com.google.api.client.auth.oauth.OAuthParameters: java.security.SecureRandom 随机-> l com.google.api.client.auth.oauth.OAuthSigner 签名者 -> 一个 java.lang.String 回调 -> b java.lang.String consumerKey -> c java.lang.String nonce -> d java.lang.String 领域 -> e

我会认为“-keep class com.google.**”会避免这种情况?

知道如何解决这个问题吗?

提前致谢,

【问题讨论】:

  • 你修好了吗?我面临同样的问题。知道的请帮忙。谢谢
  • 是的,请参阅我 2016 年 11 月 2 日的最后一条评论“我能够缩小范围......”

标签: android google-drive-api android-proguard


【解决方案1】:

这个对我有用:

-keepclassmembers class * {
  @com.google.api.client.util.Key <fields>;
}

如官方谷歌示例所示:

https://github.com/google/google-api-java-client-samples/blob/master/tasks-android-sample/proguard-google-api-client.txt

【讨论】:

  • 经过测试,效果很好。我发现这是最有效的修复,因为此修复仅保留绝对必要的类成员的原始源代码,而不是一揽子保留。我鼓励其他开发人员验证并投票选出最有效的答案。
  • 很好的解决方案
  • 经过 2-3 小时的研究后,这个成功了。非常感谢。
【解决方案2】:

你需要

-keep class com.google.** { *;} 

-keep class com.fasterxml.** { *;}

您也可以尝试减少 SDK 的使用量。这些规则非常广泛。

编辑: 宽规则意味着它可能会在您的项目中保留更多未使用的类,因此 apk 大小和方法数会更大。

【讨论】:

  • 不幸的是,这没有帮助。 Drive API 调用仍然混淆,在 mapping.txt 中我仍然看到在 com.google 类成员中重命名
  • 当我将它添加到主模块的 proguard-rules.pro 时它仍然失败,但是,当我将它添加到主模块所依赖的模块时,(实际使用的模块Drive API),它的工作原理!非常感谢。
  • 我能够将其缩小到这些保留:-keep,allowshrinking class com.google.api.services.drive.model.** { ;} -keep,allowshrinking class com .google.api.services.drive. { *;}
  • 工作就像一个魅力。经过 5 小时试图弄清楚发生了什么,这篇文章挽救了生命。就我而言,创建签名的 APK 后,我在将文件上传到 Google Drive 时遇到问题。在调试模式下,问题无法重现。不知何故,ProGuard 处理正在消除 setName 对 MetaData 的影响。最终效果是所有文件都以文件名 NULL 上传。再次感谢您的帖子!
  • 嗨,Alex,您的解决方案可能也有效,我只是投了反对票,因为 Evgeni Roitburg 修复程序准确地指出了问题。正如您所说的那样,它是一个全面的修复,我们越少保护原始源代码就越安全。好作品,请继续努力。如果可能,请改进您的答案,以便开发人员了解该广泛规则的含义。
【解决方案3】:

在我的情况下,我不得不把这些保持:

-keep class br.project.pine.** { *;}
-keep class com.google.api.services.drive.** { *;}

提示:在调试模式下启用 minify 时,请注意 LogCat。它可以帮助您找出真正丢失的包/类/属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-05
    • 2018-07-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多