RestTemplate、Jackson和Proguard是什么?

4
我将尝试在混淆后让应用程序运行。我有两个简单的类:
public class ApiUrlResponseData
{

    @JsonProperty( "@links" )
    List<Link> links;

    public List<Link> getLinks()
    {
        return links;
    }
}

public class Link 
{
    @JsonProperty( "url" )
    String url;

    @JsonProperty( "name" )
    String name;

    @JsonProperty( "mobile" )
    Boolean mobile;

    public Link()
    {
    }

    public Link( String url, String name, Boolean mobile )
    {
        this.url = url;
        this.name = name;
        this.mobile = mobile;
    }

    public String getUrl()
    {
        return url;
    }

    public String getName()
    {
        return name;
    }

    public Boolean isMobile()
    {
        return mobile;
    }
}

很不幸,在混淆和请求执行后,ApiUrlResponseData.getLinks() 返回 null

这是我试图防止数据对象被混淆的方法:

 -keepclasseswithmembernames class com.companyname.android.network.data.** {
       public <fields>;
       protected <fields>;
       <fields>;

       @org.codehaus.jackson.annotate.* <fields>;
       @org.codehaus.jackson.annotate.* <init>(...);
    }

我错过了什么?
1个回答

7
选项-keepclasseswithmembernames相当独特:它会保留类(以及它们的字段和方法)的名称,如果这些类拥有全部指定的字段和方法。它主要用于保留JNI类和方法。
您可以保留已注释的字段和方法:
-keepclassmembers class * {
    @org.codehaus.jackson.annotate.* *;
}

不幸的是,您需要确保所有涉及字段和方法都有注解。

对于这样的序列化类,保持所有字段和方法可能会更容易:

-keepclassmembers class com.example.ApiUrlResponseData,
                        com.example.Link {
    *;
}

您可以使用通配符或注释来指定它们。

Eric,我现在得到了java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to android.network.dto.Link的错误。我需要保留名称或对类进行注释。正在检查。 - Eugen Martynov
3
您可能仍需要保留通用签名,通过添加“-keepattributes Signature”选项来实现。Jackson 可能会使用反射机制检索这些签名。 - Eric Lafortune

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接