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

标签 java generics obfuscation gson proguard

我有这样一个类:

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 提示类未知。消息是:

Note: the configuration refers to the unknown class 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]
}

最佳答案

由于 java 类文件包含已删除的泛型,ProGuard 也需要已删除的类型。所以java.util.Queue<com.my.Package.MyOtherClass>应指定为 java.util.Queue .

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

比较。 ProGuard manual

关于java - ProGuard 混淆、java、Google Gson 和通用集合——如何保留成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8794220/

相关文章:

java 正则表达式 yyyyMMdd 中 1900-9999 的日期验证

java - 不断增加 YARN 中 Spark 应用程序的物理内存

c# - 使用反射查找通用方法时发现模糊匹配

c# - 如果 List<T> 的大小已知,是否值得初始化它的集合大小?

java - 是否值得混淆 Java Web 应用程序?

java - 带有 CheckGroup 的 CheckBoxMultipleChoice

swift - 我还如何为泛型类指定泛型集合类型?

objective-c - 反编译 Objective-C 预处理器语句

c++ - 如何隐藏二进制代码中的字符串?

java - HTTP 引荐来源网址。可靠吗?