RestTemplate,Jackson和proguard

Eug*_*nov 4 obfuscation android proguard jackson resttemplate

我试图在混淆后让app工作.我有两个简单的类:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,在混淆和请求执行后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>(...);
    }
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

Eri*_*une 6

这些选项-keepclasseswithmembernames非常奇特:如果类具有所有指定的字段和方法,它会保留类(及其字段和方法)的名称.它主要用于保留JNI类和方法.

您可以保留带注释的字段和方法:

-keepclassmembers class * {
    @org.codehaus.jackson.annotate.* *;
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,您必须确保所有涉及的字段和方法都已注释.

保留序列化类的所有字段和方法可能更容易:

-keepclassmembers class com.example.ApiUrlResponseData,
                        com.example.Link {
    *;
}
Run Code Online (Sandbox Code Playgroud)

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

  • 您可能仍需要保留通用签名,方法是添加`-keepattributes Signature`.杰克逊可能会用反射来检索它们. (3认同)