我正在开发一个Android库,我希望Proguard有这个结果。
- 我想保留所有的包名,我使用"- keepackagenames "为了实现。
- 我想保留所有的类名
- 我想保留所有公共方法的方法名和方法参数名。
除此之外,我想混淆和缩小其他所有内容,包括但不限于所有非公共方法,甚至是公共方法的主体。
我怎样才能达到那个结果?
事先非常感谢您的帮助!
R8本身是作为一个通过R8运行的库发布的。对于这个库,我们想要实现你所要求的,以确保使用库的开发人员不会意外地使用任何不应该公开的api(这与保护IP无关,因为项目是开源的)。
这些规则可以在这里找到,我将在下面解释它们的基本原理。
我们尝试间接使用注释,所以主要规则是:
-keep @com.android.tools.r8.Keep class * { public *; }
-keep @com.android.tools.r8.KeepForSubclassing class * { public *; protected *; }
然后用@Keep
或@KeepForSubclassing
注释所有API类。
然后保留一些属性
-keepattributes SourceFile, LineNumberTable, InnerClasses, EnclosingMethod, Exceptions, Signature
保留SourceFile
和LineNumberTable
以获得可伸缩的堆栈迹线。其余部分用于javac编译和库用户的IDE集成。
然后
-keepparameternames
用于IDE集成,获取API中参数的名称,而
-keeppackagenames com.android.tools.r8
-repackageclasses com.android.tools.r8.internal
将尽可能多的类移动到internal
命名空间中,以便重命名的类不会显示在IDE的。
文件中还有一些额外的规则来处理基于注释的方法未涵盖的情况。