You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置Proguard:保留含main方法的类,混淆带@ObfuscateMe注解的main方法所在类?

如何配置ProGuard以保留含main方法的类,但混淆带@ObfuscateMe注解的main方法?

这个需求可以通过ProGuard的规则组合来实现,核心思路是先确保所有包含main方法的类都被保留(不会被删除或混淆类名),再针对带有@ObfuscateMe注解的main方法放开混淆权限。下面是具体的配置和细节说明:

核心配置规则

假设你的@ObfuscateMe注解位于包路径com.example下,对应的ProGuard配置如下:

# 1. 保留所有包含main方法的类(确保类不被删除、类名不被混淆)
-keep public class * { public static void main(java.lang.String[]); }

# 2. 仅保留不带@ObfuscateMe注解的main方法,带注解的允许混淆
-keepclassmembers public class * {
    !@com.example.ObfuscateMe public static void main(java.lang.String[]);
}

# 3. 保留@ObfuscateMe注解本身(防止ProGuard混淆/删除注解)
-keep @interface com.example.ObfuscateMe

规则解释

我们来逐个拆解每条规则的作用:

  • 第一条规则:和常规的main方法保留规则类似,但它的核心作用是确保所有拥有main方法的类都被完整保留(类名不变,不会被ProGuard标记为无用代码删除)。
  • 第二条规则:这是实现需求的关键。它明确指定:只有没有@ObfuscateMe注解的main方法才会被保留(方法名和代码逻辑不被混淆);反之,带有该注解的main方法会被ProGuard正常混淆(方法名可能被替换成短标识符,代码也会被优化压缩)。
  • 第三条规则:必须保留@ObfuscateMe注解的定义,否则ProGuard会把这个注解当成无用代码处理,导致无法识别带注解的main方法。

效果验证

配置完成后,两种场景的处理结果如下:

  • 不带注解的main方法:

    public static void main(String[] args) {
        // 逻辑代码
    }
    

    类会被保留,main方法的名称和代码都不会被混淆,符合常规的保留逻辑。

  • 带注解的main方法:

    @ObfuscateMe
    public static void main(String[] args) {
        // 逻辑代码
    }
    

    类会被保留,但main方法会被ProGuard混淆,最终可能变成类似public static void a(String[] var0) {...}的形式,代码逻辑也会被压缩优化。

内容的提问来源于stack exchange,提问作者benji

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:02:53