如何修复 Google Drive REST API 的 Proguard 问题
How to fix Proguard issue with Google Drive REST API
我正在使用 Google Rest API v3 将我的 android 应用程序连接到 Google 云端硬盘。当我 运行 没有 Proguard (minifyEnabled=false) 时,一切都很好。但是,当我启用混淆器时,会调用错误的 REST API 方法。当我在驱动器根别名 "root" 上调用 Drive.Files.get().execute 时,我得到了 Drive.Files.list().execute 的结果。当我禁用 "minifyEnabled" 时,我看到了正确的结果。这是 build.gradle 控制 运行ning Proguard 的部分:
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 时,我仍然在 class 中看到重命名的成员,imo 应该是 "kept"。例如:
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 签名者 -> a
java.lang.String 回调 -> b
java.lang.String consumerKey -> c
java.lang.String 随机数 -> d
java.lang.String 领域 -> e
我本以为“-keep class com.google.**”会避免这种情况?
知道如何解决这个问题吗?
在此先致谢,
你需要
-keep class com.google.** { *;}
和
-keep class com.fasterxml.** { *;}
您也可以尝试从 SDK 中减少。这些规则非常广泛。
编辑:
宽规则意味着它可能会在您的项目中保留更多未使用的 类,因此 apk 大小和方法数量会更大。
在我的例子中,我必须保留这些:
-keep class br.project.pine.** { *;}
-keep class com.google.api.services.drive.** { *;}
提示:在调试模式下启用minify时,注意LogCat。它可以帮助你找出真正失踪的人package/class/attribute。
这个对我有用:
-keepclassmembers class * {
@com.google.api.client.util.Key <fields>;
}
如官方google样本所示:
我正在使用 Google Rest API v3 将我的 android 应用程序连接到 Google 云端硬盘。当我 运行 没有 Proguard (minifyEnabled=false) 时,一切都很好。但是,当我启用混淆器时,会调用错误的 REST API 方法。当我在驱动器根别名 "root" 上调用 Drive.Files.get().execute 时,我得到了 Drive.Files.list().execute 的结果。当我禁用 "minifyEnabled" 时,我看到了正确的结果。这是 build.gradle 控制 运行ning Proguard 的部分:
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 时,我仍然在 class 中看到重命名的成员,imo 应该是 "kept"。例如:
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 签名者 -> a java.lang.String 回调 -> b java.lang.String consumerKey -> c java.lang.String 随机数 -> d java.lang.String 领域 -> e
我本以为“-keep class com.google.**”会避免这种情况?
知道如何解决这个问题吗?
在此先致谢,
你需要
-keep class com.google.** { *;}
和
-keep class com.fasterxml.** { *;}
您也可以尝试从 SDK 中减少。这些规则非常广泛。
编辑: 宽规则意味着它可能会在您的项目中保留更多未使用的 类,因此 apk 大小和方法数量会更大。
在我的例子中,我必须保留这些:
-keep class br.project.pine.** { *;}
-keep class com.google.api.services.drive.** { *;}
提示:在调试模式下启用minify时,注意LogCat。它可以帮助你找出真正失踪的人package/class/attribute。
这个对我有用:
-keepclassmembers class * {
@com.google.api.client.util.Key <fields>;
}
如官方google样本所示: