微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 Android Proguard R8 中保留方法名称?

如何解决如何在 Android Proguard R8 中保留方法名称?

我正在开发一个 Android 库,我想为 Proguard 提供这个结果。

除此之外,我想混淆和缩小其他所有内容包括但不限于所有非公共方法,甚至公共方法的主体。

我怎样才能达到这个结果?

非常感谢您的帮助!

解决方法

R8 本身作为一个库分发,它已经通过 R8 运行。对于该库,我们希望准确实现您的要求,以确保使用该库的开发人员不会意外使用任何不应公开的 API(这与保护 IP 无关,因为该项目是开源的)。

可以在 here 中找到这些规则,我将在下面解释它们的基本原理。

我们尽量间接使用注解,所以主要规则是:

-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

SourceFileLineNumberTable 被保留以获得 retracable stack traces。剩下的用于库用户的javac编译和IDE集成。

然后

-keepparameternames

是否有用于 IDE 集成以获取 API 中参数的名称,以及

-keeppackagenames com.android.tools.r8
-repackageclasses com.android.tools.r8.internal

将尽可能多的类移动到 internal 命名空间中,以便重命名的类不会出现在 IDE 中。

文件中有一些额外的规则来处理基于注释的方法未涵盖的情况。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。