3

次の「キープ」ルールをプロガード構成に入れると:

-keepclasseswithmembernames class ** implements com.my.package.MyInterfaceName { <fields>; }

最初は、 MyInterfaceName を実装するすべてのクラスがクラス名を取得し、フィールドが変更されないように見えます。

しかし、実際に実行すると、これらのクラスは getSimpleName() で別の単純な名前を返します。

たとえば、次のようにします。

public class Foo {
    public enum Bar implements MyInterfaceName { X, Y, Z }
}

X.getClass().getSimpleName()プロガードによって処理されずに返されるものFoo$Barだけではなく、返されます。Bar

4

2 に答える 2

0

Proguard は非常に攻撃的で、必要以上の情報を消去しています。幸いなことに、構成行のおかげでフルネームは変わりませんが、単純な名前には朗報ではありません。列挙型の完全な処理 (保持する必要のあるいくつかの魔法のメソッドもあります) については、 http://proguard.sourceforge.net/index.html#manual/examples.htmlProcessing enumeration classesのセクションを参照してください。

アプリケーション、アプレット、サーブレット、ライブラリなどに列挙クラスが含まれている場合は、いくつかの特別なメソッドを保持する必要があります。列挙型は Java 5 で導入されました。Java コンパイラは、列挙型を特別な構造を持つクラスに変換します。特に、これらのクラスには、ランタイム環境がイントロスペクションによってアクセスするいくつかの静的メソッドの実装が含まれています (それは単なる壮大なことではありませんか? イントロスペクションは、新世代の自己変更コードです)。これらが削除または難読化されないように、これらを明示的に指定する必要があります。

-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}
于 2013-04-08T15:04:09.153 に答える