Обфускация ProGuard, Java, Google Gson и общие коллекции - как сохранить участников? - PullRequest
3 голосов
/ 09 января 2012

У меня есть такой класс:

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

Моя проблема в том, что я не могу заставить ProGuard сохранить myQueue после сериализации в json с помощью Google Gson. Что происходит, так это то, что имя члена 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. Он сериализуется как "а".

Остальная часть соответствующей конфигурации 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 Ответ

1 голос
/ 10 января 2012

Поскольку файлы классов Java содержат стертые обобщения, ProGuard также ожидает стертые типы.Поэтому java.util.Queue<com.my.Package.MyOtherClass> следует указывать как java.util.Queue.

Альтернатива с подстановочным знаком работает, если вы укажете java.** (с двойным ** для совпадения классов в подпакетах тоже).

Cfr, Руководство по ProGuard

...