【问题标题】:Specify class names for Proguard to avoid obfuscating to为 Proguard 指定类名以避免混淆
【发布时间】:2014-08-18 11:40:34
【问题描述】:

我看到使用 ProGuard,您可以指定混淆时要使用的名称字典(这些可以在字段/方法、类或包级别)。

有没有办法给它一个特别不混淆的名称列表?我尝试在字典前面放一个 !,但这似乎不起作用。作为一点上下文,我主要考虑不要将类名混淆为 r 以避免与 Android 生成的 R 类发生冲突。

顺便说一句,值得查看 ProGuard 发行版 (examples/dictionaries/) 中的示例字典 - 最后两个真的让我发笑!

【问题讨论】:

    标签: android proguard


    【解决方案1】:

    我在搜索相同内容时偶然发现了这个问题。

    这并没有回答核心问题,
    但是对于您的用例,将其添加到 proguard-project.txt 就足够了:

    -keep public class **.R {
      public *;
    }
    
    -keep public class **.R$* {
      public *;
    }
    

    【讨论】:

    • 不幸的是,它不适用于我的用例。我正在使用包含在混淆 jar 中的代码(而不是作为 Java 源文件)制作一个 Android 库,所以我实际上并没有首先在 jar 中包含 R 类。这非常可怕,但至少我现在能想到的最好的方法是在字典中指定一个(长!)值列表,避免使用“r”。我知道很脆弱,但是嘿!不过还是谢谢。
    • 我遇到了使用特定类名(如 Ab.class)的其他库的问题。此外,在我的项目中,我保留了 R(及其子类)以成功构建项目。然后我反编译 .apk,删除 R 和 R$* 并将其用作我的混淆 .jar。以后也可能对你有帮助……
    【解决方案2】:

    ProGuard 已经避免了类名之间的冲突,无论是否保留,是否来自字典,因此您不需要任何特殊策略。如果你最终得到有冲突的类名,你可以将其报告为错误。

    【讨论】:

    • 嗨,埃里克。抱歉,我从来没有回复过这个 - 一定是错过了电子邮件通知!只是说这不是 ProGuard 中的错误 - 它正在做它应该做的事情。只是当我混淆时,此时没有其他类称为“R”(或“r”),因此它(有效地)使用“r”作为替代。 R 类稍后由用户使用该库生成,这就是问题所在。顺便说一句,ProGuard 很棒!
    • 谢谢,我现在明白了。像您所做的那样指定一个长的自定义字典可能是最好的解决方案。您也可以尝试使用 -repackageclasses 将带有混淆名称的类移开,但这对于库来说并不理想。
    【解决方案3】:
    -keep class com.company.package.SomeClass
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-04
      • 1970-01-01
      • 2016-07-21
      • 2011-10-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多