You need to enable JavaScript to run this app. Proguard语法:"{ *; }"、"{}"、空配置三类过滤规则有什么区别?
优惠活动
大模型
产品
解决方案
定价
更多

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规则时会拆分两个独立匹配逻辑:

  1. 类匹配规则:-keep后到{前的部分,用于筛选命中规则的类
  2. 类成员匹配规则:{ }包裹的部分,用于筛选命中类需要保留的成员

空的{ }表示没有任何符合条件的类成员需要保留,不是默认匹配所有成员;只有写入*;通配符规则时,才会匹配所有类成员执行保留操作。

示例说明

假设存在如下原始类:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 15:09:03