ProGuard混淆,java,Google Gson和通用集合 - 如何保留成员?

时间:2012-01-09 19:46:38

标签: java generics obfuscation gson proguard

我有一个这样的课程:

public class MyClass
{
    private Queue<MyOtherClass> myQueue;
}

我的问题是我无法让ProGuard在使用Google Gson序列化到json之后保留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<com.my.Package.MyOtherClass>'

使用

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 个答案:

答案 0 :(得分:1)

由于java类文件包含擦除的泛型,ProGuard也期望擦除类型。因此java.util.Queue<com.my.Package.MyOtherClass>应指定为java.util.Queue

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

(CFR)。 ProGuard manual