我使用的是位于Android支持注释库中的@VisibleForTesting
注释,它看起来像这样:
@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
的保留策略?或者在构建过程中已经太迟了?
Guava的@VisibleForTesting
使用RetentionPolicy.CLASS
,而Android支持注解库使用RetentionPolicy.SOURCE
。我正在考虑发布一个请求来更改策略,但我想它被设置为SOURCE
是有原因的,可能是由于性能和文件大小的略微增加?
除了使用两个注释(@VisibleForTesting
和@Keep
)之外,还有其他选择吗?
带有RetentionPolicy
== SOURCE
的注释不存在于ProGuard正在操作的.class文件中。因此,没有办法在规则中使用它们,因为它们永远不会匹配。
带有RetentionPolicy
== CLASS
的注释应该可以正常工作。如果需要,它们甚至可以在发布版本中使用ProGuard删除。