如何配置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
相关产品推荐
相关产品推荐

