Proguard语法:"{ *; }"、"{}"、空配置三类过滤规则有什么区别?
Proguard三类-keep规则的差异与运行逻辑
基础规则定义
你提到的三条规则分别对应Proguard不同的保留粒度,核心区别仅在于类成员(字段、方法)的保留范围:
- 规则A:
-keep com.my.package.MyClass - 规则B:
-keep com.my.package.MyClass { } - 规则C:
-keep com.my.package.MyClass { *; }
具体作用差异
- 规则A、规则B效果完全等效:仅保留
MyClass的类名不被混淆、不被裁剪删除,不会对类内部的字段和方法做任何保留限制。Proguard的裁剪、混淆逻辑仍然会对类内成员生效:未被调用的成员会被直接删除,保留的成员会被重命名为无意义的短名称。 - 规则C:同时保留
MyClass的类名,以及类内所有字段、方法的名称和结构,既不会被混淆重命名,也不会被裁剪删除。
内部运行逻辑
Proguard解析-keep规则时会拆分两个独立匹配逻辑:
- 类匹配规则:
-keep后到{前的部分,用于筛选命中规则的类 - 类成员匹配规则:
{ }包裹的部分,用于筛选命中类需要保留的成员
空的
{ }表示没有任何符合条件的类成员需要保留,不是默认匹配所有成员;只有写入*;通配符规则时,才会匹配所有类成员执行保留操作。
示例说明
假设存在如下原始类:
package com.my.package; public class MyClass { public String publicField; private int privateField; public void publicMethod() {} private void privateMethod() {} }
应用规则A/规则B的处理结果
类名保留,类内成员仅保留被外部调用的publicMethod且被重命名,其余成员全部被裁剪:
package com.my.package; public class MyClass { // 其余成员已被删除 public void a() {} }
应用规则C的处理结果
类名、所有字段和方法完全保留,无任何修改:
package com.my.package; public class MyClass { public String publicField; private int privateField; public void publicMethod() {} private void privateMethod() {} }
内容的提问来源于stack exchange,提问作者Victor Oliveira
相关产品推荐
相关产品推荐

