2016-09-27 54 views
1

我使用@VisibleForTesting註釋坐落於Android的支持Annotation庫,它看起來像這樣:是否可以讓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以保留這些方法,則會保留這些方法並通過測試。但是,通過這樣做,我必須用兩個註釋來註釋所有方法。

是否可以掛鉤註釋處理器並覆蓋@VisibleForTesting的保留策略?或者在構建過程中已經太遲了?

番石榴的@VisibleForTesting使用RetentionPolicy.CLASS,而Android支持註釋庫使用RetentionPolicy.SOURCE。我正在考慮發佈更改政策的請求,但由於某種原因,我認爲它設置爲SOURCE,可能是由於性能和文件大小略有增加?

除了使用兩個註釋(@VisibleForTesting@Keep)之外是否還有其他選擇?

回答

2

帶有RetentionPolicy == SOURCE的註釋不存在於ProGuard所運行的.class文件中。因此,無法在規則中使用它們,因爲它們永遠不會匹配。

註釋RetentionPolicy == CLASS應該可以正常工作。如果需要,甚至可以使用ProGuard在發佈版本中刪除它們。

相關問題