Как вы мешаете 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