Подтвердить что ты не робот

Как остановить Proguard от удаления параметров типа?

В настоящее время я пытаюсь запутать ряд библиотек. Моя базовая библиотека, которая содержит несколько классов и методов, которые используют параметры типа, непригодна для использования другим кодом из-за того, что параметры типа удаляются с помощью Obguard obfuscation. Устранение обфускации устраняет эти проблемы. Я прочитал все документы, примеры и устранение неполадок 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();
}
4b9b3361

Ответ 1

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

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

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

-keepattributes Signature