android - Proguard 语法:如何过滤“{ *; }”、“{ }”和““ 工作?
问题描述
我有一个使用以下规则修复的 Android 应用程序:
-keep com.my.package.MyClass { *; }
根据Proguard 的文档,这个大括号过滤器意味着“任何字段或方法”都MyClass
将保持不变。
问题是,在申请{ *; }
我的规则之前,我一直认为
-keep com.my.package.MyClass
这是修复之前的规则,或者
-keep com.my.package.MyClass { }
具有相同的含义,因为大括号参数被认为是可选的。换句话说,从我目前的解释来看,如果我没有指定过滤器,那么任何东西都应该匹配。
由于官方文档不是很清楚,Proguard 也没有官方支持,有没有人知道这三个规则之间的区别,或者甚至可以更好地举例说明它们在内部是如何工作的?
提前致谢
解决方案
正如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>();
)。
推荐阅读
- sql - 计算组内加权平均值的累积分布
- c - 拆分复杂字符串的C函数
- powershell - Azure YAML 文件 powershell 脚本参数问题传递参数
- matplotlib - Seaborn 直方图
- python - RuntimeError:未找到应用程序。在视图函数中工作或推送应用程序上下文。FLASK SQLAlchemy 错误
- vue.js - 将 SASS 变量导入 Vue 组件
- google-cloud-platform - Automated BigTable backups
- java - 在 android 中使用 barteksc / AndroidPdfViewer 库时,从设备内部存储中获取的 PDF 不可见
- docker - 节点无法从 docker 注册表中提取图像
- c - 为什么 C 中的这个堆栈变量不在寄存器中?