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

Proguard v6.2.2显示保留@KeepClass注解类却仍混淆该类

这绝对是个容易踩的坑!我之前用Proguard 6.x版本时也碰到过类似问题,不是你漏了配置,而是Proguard处理注解驱动的保留规则时,有两个关键细节得注意——注解属性的保留和规则语法的精准性,另外也可能是该版本的小Bug。

1. 必须先保留注解属性

Proguard默认会剥离类文件里的注解信息,如果不显式保留注解属性,后续匹配阶段它根本看不到@KeepClass注解,自然没法应用你的保留规则。得在配置里加上这行:

-keepattributes *Annotation*

这条指令会让Proguard保留所有类、方法、字段上的注解,这样它才能识别哪些类带@KeepClass标记。

2. 调整你的-keep规则写法

你原来的规则-keep @proguard.annotation.KeepClass public class * { *; }看似没问题,但可能因为public修饰符的限制(哪怕你的类是public,Proguard的匹配逻辑在某些场景下也可能有偏差),或者规则完整性不足。建议改成更通用明确的写法:

-keep,includedescriptorclasses @proguard.annotation.KeepClass class * {
    *;
}

includedescriptorclasses参数能确保保留注解相关的描述类,避免因类依赖问题导致规则失效。另外去掉public可以适配不同访问权限的类,如果你只需要保留public类,再加回去就行,但可以先去掉试试效果。

3. 验证是否是版本Bug

Proguard 6.2.2确实存在一些已知的小问题,尤其是在注解驱动的规则匹配上。如果上面的配置还是无效,建议升级到最新的Proguard 7.x版本,旧版本的不少Bug都被修复了。

为什么显式指定类名就有效?

当你直接写-keep class test.KeepMe{*;}时,Proguard不需要依赖注解信息,直接通过类全限定名匹配,不管注解是否被剥离,规则都会生效,类名和成员自然能被保留。

最后给你贴个修改后的完整配置示例:

-optimizations !code/simplification/cast,!field/*,!class/merging/*
-optimizationpasses 3
-allowaccessmodification
-adaptresourcefilecontents **.properties,META-INF/MANIFEST.MF
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-verbose
# 新增:保留注解属性
-keepattributes *Annotation*
# 保留入口类
-keep public class test.Entry { public static void main(java.lang.String[]); }
# 修改后的注解保留规则
-keep,includedescriptorclasses @proguard.annotation.KeepClass class * {
    *;
}
-whyareyoukeeping class test.KeepMe

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 14:17:57