为什么一些包私有类不会被Proguard混淆?

问题描述 投票:3回答:2

使用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列出了所有与keep规则匹配的项目。因此,出于某种原因,上面的规则也选择了包私有类,这对我来说仍然是错误的。

编辑#2在此期间,我最终完成了与@shizhen提出的完全相同的方法。为了完整性,为了将排除扩展到任何名为internal的包,我将我的proguard规则修改为:

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

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

我将标记@shizhen的答案,但我想好奇为什么原规则也在挑选包私有组件。

android proguard obfuscation android-proguard
2个回答
0
投票

你在开发一个Android库项目吗?可能是。

为了实现您的目的,我担心您需要将包重新组织成以下内容:

公共接口

com.my.package.apiforusers

私人/内部实施

com.my.package.apiforusers.internal

然后,对于您的混淆规则,您可以如下所示:

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

因此,只保留公共类/接口,并且com.my.package.apiforusers.internal中的所有那些将被混淆。


0
投票

在“/ build / outputs / mapping / release /”文件夹中,有几个文件(“usage.txt”,“seeds.txt”等等)包含原因和类/变量/方法/等的原因。 。未通过ProGuard实用程序处理/未处理/未经过混淆。

© www.soinside.com 2019 - 2024. All rights reserved.