android - 使用 Android Studio 的 Google Cloud Endpoints 模板时的 Proguard 配置

标签 android google-app-engine android-studio proguard google-cloud-endpoints

我们需要存储和检索用户在线使用我们的应用生成的内容。为此,我们决定使用 Android Studio 集成的 Google Cloud Endpoints 模板来快速创建 API(官方使用示例 here )。

它在调试中运行良好,但在 Release模式下,启用 Proguard 时,它会失败。更糟糕的是,我找不到任何关于将 Proguard 与 Android Studio 的端点模板结合使用的文档或示例。

经过一个小时左右的摸索并尝试让它工作后,proguard-rules.pro 现在看起来像这样:

-keep class com.google.api.** { public *; }
-dontwarn com.google.api.**
-keep class com.google.common.** { public *; }
-dontwarn com.google.common.**

# Not allowed to post company and app names, but this line is correct in the real file
-keep class com.companyname.appname.application.backend.** { *; }

使用此配置,我在我的 ArrayAdapter 中遇到类转换异常:

java.lang.ClassCastException: com.google.api.client.util.ArrayMap cannot be cast to com.companyname.appname.application.backend.messageApi.model.Message

似乎没有在某处执行返回数据的转换,我得到的不是 Message 对象的 List,而是 List com.google.api.client.util.ArrayMap 对象(顺便说一句,它们确实包含有效数据)。

我可以检查应用程序是否在 Release模式下运行并手动进行转换,但是,这是一种 hacky 方式,我更愿意正确地进行。那么,有人可以告诉我 Proguard 配置文件中缺少什么吗?

最佳答案

我在我的一个应用程序中对端点执行类似的操作。我在使用 Proguard 时也遇到了一些问题(不记得具体是什么了)。

我的 Proguard 规则的这一部分似乎适用:

# Needed by google-api-client to keep generic types and @Key annotations accessed via reflection
-keepclassmembers class * {
  @com.google.api.client.util.Key <fields>;
}
-keepattributes Signature,RuntimeVisibleAnnotations,AnnotationDefault

不知道有没有必要,我也有这一段:

# Play Services
-dontwarn com.google.android.gms.**
-dontwarn com.google.common.cache.**
-dontwarn com.google.common.primitives.**
-keep class * extends java.util.ListResourceBundle {
    protected Object[][] getContents();
}
-keep public class com.google.android.gms.common.internal.safeparcel.SafeParcelable {
    public static final *** NULL;
}
-keepnames @com.google.android.gms.common.annotation.KeepName class *
-keepclassmembernames class * {
    @com.google.android.gms.common.annotation.KeepName *;
}

希望对您有所帮助。

关于android - 使用 Android Studio 的 Google Cloud Endpoints 模板时的 Proguard 配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28254625/

相关文章:

android - 线程游戏 “event loop”中的Actor/消息传递

Java:解压缩文件,而不创建目标文件夹

java - 如何找出回收站 View 捕捉到的项目?

php - Google Cloud SQL 和 PHP 教程不是在编辑数据库吗?

android - 如何在 Android Studio 中恢复旧的提交对话框窗口?

java - 如何在Java中使用TextView Android Studio在函数中显示文本

python - 使用 AppEngine XMPP 进行客户端通知

database - Google 的 App Engine 是否适合基于事务的系统

android - 无法在android studio中调试应用程序

Android Studio 未启动 : Fatal error initializing 'com. intellij.util.indexing.FileBasedIndex