【问题标题】:Proguard keep class names?Proguard保留类名?
【发布时间】:2012-06-13 20:50:39
【问题描述】:

您好,我正在编写一个 Android 应用程序,并且我已经设置了 Proguard 来混淆我的应用程序。然而,我使用类加载器将不同的扩展动态加载到我的应用程序中。问题是,如果它们的名称被更改,它们将无法正确加载。如何防止 Proguard 混淆特定的类名?

【问题讨论】:

    标签: java android obfuscation proguard


    【解决方案1】:

    在 proguard.cfg 中使用 -keepnames 选项

    参考手册 https://www.guardsquare.com/en/proguard/manual/usage#keepoptions:

    -keepnamesclass_specification

    -keep,allowshrinking class_specification 的缩写

    指定要保留其名称的类和类成员,如果它们在收缩阶段没有被删除的话。例如,您可能希望保留实现 Serializable 接口的类的所有类名,以便处理后的代码与任何最初序列化的类保持兼容。完全不使用的类仍然可以删除。仅在混淆时适用。

    【讨论】:

    • 好的,有没有办法用整个包做到这一点?
    • 是的,您使用 * 通配符。即,-keepnames com.randompackage.lol.* 将所有类保留在 lol
    • 我已经尝试过了,eclipse 返回错误 1。你确定我不需要 -keepnames class com.randompackage.lol.ClassName 吗?我在发帖之前已经尝试过了,但是没有用:S
    • 试试 -keep 而不是 -keepnames
    • Doesn't -keep NOT obfuscate the class?
    【解决方案2】:

    这样可以保持类名不变:

    -keepnames class com.somepackage.* 
    

    【讨论】:

      【解决方案3】:

      给不想让 ProGuard 更改任何类名的每个人的实用提示:

      # please KEEP ALL THE NAMES
      -keepnames class ** { *; }
      

      这样您将获得可读的堆栈跟踪,同时仍然丢弃您不需要的东西。 :-)

      【讨论】:

      • -dontobfuscate 是禁用混淆的正确方法。
      • 错误的方式。最好使用以下配置关闭混淆:“-dontobfuscate /n -optimizations !code/allocation/variable”
      • 更好的是,上传您的符号文件并允许正确捕获。
      【解决方案4】:

      如果有人对如何指定要保留的多个类名感兴趣,那么这些类可以用逗号分隔。示例:

      -keepnames class com.foo.**,com.bar.** { *; }
      

      也可以使用否定,因为通常只有自己的类会被混淆,并且可以保留第 3 方库:

      -keepnames class !com.foo.**,!com.bar.** { *; }
      

      请参阅Proguard Documentation

      【讨论】:

      • I was。 :) 现在我知道谷歌搜索“逗号分隔的类名”我找到了这个。 :) 你会不会碰巧知道逗号后面是否允许有空格?
      • 不确定,试试吧,但我猜不是,它可能被认为是一个新的选择。
      • 允许空格,甚至换行符。