5

我有一个基于 Android 的应用程序,它使用 Rest 服务连接到 Google App Engine,该应用程序运行良好,直到它在发布前通过 ProGuard 被混淆。

运行混淆应用时,LogCat 报错如下:

Unable to convert a [application/json,UTF-8] representation into an object of 
  class com.enterprisemk.android.bcw.bincollection.WasteCollectionAreasContainer

org.codehaus.jackson.map.JsonMappingException: No suitable constructor found 
  for type [simple type, class 
  com.enterprisemk.android.bcw.bincollection.WasteCollectionAreasContainer]: 
  can not instantiate from JSON object (need to add/enable type information?)

我的 proguard-project.txt 文件中有以下内容:

-keepattributes *Annotation*,EnclosingMethod

-keep public class org.w3c.** {public private protected *;}
-dontwarn org.w3c.**

-keep public class org.joda.time.** {public private protected *;}
-dontwarn org.joda.time.**

-keep public class org.restlet.** { *; }
-dontwarn org.restlet.**

-keep public class org.codehaus.** { *; }
-dontwarn org.codehaus.**

-keepattributes Signature
-keepnames class com.fasterxml.jackson.** { *; }
-dontwarn com.fasterxml.jackson.databind.**

错误所指的我的班级看起来像:

public class WasteCollectionAreasContainer {

 public List<WasteCollectionAreas> wasteCollectionAreasList;

 public List<WasteCollectionAreas> getWasteCollectionAreasList() {
     return wasteCollectionAreasList;
 }

 public void setWasteCollectionAreasist(List<WasteCollectionAreas> wasteCollectionAreasList) {
     this.wasteCollectionAreasList = wasteCollectionAreasList;
 }

 public WasteCollectionAreasContainer() {
     wasteCollectionAreasList = new ArrayList<WasteCollectionAreas>();
 }

 @JsonCreator
 public WasteCollectionAreasContainer(List<WasteCollectionAreas> wasteCollectionAreasList) {
     this.wasteCollectionAreasList = wasteCollectionAreasList;
 }
}

在通过 ProGuard 进行混淆之前重申,该应用程序运行良好。
谁能帮我解决这个问题?

4

3 回答 3

2

将以下内容添加到您的Proguard.config. 它将帮助您定位问题。

-verbose 
-dump class_files.txt 
-printseeds seeds.txt 
-printusage unused.txt 
-printmapping mapping.txt

我的 proguard-project.txt 文件中有以下内容

我相信你应该使用proguard-android-optimize.txt,而不是proguard-android.txt

为了完整起见,感谢Android Security Discussions上的 Riley Hassell提供的技巧。

于 2013-04-03T19:46:16.703 回答
1

错误信息

org.codehaus.jackson.map.JsonMappingException: No suitable constructor found for type
    [simple type, class com.enterprisemk.android.bcw.bincollection.WasteCollectionAreasContainer]:
    can not instantiate from JSON object (need to add/enable type information?)

表明杰克逊库正在尝试使用反射反序列化您的类,并使用其原始名称和带注释的构造函数。ProGuard 无法预见这一点,因此它可能已经删除或重命名了该类及其构造函数。您可能需要明确保留它们:

-keep class com.enterprisemk.android.bcw.bincollection.WasteCollectionAreasContainer {
    <init>(java.util.List);
}

出于同样的原因,可能还有其他类似的类/字段/方法需要保留。

于 2013-04-04T23:12:04.387 回答
1

如果其他人遇到此问题,更好的解决方案如下:

# keep anything annotated with @JsonCreator
-keepclassmembers public class * {
     @com.fasterxml.jackson.annotation.JsonCreator *;
}

这会保留使用 JsonCreator 注释的任何方法,在这种情况下可能想要这样做。如果您有多个类需要加载,那么您可以避免必须单独指定每个类。

于 2015-09-19T22:30:01.103 回答