使用ProGuard混淆时暴露内部类(Exposing inner classes when obf

2019-06-26 13:13发布

我使用Ant任务混淆与ProGuard的库。

我保持特定的类名和它们的方法名称时,他们有一个特别的注释(@ApiAll),我请求将InnerClasses属性保持:

  <keepattribute name="InnerClasses" />
  <keep annotation="com.example.ApiAll"/>
  <keepclassmembers annotation="com.example.ApiAll">
     <constructor access="public protected"/>
     <field access="public  protected"/>
     <method access="public  protected"/>
     <constructor access="protected"/>
    </keepclassmembers>

如果我检查映射输出文件,我可以看到有注释我的内部类,它的成员都保持自己的名字是非模糊的。 然而,当我看在生成jar文件我找不到类。

我缺少的东西吗? 为什么映射告诉我这就是维持这个类时,它不是?

Answer 1:

你需要指定要使用正确的符号,以保持内部类。 在ProGuard的说法,这意味着-keep class my.outer.Class$MyInnerClass 。 这里的关键是使用美元符号( $ )的内部和外部类之间的分隔符。

要做到这一点,你还必须指定-keepattributes InnerClasses ,以便该名称MyInnerClass不会被混淆。 这两个设置在一起应该让你的内部类可保持不变。



Answer 2:

选项keepclassmembers仅保留指定的类成员(他们的名字)。

你可能想比较常见的选项keep ,它保留了指定的类类成员(他们的名字)。

(CFR)。 ProGuard的手册>用法>保留选项概览



文章来源: Exposing inner classes when obfuscating with ProGuard