ProGuard - 如何保留方法并同时混淆它们?

Posted

技术标签:

【中文标题】ProGuard - 如何保留方法并同时混淆它们?【英文标题】:ProGuard - How to keep methods and obfuscate them at the same time? 【发布时间】:2012-10-23 20:00:08 【问题描述】:

我正在尝试手动混淆我的 android 应用程序(是的,我知道,这很痛苦),为此我需要保留我实现的所有方法,同时还要使用 ProGuard 混淆它们。

我尝试过像这样更改配置:

-keep class com.project.x.* 


但它保留了所有的类名和方法名,并且仍然删除了我未使用的代码。

我能做些什么来解决这个问题?

提前致谢!

【问题讨论】:

你是说你想要每个方法的两个版本:一个带有混淆名称,一个没有? 我的意思是我想让所有的方法都被混淆,但我不希望 ProGuard 在不使用它们时将它们删除。 【参考方案1】:

正如 CommonsWare 所解释的,您似乎不太可能希望保留未使用的方法,同时对其名称进行混淆,但 ProGuard 支持如下:

-keepclassmembers,allowobfuscation class com.project.x.** 
    <methods>;

这会强制保留指定包(及其子包)中的所有方法(但不是所有类),但仍允许对其名称进行混淆。

【讨论】:

不,这完全不可能。在运行时通过注解访问的方法就是这样一个例子。 这在我的经验中并不常见,但确实有可能。那么更精确的配置是-keepclassmembers,allowobfuscation class * @com.example.MyAnnotation &lt;methods&gt;; 这也是专有 AAR 的有效案例,尽管案例有点不同。一些图书馆出版商希望保留他们所有的方法,但对私有和内部结构进行混淆。【参考方案2】:

使用 keep 选项修饰符 - 参见 here

我认为你会这样做:

-keep,allowoptimization class com.project.x.* 


但是引用文档:“这个修饰符只对实现不寻常的要求有用。”

您是否尝试过逆向工程以查看这是您需要做的事情?我对 keep 的印象是,它将保留类作为应用程序的入口点,但不会阻止它在内部优化和混淆这些类的方法。

也许您想要的只是-keepnames,请参阅上面的链接了解详情。

【讨论】:

感谢您的回复。出于某种原因,它会抛出一个错误,指出“允许优化”是意外的。我正试图找出原因。 我已经对我的应用程序进行了反向工程,这就是为什么我知道我需要这样做。正确的语法是 -keep,allowoptimization。当我使用 ProGuard 编译我的应用程序时(即使我删除了所有修改),我的应用程序现在不知何故搞砸了,当我修复这个问题时,我将能够检查它是否有效。感谢所有帮助:-) @EladCohen 好的,还有另一件事让你尝试,我已经回答了。 再次感谢,一旦我解决了我的问题,我会告诉你它是否有效(显然,当我在没有 ProGuard 的情况下编译我的应用程序时也会发生这种情况)。 我不知道它是否有效,因为我的项目已经搞砸了,我现在懒得修复它。我还认为,只有在我的应用程序完成后,我才会测试和实施所有这些混淆。感谢您的帮助。

以上是关于ProGuard - 如何保留方法并同时混淆它们?的主要内容,如果未能解决你的问题,请参考以下文章

带有 proguard 的 Kotlin AAR 库:如何只保留类和方法名?

ProGuard混淆时保留注释(@类内容)

如何防止proguard完全混淆方法

在混淆时我是不是需要在 proguard 规则中“保持” Parcelable

Android 代码混淆之proguard

构建配置 ProGuard Shrink 混淆和压缩