为什么一些 package-private 类 没有被 Proguard 混淆?

Why some package-private classes are not obfuscated by Proguard?

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

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

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

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

相反,有一些 classes,实现 public 接口,其 class 名称未被混淆,而我希望它们应该被混淆。为了完整起见,它们的成员名称(如果不是接口的一部分)会被有效地混淆。

示例:

/* 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 是在其他(保留的)class 中创建的,并且仅通过 ExternalInterface.

返回给客户端代码

如果可能的话,我怎样才能同时混淆他们的 class 名字?

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

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

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

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

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

在“/build/outputs/mapping/release/”文件夹中有几个文件("usage.txt"、"seeds.txt" 等..)包含原因和原因 classes/variables/methods/etc。 . 是 not-processed/not-shrinked/ot-obfuscated 通过 ProGuard 实用程序。

您正在从事 Android 图书馆 项目吗?可能是。

为了达到您的目的,恐怕您需要将您的包重新组织成如下所示:

Public 接口

com.my.package.apiforusers

Private/Internal 实现

com.my.package.apiforusers.internal

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

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

这样 只有 public classes/interfaces 被保留,com.my.package.apiforusers.internal 中的所有那些都将被混淆。

请注意末尾的双星号,以便子包也保留 public classes/interface。