ProGuard 混淆、java、Google Gson 和泛型集合——如何留住成员?

Posted

技术标签:

【中文标题】ProGuard 混淆、java、Google Gson 和泛型集合——如何留住成员?【英文标题】:ProGuard obfuscation, java, Google Gson and generic collections - how to keep members? 【发布时间】:2012-02-06 07:55:30 【问题描述】:

我有这样的课:

public class MyClass

    private Queue<MyOtherClass> myQueue;

我的问题是,在使用 Google Gson 序列化为 json 后,我无法让 ProGuard 保留 myQueue。发生的情况是成员名称“myQueue”被序列化为“a”。显然,反序列化会中断。

这是我尝试过的一些 ProGuard 配置。

-keepclassmembers class com.my.package.MyClass 
    #private java.util.Queue<com.my.package.MyOtherClass> myQueue;
    #private java.util.Queue<com.my.package.*> myQueue;
    private java.* myQueue;

private java.util.Queue<com.my.package.MyOtherClass> myQueue;

...ProGuard 抱怨这个类是未知的。消息是:

注意:配置参考未知类java.util.Queue&lt;com.my.Package.MyOtherClass&gt;'

使用

private java.* myQueue; 

....摆脱了 ProGuard 警告,但是,正如我所说,成员 myQueue 没有保留在 json 输出中。它被序列化为“a”。

其余的相关 ProGuard 配置如下:

-renamesourcefileattribute SourceFile
-keepattributes SourceFile,LineNumberTable
-keepattributes *Annotation*
#gson
-keepattributes Signature
-adaptresourcefilenames    **.properties,**.gif,**.jpg,**.png,**.wav
-adaptresourcefilecontents **.properties,META-INF/MANIFEST.MF
-optimizationpasses 3
-overloadaggressively
-repackageclasses ''
-allowaccessmodification

-keep public class com.my.package.MyOtherClass 


-keepclassmembers class com.my.package.MyOtherClass 
    [a large number of private members are listed]

【问题讨论】:

【参考方案1】:

由于 java 类文件包含擦除泛型,ProGuard 也需要擦除类型。所以java.util.Queue&lt;com.my.Package.MyOtherClass&gt;应该指定为java.util.Queue

如果您指定java.**(也可以使用双**来匹配子包中的类),则使用通配符的替代方案也有效。

参照。 ProGuard manual

【讨论】:

谢谢。我正在为手册而苦苦挣扎。我还没有弄清楚要获得我期望的序列化成员名称需要什么。在大多数情况下,我需要对确切的成员名称进行序列化。这是我目前的问题。但是,在少数情况下,我使用了 @SerializedName("betterName") protected String PoorName;而且我还没有达到可以查看@SerializedName 是否正常工作的地步……

以上是关于ProGuard 混淆、java、Google Gson 和泛型集合——如何留住成员?的主要内容,如果未能解决你的问题,请参考以下文章

使用 proguard 混淆后,使用 google guice 注入不再起作用

ProGuard:ClassCastException

Proguard 混淆时保持类“实现”

将新的 Google 登录添加到 Android 应用程序后的 Proguard 混淆问题

通过将 proguard 规则映射文件上传到 google play 控制台去混淆生产 Android 错误

使用 ProGuard 混淆 clojure uberjars