首页 > 解决方案 > Proguard 语法:如何过滤“{ *; }”、“{ }”和““ 工作?

问题描述

我有一个使用以下规则修复的 Android 应用程序:

-keep com.my.package.MyClass { *; }

根据Proguard 的文档,这个大括号过滤器意味着“任何字段或方法”MyClass将保持不变。

问题是,在申请{ *; }我的规则之前,我一直认为

-keep com.my.package.MyClass

这是修复之前的规则,或者

-keep com.my.package.MyClass { }

具有相同的含义,因为大括号参数被认为是可选的。换句话说,从我目前的解释来看,如果我没有指定过滤器,那么任何东西都应该匹配。

在此处输入图像描述

由于官方文档不是很清楚,Proguard 也没有官方支持,有没有人知道这三个规则之间的区别,或者甚至可以更好地举例说明它们在内部是如何工作的?

提前致谢

标签: androidproguard

解决方案


正如Proguard 的文档所暗示的,使用它有点经验性。

“为了获得正确的结果,您至少应该对正在处理的代码有点熟悉。执行大量反射的混淆代码可能需要TRIAL AND ERROR,尤其是在没有关于代码内部的必要信息的情况下。”

进一步的工作使我意识到不指定过滤器与指定空过滤器具有相同的影响。

-keep com.my.package.MyClass
-keep com.my.package.MyClass { }

在缩小或混淆成员时,更不用说过滤器意味着不应该保持完整。

-keepclassmembernames com.my.package.MyClass
-keepclassmembernames com.my.package.MyClass { }

另一方面,

-keepclassmembernames com.my.package.MyClass { *; }

{ *; }匹配类内的任何东西,这和说的一样

“混淆并缩小 MyClass,但不影响其中的所有内容”。

混淆和收缩可能会应用于类本身,但定义的收缩阶段-keepclassmembernames 不会影响构造函数(<init>();根据 Proguard 的语法表示)或其他成员(<fields>();& <methods>();)。


推荐阅读