是否有可能让ProGuard保留元素与RetentionPolicy.SOURCE



我使用的是位于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删除。

相关内容

  • 没有找到相关文章

最新更新