如果我在调试中构建我的应用程序,它可以完美运行。但是,当我使用proguard构建发布时,我会遇到几个错误,然后构建失败。错误摘要:
Warning:there were 445 unresolved references to classes or interfaces.
Warning:there were 13 instances of library classes depending on program classes.
我修改了我的proguard-rules.txt文件,如下所示。这使得构建成功,但是当我安装应用程序时,亚马逊下载不起作用(在调试版本中工作)。
-keep class org.xmlpull.v1.**
-keep class org.apache.http.**
-keep class org.ietf.jgss.**
-keep class com.amazonaws.services.**
-keep class org.w3c.dom.bootstrap.**
-dontwarn org.xmlpull.v1.**
-dontwarn org.apache.http.**
-dontwarn org.ietf.jgss.**
-dontwarn com.amazonaws.services.**
-dontwarn org.w3c.dom.bootstrap.**
有关我如何解决这个问题的建议吗?
更新
已将其缩小到GSON / JSONPARSER问题。对于发行版本,JSONPARSER不会像在调试中那样将下载的json转换为提供的类。还添加了GSON proguard规则(参见更新2),但问题仍然存在。
-keep class org.apache.commons.logging.** { *; }
-keep class com.amazonaws.services.sqs.QueueUrlHandler { *; }
-keep class com.amazonaws.javax.xml.transform.sax.* { public *; }
-keep class com.amazonaws.javax.xml.stream.** { *; }
-keep class com.amazonaws.services.**.model.*Exception* { *; }
-keep class com.amazonaws.internal.** { *; }
-keep class org.codehaus.** { *; }
-keep class org.joda.convert.* { *; }
-keepattributes Signature,*Annotation*,EnclosingMethod
-keepnames class com.fasterxml.jackson.** { *; }
-keepnames class com.amazonaws.** { *; }
-dontwarn com.amazonaws.auth.policy.conditions.S3ConditionFactory
-dontwarn org.joda.time.**
-dontwarn com.fasterxml.jackson.databind.**
-dontwarn javax.xml.stream.events.**
-dontwarn org.codehaus.jackson.**
-dontwarn org.apache.commons.logging.impl.**
-dontwarn org.apache.http.conn.scheme.**
-dontwarn org.apache.http.annotation.**
-dontwarn org.ietf.jgss.**
-dontwarn org.w3c.dom.bootstrap.**
-dontwarn org.xmlpull.v1.**
-dontwarn com.amazonaws.services.**
-libraryjars libs/aws-android-sdk-1.7.1.1-core.jar
-libraryjars libs/aws-android-sdk-1.7.1.1-s3.jar
-libraryjars libs/gson-2.2.4.jar
-libraryjars libs/ksoap2-android-assembly-3.3.0-jar-with-dependencies.jar
更新2
# Gson uses generic type information stored in a class file when working with fields. Proguard
# removes such information by default, so configure it to keep all of it.
-keepattributes Signature
# For using GSON @Expose annotation
-keepattributes *Annotation*
# Gson specific classes
-keep class sun.misc.Unsafe { *; }
-keep class com.google.gson.stream.** { *; }
# Application classes that will be serialized/deserialized over Gson
-keep class com.google.gson.examples.android.model.** { *; }
答案 0 :(得分:9)
终于解决了。 GSON无法使用fromJson
方法将我的JSON转换为类,因为proguard已经混淆了我的类的字段。我必须为json反序列化期间使用的每个类添加:
-keepclassmembers class fully.qualified.path.to.class$innerclass {
private <fields>;
}
按照惯例,在GSON文档中没有提到这一点。这是我接手的一个项目 - 我个人从未使用过GSON,将来也不会这样做。
面对类似问题的人的一些注意事项:
答案 1 :(得分:1)
他们在update2的第二行最后一行的评论中提到过。
# Application classes that will be serialized/deserialized over Gson
-keep class com.google.gson.examples.android.model.** { *; }
将最后一行更改为代码中的实际路径,以便将其序列化。不要按原样复制粘贴。例如:
-keep class com.myclass.model。** {*; }
这对我有用。