【问题标题】:Exposing inner classes when obfuscating with ProGuard使用 ProGuard 混淆时暴露内部类
【发布时间】:2010-11-13 00:47:44
【问题描述】:

我正在使用 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 文件时,我找不到该类。

我错过了什么吗?为什么映射告诉我它没有保留这个类?

【问题讨论】:

    标签: java ant proguard


    【解决方案1】:

    您需要指定要使用正确的符号保留内部类。 在 proguard 用语中,这意味着 -keep class my.outer.Class$MyInnerClass。这里的关键是使用美元符号 ($) 作为内部类和外部类之间的分隔符。

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

    【讨论】:

    • 这是 yGuard 相同问题的正确答案
    【解决方案2】:

    keepclassmembers 选项仅保留指定的类成员(及其名称)。

    您可能想要更常见的选项keep,它保留指定的类类成员(及其名称)。

    参照。 ProGuard manual > Usage > Overview of Keep Options

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-24
      • 2021-08-10
      • 1970-01-01
      • 2015-08-16
      • 1970-01-01
      • 1970-01-01
      • 2012-05-04
      相关资源
      最近更新 更多