R8 本身是作为通过 R8 运行的库分发的。对于该库,我们希望完全满足您的要求,以确保使用该库的开发人员不会意外使用任何不应该公开的 API(这与保护 IP 无关,因为该项目是开源的)。
规则可以在here找到,我将在下面解释它们的基本原理。
我们尽量是间接的,使用注解,所以主要的规则是:
-keep @com.android.tools.r8.Keep class * { public *; }
-keep @com.android.tools.r8.KeepForSubclassing class * { public *; protected *; }
然后所有 API 类都用 @Keep 或 @KeepForSubclassing 注释。
然后保留一些属性
-keepattributes SourceFile, LineNumberTable, InnerClasses, EnclosingMethod, Exceptions, Signature
SourceFile 和LineNumberTable 被保留以获取retracable stack traces。其余的用于库用户的 javac 编译和 IDE 集成。
然后
-keepparameternames
IDE 集成是否可以在 API 中获取参数名称,以及
-keeppackagenames com.android.tools.r8
-repackageclasses com.android.tools.r8.internal
将尽可能多的类移动到 internal 命名空间中,这样重命名的类就不会出现在 IDE 中。
文件中有一些附加规则来处理基于注释的方法未涵盖的情况。