1

私は2つのインターフェースを持っています

public interface Base {
   void methA();
   void methB();
   void methC();
}

public interface Sub extends Base {
   @MyAnnotation("a")
   void methA();
   @MyAnnotation("b")
   void methB();
   @MyAnnotation("c")
   void methC();
   @MyAnnotation("d")
   void methD();
   @MyAnnotation("e")
   void methE();
}

プロガードの後、私はこの2つのインターフェースを持っています

public interface a{
   void a();
   void b();
   void c();
}

public interface b extends a{
   @MyAnnotation("d")
   void d();
   @MyAnnotation("e")
   void e();
}

しかし、2番目のものには必要です

public interface b extends a{
   @MyAnnotation("a")
   void a();
   @MyAnnotation("b")
   void b();
   @MyAnnotation("c")
   void c();
   @MyAnnotation("d")
   void d();
   @MyAnnotation("e")
   void e();
}

つまり、注釈付きのオーバーライド メソッドが必要です。メソッド名は気にしません。注釈が必要なだけです。

の注釈を設定することはできませんa。ベース インターフェイスには 2 つあるため (おそらく後でもっと)、他の値を設定するサブ インターフェイスがありますbc@MyAnnotation

それで、サブインターフェースに重複したメソッド名を保持するようにプロガードに指示する方法はありますか?

4

2 に答える 2

1

私は解決策を見つけました!:)

-keepclassmembers,allowobfuscation,allowoptimization interface * extends path.to.my.interface.Base{*;}

これにより、多かれ少なかれ、インターフェイスを拡張するBaseインターフェイスの縮小が無効になります。

于 2013-09-29T12:37:51.887 に答える
0

Proguard には、最適化を無効にする専用のフラグがあります。一般的な表記法は次のとおりです。

-dontoptimize

ただし、すべての最適化がオフになるため、特定のケースでは望ましくない場合があります。実際には、最適化フィルターを明示的に指定することで、無効にする最適化を選択できます。

-dontoptimize optimization_filter_name

ここでどちらが役立つかは 100% わかりませんが、class/merging/verticalフィルターがインターフェイスの重複メソッドの削除に関与していると思われます。ここで最適化リストを見つけて、どれが役立つか試してみてください。

于 2013-09-29T11:16:46.683 に答える