是否可以让 ProGuard 保留 RetentionPolicy.SOURCE 的元素?
Is it possible to let ProGuard keep elements with 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 在发布版本中删除它们。
我正在使用位于 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 在发布版本中删除它们。