【问题标题】:Release version with proguard issues - GSON带有 proguard 问题的发布版本 - GSON
【发布时间】:2014-11-13 17:22:45
【问题描述】:

如果我在调试中构建我的应用程序,它可以完美运行。但是,当我使用 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.** { *; }

【问题讨论】:

  • 尝试检查github.com/aws/aws-sdk-android-v2/blob/master/Proguard.html文件。它包含 proguard 的建议行。
  • 另外,如果您在 libs 文件夹中有 jar 文件,那么以下行可能会有所帮助:-libraryjars ./libs/[filename].jar
  • @bogumil 谢谢。尝试了您的建议,但问题仍然存在。查看我的问题的更新。
  • 您写道:亚马逊下载不起作用,您在 logcat 中有任何异常或任何信息吗?
  • @bogumil 嗨,我现在已将范围缩小到 GSON / JSON PARSER 的问题。按照 Google 的建议更新了 proguard 文件(请参阅问题更新),但问题仍然存在。

标签: android gson proguard


【解决方案1】:

终于解决了。 GSON 无法使用 fromJson 方法将我的 JSON 转换为类,因为 proguard 混淆了我类的字段。我必须为我在 json 反序列化期间使用的每个类添加:

-keepclassmembers class fully.qualified.path.to.class$innerclass { 
        private <fields>; 
}

与往常一样,GSON 文档中没有提及这一点。这是我接手的一个项目——我个人从未使用过 GSON,以后也不会使用。

给面临类似问题的人的几点说明:

  • 始终确保在使用库时包含所有 推荐(由图书馆 - 查看他们的网页)您的条目 proguard-rules.text 文件。

【讨论】:

  • 他们在你的 update2 的最后一行提到了你的类的完全限定路径,它将通过 Gson 序列化/反序列化 # 将通过 Gson 序列化/反序列化的应用程序类 -keep class com .google.gson.examples.android.model.** { ; }。您需要在此处提及*您的实际上课路径
  • 我几乎阅读了网络上关于这个问题的所有评论或回答,除了你的解决方案之外没有任何效果!上帝祝福你。我读过的许多答案已经建议包括 -keepclassmembers classfully.qualified.path.to.class.** { *;} 但由于我不明白的原因,该规则并不比使用 {private ;}。我欠你一杯啤酒。
【解决方案2】:

他们在 update2 的倒数第二行的 cmets 中提到了。

# Application classes that will be serialized/deserialized over Gson
-keep class com.google.gson.examples.android.model.** { *; }

将最后一行更改为将要序列化的类的代码中的实际路径。不要照原样复制粘贴。示例:

-keep class com.myclass.model.** { *; }

这对我有用。

【讨论】:

    猜你喜欢
    • 2016-02-11
    • 1970-01-01
    • 1970-01-01
    • 2018-09-25
    • 2016-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-29
    相关资源
    最近更新 更多