2016-09-27 9 views
1

私はAndroidのサポート注釈ライブラリにある@VisibleForTesting注釈を使用していて、それは次のようになります。ProGuardにRetentionPolicy.SOURCEで要素を保存させることはできますか?

@Retention(SOURCE) 
public @interface VisibleForTesting { 
} 

私の理解では、ProGuardのは.classファイルに作用し、この注釈が利用できないため、その保持ポリシーのためにコンパイル時には、注釈付きのメソッドはすべて削除されます。私は自分のアプリケーションで自動テストを実行し、テストのために公開されたメソッドを使用してProGuardの設定がユースケースを壊さないことを確認したいと思います。

これらの要素をどうにかするためにProGuardを設定することはできますか?これまで私が試してみた:

-keep @android.support.annotation.VisibleForTesting class * 
-keep class android.support.annotation.** { 
    @**.VisibleForTesting *; 
} 
-keep interface android.support.annotation.** { 
    @**.VisibleForTesting *; 
} 

そして:

-keep interface android.support.annotation.VisibleForTesting 

-keepclasseswithmembers class * { 
    @android.support.annotation.VisibleForTesting *; 
} 

-keepclassmembers class ** { 
    @android.support.annotation.VisibleForTesting *; 
} 

をこれらの二つの構成は動作しません。 @Keepでメソッドにアノテートし、それらのメソッドを保持するようにProGuardを設定すると、メソッドは保持され、テストは合格します。しかし、これを行うことで、すべてのメソッドに2つの注釈を付ける必要があります。

注釈プロセッサにフックして、@VisibleForTestingの保存ポリシーを上書きすることはできますか?それとも、ビルドプロセスで既に遅すぎますか?

グアバの@VisibleForTestingRetentionPolicy.CLASSを使用し、AndroidサポートアノテーションライブラリはRetentionPolicy.SOURCEを使用します。私はポリシーを変更する要求を投稿することを検討していますが、それはおそらくパフォーマンスと非常にわずかに増加したファイルサイズのために、SOURCEに設定されていると思いますか?

2つの注釈(@VisibleForTestingおよび@Keep)以外のオプションはありますか?

答えて

2

RetentionPolicyの注釈== SOURCEは、ProGuardが動作している.classファイルには存在しません。したがって、決してマッチしないルールでそれらを使用する方法はありません。

注釈RetentionPolicy == CLASSの注釈は正常に動作します。必要に応じて、ProGuardを使用してリリースビルドでも削除することができます。

関連する問題