web-dev-qa-db-ja.com

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();
}
34
Nick Johnson

ProGuardによると 一般的なライブラリの使用ガイド

JDK 5.0以降でコンパイルするときにジェネリック型にアクセスできるようにするには、「Signature」属性が必要です。

次の行を追加すると、型パラメーターが欠落しているという問題が修正されました。

-keepattributes Signature
58
Nick Johnson