2

プロガードが注釈に基づいて物事を保持するのに問題があります(Androidの下)。

com.example.Keep という注釈があります。

@Target({ ElementType.TYPE, ElementType.FIELD, ElementType.METHOD, ElementType.CONSTRUCTOR })
public @interface Keep {
}

私はリフレクションによってのみ構築されるクラスを持っています:

public class Bar extends Foo {
    @com.example.Keep
    Bar(String a, String b) { super(a, b); }

    //...
}

期待どおりに動作します(難読化されたクラス名を使用しても、クラスはコンストラクターを保持します)私のプロガード構成に以下が含まれている場合:

-keepattributes Signature,*Annotation*,SourceFile,LineNumberTable
-keepclassmembers class ** extends com.example.Bar {
<init>(...);
}

それを次のように変更しようとすると、コンストラクターが削除されます。

-keepattributes Signature,*Annotation*,SourceFile,LineNumberTable
-keepclassmembers class ** extends com.example.Bar {
@com.example.Keep <init>(...);
}

私自身の注釈とプロガードのannotation.jar注釈の両方で同じ動作が見られます。Foo の のインポートから注釈名をコピーして貼り付けたKeepので、タイプミスや不適切なインポートではないと確信しています。

私が欠けているかもしれないものを誰かが考えることができますか?

4

1 に答える 1

7

注釈がプログラム コードとして処理されている場合は、明示的に保持する必要があります。

-keep,allowobfuscation @interface *

その理由はやや技術的なものです。ProGuard は縮小ステップでそれらを削除する可能性があるため、最適化ステップと難読化ステップでは効果がなくなります。

Cfr. ProGuard マニュアル > トラブルシューティング >クラスまたはクラス メンバーが保持されない

于 2013-07-03T00:09:05.603 に答える