【问题标题】:How to keep method names in Android Proguard R8?如何在 Android Proguard R8 中保留方法名称?
【发布时间】:2021-01-21 23:49:20
【问题描述】:

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

  • 我想保留所有包名,这是我使用“-keeppackagenames”来实现的。
  • 我想保留所有类名。
  • 我想保留所有公共方法的方法名称和方法参数名称。

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

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

非常感谢您的帮助!

【问题讨论】:

    标签: android proguard android-r8


    【解决方案1】:

    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
    

    SourceFileLineNumberTable 被保留以获取retracable stack traces。其余的用于库用户的 javac 编译和 IDE 集成。

    然后

    -keepparameternames
    

    IDE 集成是否可以在 API 中获取参数名称,以及

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-28
      • 1970-01-01
      • 2021-12-23
      • 1970-01-01
      • 2019-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多