Google API Drive、Sheets 和 Calendar Android 应用程序在“android.enableR8.fullMode=true”中所需的正确 R8 规则集是什么?

问题描述 投票:0回答:2

在以前版本的 Android 应用程序中,此 R8 规则足以从 Google API 库中保留所需的 GSON 相关部分:

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

更新库和 Android Studio(从 Eel 到 Flamingo)后,应用程序回归到仅在缩小版本中出现的问题,并且仅在运行时出现。这是因为 R8 默认运行

android.enableR8.fullMode=true
.

想通了,附加规则:

-keepclassmembers class com.google.api.client.googleapis.json.GoogleJsonError {
    public *;
}

-keepclassmembers class com.google.api.client.googleapis.json.GoogleJsonError$* {
    public *; 
}

-keepclassmembers public class  com.google.api.services.drive.model.* extends com.google.api.client.json.GenericJson {
    public *;
}

-keepclassmembers public class  com.google.api.services.sheets.v4.model.* extends com.google.api.client.json.GenericJson {
    public *;
}

-keepclassmembers public class  com.google.api.services.calendar.model.* extends com.google.api.client.json.GenericJson {
    public *;
}

将解决示例案例中的新问题。模式很明确:

model
包类必须显式保留。

这是一次非常令人不满意的体验,因为它需要通过测试来发现问题,并且 R8 和库的未来更改可能会使根据经验确定的规则无效。

Google API 库似乎应该附带由库知识建立的所需 R8(即 Proguard)规则,以及由开发人员完成的非常全面的测试套件。

我的问题是,这个资源存在吗?

android google-drive-api google-calendar-api google-sheets-api
2个回答
1
投票

据我所知,没有集中资源为所有 Google API 库提供一套完整的 Proguard 规则。有时他们会在特定库的文档中写下您需要使用的规则(例如,在 Firebase 实时数据库 中)。

但在大多数情况下,需要测试构建的发布版本以尝试获得一些崩溃。


0
投票

库可以而且确实包含 R8/Proguard 规则。例如:

google-api-client/META-INF/proguard/google-api-client.pro

包含规则:

-keep public class com.google.api.client.googleapis.GoogleUtils

代码可以包含在库中以保留内容。有很多“黑客” 像下面这样:

static {
    // hack to force ProGuard to consider BandedRange used, since otherwise it would be stripped out
    // see https://github.com/google/google-api-java-client/issues/543
    com.google.api.client.util.Data.nullOf(BandedRange.class);
}

Android 库可以包括以下内容:

    defaultConfig {
        consumerProguardFiles "consumer-rules.pro"
    }

将规则文件嵌入到库“.aar”中,这些保留规则是 由图书馆的所有客户应用,除非明确不包括:

        release {
            optimization {
                keepRules {
                    ignoreExternalDependencies 'com.hanafey.android.gapiu:gapiu'
                }
            }
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            minifyEnabled true
            signingConfig signingConfigs.release_testing
        }

图书馆指定保留规则的一个问题是它们可以保留更多 比在特定情况下需要的多。这对于一个大的尤其如此 客户端只使用其中一部分的库。图书馆的“消费者规则”。 pro' 无法说明客户的实际需求。保持规则做 不允许像“如果使用函数 X 那么因为 X 使用反射访问库的其他部分,一个保留的“X” 还必须拖动“P”、“Q”和“R”。

© www.soinside.com 2019 - 2024. All rights reserved.