Как вы мешаете Proguard удалить параметры типа?

В настоящее время я пытаюсь запутать ряд библиотек. Моя базовая библиотека, которая содержит несколько классов и методов, использующих параметры типа, не может использоваться другим кодом из-за того, что параметры типа удаляются обфускацией Proguard. Устранение запутывания устраняет эти проблемы. Я прочитал все документы по использованию ProGuard, примеры и способы устранения неполадок, но не смог найти никакой документации о том, как работать с параметрами типа или какой аспект ProGuard лишает параметры типа.

Тип конструктора Параметр Проблема:

Библиотека 1 содержит следующий класс:

public abstract class AbstractFactoryFactory<T>

Библиотека 2 содержит несколько классов, которые расширяют вышеуказанный класс, но конструктор выдает ошибку компилятора, которая гласит:

error: type AbstractFactoryFactory does not take parameters

Возвращаемый тип Параметр Проблема:

Библиотека 1 имеет класс Foo со следующим методом:

public List<String> doSomething()

Libary 2 пытается использовать метод doSomething, но после запутывания метод возвращает нетипизированный список, который генерирует следующую ошибку компилятора, в которой говорится:

error: incompatible types Object

Proguard.cfg

-dontoptimize

-renamesourcefileattribute SourceFile
-keepparameternames
-keepattributes Exceptions,*Annotation*,InnerClasses,SourceFile,LineNumberTable,Deprecated

-keep public class * {
    public protected *;
}

-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

-keepclassmembernames class * {
    java.lang.Class class$(java.lang.String);
    java.lang.Class class$(java.lang.String, boolean);
}

-keepclasseswithmembernames class * {
    native <methods>;
}

-keepclassmembers class * implements java.io.Serializable {
    static final long serialVersionUID;
    private static final java.io.ObjectStreamField[] serialPersistentFields;
    private void writeObject(java.io.ObjectOutputStream);
    private void readObject(java.io.ObjectInputStream);
    java.lang.Object writeReplace();
    java.lang.Object readResolve();
}

1 ответ

Решение

Согласно руководству по использованию типовой библиотеки ProGuard:

Атрибут "Signature" необходим для доступа к универсальным типам при компиляции в JDK 5.0 и выше.

Добавление следующей строки устранило мои проблемы с отсутствующими параметрами типа:

-keepattributes Signature
Другие вопросы по тегам