我们需要存储和检索用户在线使用我们的应用生成的内容。为此,我们决定使用Android Studio集成的Google Cloud Endpoints模板快速创建API(官方使用示例 here)。
它在调试中工作正常,但在发布模式下,启用Proguard后,它会失败。更糟糕的是,我没有找到任何关于在Android Studio的终端模板中使用Proguard的文档或示例。
经过一个小时左右的探索并试图让它工作, 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
似乎未在某处执行返回数据的转换,而不是List
Message
个List
个对象,我得到com.google.api.client.util.ArrayMap
个{{1}}个对象(它们顺便说一下,确实包含有效数据。
我可以检查应用程序是否在发布模式下运行并手动进行转换,但是,这是一种hacky方式,我宁愿正确地执行此操作。那么,有人可以告诉我Proguard配置文件中缺少什么吗?
答案 0 :(得分:18)
我在其中一个应用中使用端点做类似的事情。我也有一些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 *;
}
希望它有所帮助。