【问题标题】:Why some package-private classes are not obfuscated by Proguard?为什么 Proguard 不会混淆某些包私有类?
【发布时间】:2019-03-15 10:22:34
【问题描述】:

在 Android Studio 3.2 中使用 Android 项目,启用 Proguard 和一些特定规则后,我无法弄清楚以下内容:

客户端代码使用的库模块中的特定包(及其子包)通过规则保留:

-keep public class com.mylib.mypackage.** {
    public protected *;
}

现在,在这个包中还有一些包私有类,这些类不应该被该规则选中。其中一些类在它们自己的名称和成员名称中都被有效地混淆了,这很好。

相反,有一些类实现了公共接口,它们的类名没有被混淆,而我希望它们应该被混淆。为了完整起见,它们的成员名称,当不是接口的一部分时,会被有效地混淆。

例子:

/* package */ class InternalComponent implements ExternalInterface {

  // ExternalInterface is kept: Ok
  // InternalComponent is kept: don't like, I'd like it renamed

  @Override
  public void ExternalMethod() {
    // this is kept: Ok
  }

  public void InternalMethod() {
    // this is renamed: Ok
  }
}

我想强调 InternalComponent 是在其他(保留)类中创建的,并且仅通过 ExternalInterface 返回给客户端代码。

如果可能的话,我如何也可以混淆它们的类名?

编辑 #1
在@emandt 回答 Proguard 输出文件后,我仔细检查了 com.mylib.mypackage.InternalComponent 并在 seeds.txt 中列出,根据 this blog post 列出了所有与保留规则匹配的项目。所以,出于某种原因,上面的规则也选择了包私有类,这对我来说仍然是错误的。

编辑#2 与此同时,我最终采用了与@shizhen 提出的完全相同的方法。为了完整起见,为了将排除扩展到 any 名为 internal 的包,我将我的 proguard 规则修改为:

-keep public class !com.mylib.mypackage.**.internal.*, com.mylib.mypackage.** { 
    public protected *;
}

(注意逗号前的第一部分,前缀为!)

我会标记@shizhen 的答案,不过我想知道为什么原来的规则也选择包私有组件。

【问题讨论】:

    标签: android proguard obfuscation android-proguard


    【解决方案1】:

    您是否正在处理 Android 库 项目?可能是的。

    为了达到你的目的,恐怕你需要将你的包重新组织成如下内容:

    公共接口

    com.my.package.apiforusers
    

    私有/内部实现

    com.my.package.apiforusers.internal
    

    那么对于你的混淆规则,你可以像下面这样:

    -keep public class com.my.package.apiforusers.** { public *; }
    

    因此仅保留公共类/接口,com.my.package.apiforusers.internal 中的所有这些类/接口都将被混淆。

    请注意末尾的双星号,以便为子包保留公共类/接口。

    【讨论】:

      【解决方案2】:

      在“/build/outputs/mapping/release/”文件夹中,很少有文件(“usage.txt”、“seeds.txt”等)包含为什么以及哪些类/变量/方法的原因/etc.. 未通过 ProGuard 实用程序进行处理/未收缩/ot-混淆。

      【讨论】:

      • 感谢您的建议。我已经看过这些,但不知道如何理解它们。 mapping.txt 在这种情况下没有用。你知道如何利用另外两个吗?
      猜你喜欢
      • 1970-01-01
      • 2012-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-04
      • 1970-01-01
      • 2015-10-09
      • 2016-12-24
      相关资源
      最近更新 更多