为 Proguard 指定类名以避免混淆

Posted

技术标签:

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

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

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

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

【问题讨论】:

【参考方案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

【讨论】:

以上是关于为 Proguard 指定类名以避免混淆的主要内容,如果未能解决你的问题,请参考以下文章

Spring boot使用ProGuard实现代码混淆

原创解决Maven ProGuard不混淆局部变量的问题,以及如何使用混淆好的包

Android 代码混淆之proguard

proguard生成的pro怎么载入

Android:proguard 不会混淆源代码

使用 ProGuard 混淆时暴露内部类