有proguard问题的版本 - GSON。

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

如果我在调试中构建我的应用程序,它可以完美地工作。然而,当我使用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.**

有什么建议可以让我解决这个问题吗?

更新。

已将其缩小到GSONJSONPARSER的问题。对于发布版,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.** { *; }
android gson proguard
2个回答
10
投票

终于解决了。GSON无法将我的JSON转换为类,使用的是 fromJson 方法,因为proguard混淆了我的类的字段。我不得不在json反序列化过程中为我的每一个类添加。

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

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

给那些面临类似问题的人一些说明。

  • 当你使用一个库时,一定要确保在你的proguard-rules.text文件中包含所有推荐的(由该库推荐的--见他们的网页)条目。

0
投票

他们在update2的最后一行评论中提到了。

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

将最后一行改成你的实际路径,在代码里面,将被序列化的类。不要照样复制粘贴。举个例子。

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

这对我很有效

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