代码之家  ›  专栏  ›  技术社区  ›  superjos

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

  •  3
  • superjos  · 技术社区  · 6 年前

    在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
    在Proguard输出文件的@emandt answer之后,我再次检查并 com.mylib.mypackage.InternalComponent 列在中 seeds.txt ,根据 this blog post

    在此期间,我最终还是采用了@shizhen提出的方法。为了完整起见,为了将排除范围扩大到 任何 internal ,我将proguard规则修改为:

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

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

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

    2 回复  |  直到 5 年前
        1
  •  1
  •   shizhen    6 年前

    你在写一本书吗 Android库 项目?可能是的。

    为了达到您的目的,恐怕您需要将您的包裹重新整理成如下内容:

    com.my.package.apiforusers
    

    专用/内部实现

    com.my.package.apiforusers.internal
    

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

    以便 只有 com.my.package.apiforusers.internal 将被混淆。

        2
  •  0
  •   emandt    6 年前