为什么Proguard不会混淆某些软件包专用的类?

时间:2018-10-10 13:28:17

标签: android proguard obfuscation android-proguard

在启用了Proguard和一些特定规则的情况下,使用Android Studio 3.2中的Android项目进行工作,我无法确定以下内容:

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

-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
在对Proguard输出文件进行@emandt回答后,我仔细检查了com.mylib.mypackage.InternalComponent并列在seeds.txt中,internal根据this blog post列出了与keep规则匹配的所有项目。因此,出于某种原因,上面的规则也选择了包私有类,这对我来说仍然是错误的。

编辑#2 同时,我最终采用了@shizhen提出的完全相同的方法。为了完整起见,为了将排除范围扩展到名为-keep public class !com.mylib.mypackage.**.internal.*, com.mylib.mypackage.** { public protected *; } any 包,我将proguard规则修改为:

!

(请注意逗号前面的第一部分,以<VirtualHost *:443> ServerName mobile.betyetu.co.mz DocumentRoot "/var/www/betyetu" ErrorLog "logs/betyetu-error_log" TransferLog "logs/betyetu-access_log" # # SSL defintions # # SSLEngine on # SSLCertificateFile "/etc/ssl/certs/server.crt" # SSLCertificateKeyFile "/etc/ssl/certs/server.key" # # define an external output filter for translation of English to Portuguese # ExtFilterDefine filtEN2PT mode=output intype=text/html outtype=text/html cmd=" /var/www/betyetu/notAlice.sh" AddOutputFilter filtEN2PT html # # Enable Reverse Proxy # ProxyPass "/" "http://www.alice-in-wonderland.net/" ProxyPassReverse "/" "http://www.alice-in-wonderland.net/" </VirtualHost> 为前缀)

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

您正在从事 Android库项目吗?可能是。

为了实现您的目的,恐怕您需要将软件包重新组织为如下所示:

公共界面

com.my.package.apiforusers

私有/内部实现

com.my.package.apiforusers.internal

然后根据混淆规则,如下所示:

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

这样,将保留在公共类/接口中,并且com.my.package.apiforusers.internal中所有那些公共类/接口都将被混淆。