如何让 R8 + proguard-android-optimize.txt + Google Drive API 无缝运行?
How to make R8 + proguard-android-optimize.txt + Google Drive API works seamlessly?
这是我们的R8版本
当前版本是:1.4.94(构建 390954928f0db9c3b888a367f7f128ce3bbfb160 来自 go/r8bot(luci-r8-ci-archive-0-5g74))。
当我从
切换
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
至
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
我们收到以下错误。
com.google.api.client.googleapis.json.GoogleJsonResponseException: 403 Forbidden
{
"code": 403,
"errors": [
{
"domain": "usageLimits",
"message": "Daily Limit for Unauthenticated Use Exceeded. Continued use requires signup.",
"reason": "dailyLimitExceededUnreg",
"extendedHelp": "https://code.google.com/apis/console"
}
],
"message": "Daily Limit for Unauthenticated Use Exceeded. Continued use requires signup."
}
at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:113)
at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:40)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.interceptResponse(AbstractGoogleClientRequest.java:378)
at com.google.api.client.http.HttpRequest.a(HttpRequest.java:1067)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:476)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:409)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:526)
at com.yocto.wenote.sync.Utils.searchFromGoogleDrive(Utils.java:808)
崩溃发生在以下代码处
try {
Drive.Files.List request = drive.files().list().setSpaces(APP_DATA_FOLDER)
.setQ("name = '" + Utils.getWeNoteZipFileTitle() + "'")
.setFields("nextPageToken, files(id, name, modifiedTime)")
.setOrderBy("modifiedTime desc")
.setPageSize(10);
do {
FileList fileList = request.execute(); // <-- This is line Utils.java:808
请注意,在我们从 proguard-android.txt
切换到 proguard-android-optimize.txt
之前,上面的代码可以 100% 正常工作。
好像是在proguard-android-optimize.txt
的基础上,R8剥离了一些重要的信息,导致调用Google驱动器API失败。
任何人如何使 proguard-android-optimize.txt
与 Google 驱动器 API 一起工作?
用 Proguard 替换 R8 怎么样?
如果我通过应用 android.enableR8=false
(仍在使用 proguard-android-optimize.txt
)来使用 ProGuard 版本 6.0.3,则 运行 Google Drive [=56] 时没有问题=] 相关代码.
我的 Google 驱动器 API 库
// For Google Drive REST API - https://github.com/gsuitedevs/android-samples/blob/master/drive/deprecation/app/build.gradle
implementation('com.google.http-client:google-http-client-gson:1.26.0') {
exclude group: 'org.apache.httpcomponents'
}
implementation('com.google.api-client:google-api-client-android:1.26.0') {
exclude group: 'org.apache.httpcomponents'
}
implementation('com.google.apis:google-api-services-drive:v3-rev136-1.25.0') {
exclude group: 'org.apache.httpcomponents'
}
我完整的proguard文件
-keep class * implements android.os.Parcelable {
*;
}
# https://github.com/huanghaibin-dev/CalendarView
-keep class com.yocto.wenote.calendar.CustomWeekView {
public <init>(android.content.Context);
}
-keep class com.yocto.wenote.calendar.CustomMonthView {
public <init>(android.content.Context);
}
-keep class com.yocto.wenote.calendar.CustomWeekBar {
public <init>(android.content.Context);
}
-keep class com.yocto.wenote.calendar.FullscreenCustomWeekBar {
public <init>(android.content.Context);
}
-keep class com.haibin.calendarview.DefaultWeekView {
public <init>(android.content.Context);
}
-keep class com.haibin.calendarview.DefaultYearView {
public <init>(android.content.Context);
}
#
# http://proguard.sourceforge.net/index.html#manual/examples.html (Producing useful obfuscated stack traces)
-renamesourcefileattribute SourceFile
-keepattributes SourceFile,LineNumberTable,InnerClasses
# https://github.com/bumptech/glide
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public class * extends com.bumptech.glide.module.AppGlideModule
-keep public enum com.bumptech.glide.load.ImageHeaderParser$** {
**[] $VALUES;
public *;
}
# Used in menu/search_toolbar_menu.xml
-keep class com.yocto.wenote.search.SearchView {
*;
}
# setHintTextTypeface & setFloatTextTypeface & setFloatTextColor
-keep class com.google.android.material.textfield.TextInputLayout {
*;
}
# setHintTextTypeface & setFloatTextTypeface
-keep class com.google.android.material.internal.CollapsingTextHelper {
*;
}
# setMaxHeight & setMinimumHeight
-keep class android.widget.ImageView {
public <methods>;
}
-keep class com.yocto.wenote.recording.RippleBackground$RippleView {
void setScaleX(***);
void setScaleY(***);
}
# https://github.com/zhihu/Matisse
-dontwarn com.squareup.picasso.**
-dontwarn com.bumptech.glide.**
# For Google Drive API
-dontwarn com.google.common.**
-dontwarn com.google.api.client.util.**
-keep class * extends com.google.api.client.json.GenericJson {
*;
}
-keep class com.google.api.services.drive.** {
*;
}
# VerifyError in Android 4
# https://github.com/material-components/material-components-android/issues/397
-keep class com.google.android.material.tabs.TabLayout$Tab {
*;
}
# http://developer.android.com/google/play/billing/billing_best_practices.html#obfuscate
-keep class com.android.vending.billing.**
# https://r8.googlesource.com/r8/+/refs/heads/master/compatibility-faq.md
-keepclassmembers,allowobfuscation class * {
@com.google.gson.annotations.SerializedName <fields>;
}
#
-assumenosideeffects class android.util.Log {
public static boolean isLoggable(java.lang.String, int);
public static int v(...);
public static int i(...);
public static int w(...);
public static int d(...);
public static int e(...);
}
#
-assumenosideeffects class com.yocto.wenote.Utils {
public static void trackView(...);
public static void trackEvent(...);
}
你能试试下面的保留规则吗?
-keepclassmembers class * {
@com.google.api.client.util.Key <fields>;
}
googleapi客户端通过反射使用com.google.api.client.util.Key:
https://developers.google.com/api-client-library/java/google-http-java-client/setup
这似乎适用于报告了类似问题的其他人。
这是我们的R8版本
当前版本是:1.4.94(构建 390954928f0db9c3b888a367f7f128ce3bbfb160 来自 go/r8bot(luci-r8-ci-archive-0-5g74))。
当我从
切换buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
至
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
我们收到以下错误。
com.google.api.client.googleapis.json.GoogleJsonResponseException: 403 Forbidden
{
"code": 403,
"errors": [
{
"domain": "usageLimits",
"message": "Daily Limit for Unauthenticated Use Exceeded. Continued use requires signup.",
"reason": "dailyLimitExceededUnreg",
"extendedHelp": "https://code.google.com/apis/console"
}
],
"message": "Daily Limit for Unauthenticated Use Exceeded. Continued use requires signup."
}
at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:113)
at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:40)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.interceptResponse(AbstractGoogleClientRequest.java:378)
at com.google.api.client.http.HttpRequest.a(HttpRequest.java:1067)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:476)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:409)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:526)
at com.yocto.wenote.sync.Utils.searchFromGoogleDrive(Utils.java:808)
崩溃发生在以下代码处
try {
Drive.Files.List request = drive.files().list().setSpaces(APP_DATA_FOLDER)
.setQ("name = '" + Utils.getWeNoteZipFileTitle() + "'")
.setFields("nextPageToken, files(id, name, modifiedTime)")
.setOrderBy("modifiedTime desc")
.setPageSize(10);
do {
FileList fileList = request.execute(); // <-- This is line Utils.java:808
请注意,在我们从 proguard-android.txt
切换到 proguard-android-optimize.txt
之前,上面的代码可以 100% 正常工作。
好像是在proguard-android-optimize.txt
的基础上,R8剥离了一些重要的信息,导致调用Google驱动器API失败。
任何人如何使 proguard-android-optimize.txt
与 Google 驱动器 API 一起工作?
用 Proguard 替换 R8 怎么样?
如果我通过应用 android.enableR8=false
(仍在使用 proguard-android-optimize.txt
)来使用 ProGuard 版本 6.0.3,则 运行 Google Drive [=56] 时没有问题=] 相关代码.
我的 Google 驱动器 API 库
// For Google Drive REST API - https://github.com/gsuitedevs/android-samples/blob/master/drive/deprecation/app/build.gradle
implementation('com.google.http-client:google-http-client-gson:1.26.0') {
exclude group: 'org.apache.httpcomponents'
}
implementation('com.google.api-client:google-api-client-android:1.26.0') {
exclude group: 'org.apache.httpcomponents'
}
implementation('com.google.apis:google-api-services-drive:v3-rev136-1.25.0') {
exclude group: 'org.apache.httpcomponents'
}
我完整的proguard文件
-keep class * implements android.os.Parcelable {
*;
}
# https://github.com/huanghaibin-dev/CalendarView
-keep class com.yocto.wenote.calendar.CustomWeekView {
public <init>(android.content.Context);
}
-keep class com.yocto.wenote.calendar.CustomMonthView {
public <init>(android.content.Context);
}
-keep class com.yocto.wenote.calendar.CustomWeekBar {
public <init>(android.content.Context);
}
-keep class com.yocto.wenote.calendar.FullscreenCustomWeekBar {
public <init>(android.content.Context);
}
-keep class com.haibin.calendarview.DefaultWeekView {
public <init>(android.content.Context);
}
-keep class com.haibin.calendarview.DefaultYearView {
public <init>(android.content.Context);
}
#
# http://proguard.sourceforge.net/index.html#manual/examples.html (Producing useful obfuscated stack traces)
-renamesourcefileattribute SourceFile
-keepattributes SourceFile,LineNumberTable,InnerClasses
# https://github.com/bumptech/glide
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public class * extends com.bumptech.glide.module.AppGlideModule
-keep public enum com.bumptech.glide.load.ImageHeaderParser$** {
**[] $VALUES;
public *;
}
# Used in menu/search_toolbar_menu.xml
-keep class com.yocto.wenote.search.SearchView {
*;
}
# setHintTextTypeface & setFloatTextTypeface & setFloatTextColor
-keep class com.google.android.material.textfield.TextInputLayout {
*;
}
# setHintTextTypeface & setFloatTextTypeface
-keep class com.google.android.material.internal.CollapsingTextHelper {
*;
}
# setMaxHeight & setMinimumHeight
-keep class android.widget.ImageView {
public <methods>;
}
-keep class com.yocto.wenote.recording.RippleBackground$RippleView {
void setScaleX(***);
void setScaleY(***);
}
# https://github.com/zhihu/Matisse
-dontwarn com.squareup.picasso.**
-dontwarn com.bumptech.glide.**
# For Google Drive API
-dontwarn com.google.common.**
-dontwarn com.google.api.client.util.**
-keep class * extends com.google.api.client.json.GenericJson {
*;
}
-keep class com.google.api.services.drive.** {
*;
}
# VerifyError in Android 4
# https://github.com/material-components/material-components-android/issues/397
-keep class com.google.android.material.tabs.TabLayout$Tab {
*;
}
# http://developer.android.com/google/play/billing/billing_best_practices.html#obfuscate
-keep class com.android.vending.billing.**
# https://r8.googlesource.com/r8/+/refs/heads/master/compatibility-faq.md
-keepclassmembers,allowobfuscation class * {
@com.google.gson.annotations.SerializedName <fields>;
}
#
-assumenosideeffects class android.util.Log {
public static boolean isLoggable(java.lang.String, int);
public static int v(...);
public static int i(...);
public static int w(...);
public static int d(...);
public static int e(...);
}
#
-assumenosideeffects class com.yocto.wenote.Utils {
public static void trackView(...);
public static void trackEvent(...);
}
你能试试下面的保留规则吗?
-keepclassmembers class * {
@com.google.api.client.util.Key <fields>;
}
googleapi客户端通过反射使用com.google.api.client.util.Key: https://developers.google.com/api-client-library/java/google-http-java-client/setup
这似乎适用于报告了类似问题的其他人。