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

ProGuard如何混淆类变量与逻辑?配置后仅类名方法名变更问题排查

ProGuard仅重命名类和main方法,变量未混淆的问题解决

1. 关于“核心代码逻辑未混淆”的澄清

ProGuard的混淆功能只负责重命名类、方法、字段,不会修改代码的执行逻辑——代码逻辑的调整属于「优化」阶段,但你配置了-dontoptimize,所以代码逻辑完全保留是正常现象。如果需要简化代码逻辑,移除-dontoptimize即可。

2. 成员变量未被混淆的原因

输出显示Number of obfuscated fields: 0,分两种情况:

  • 如果你的MyClass里只有局部变量、没有成员变量:ProGuard不会处理局部变量名(字节码中局部变量名是可选元数据,不属于混淆范畴);
  • 如果存在成员变量却未被混淆:大概率是你没添加-allowaccessmodification配置,ProGuard默认不会修改成员的访问修饰符,导致部分私有成员无法被安全重命名。添加该配置后,ProGuard会调整访问权限,确保混淆后的代码可正常运行。

3. 反编译后局部变量名可见的解决

反编译后能看到局部变量名,是因为原class文件保留了LocalVariableTable元数据,ProGuard默认不会移除它。要让局部变量名无法被恢复,需添加:

-dontkeepattributes LocalVariableTable,LocalVariableTypeTable

该配置会删除局部变量的元数据,反编译后局部变量会变成var1、var2这类无意义的名称。

4. 调整后的完整配置

结合你的需求,修改后的配置如下:

-injars MyClass.jar
-outjars MyClass_Obf.jar
-dontshrink
-dontoptimize
-libraryjars c:\proguard\rt.jar
-printmapping out.map

# 移除局部变量元数据,防止反编译恢复变量名
-dontkeepattributes LocalVariableTable,LocalVariableTypeTable
# 允许修改访问修饰符,确保混淆后的代码可访问
-allowaccessmodification
# 合并所有类到根包,强化混淆效果
-repackageclasses ''

额外建议

你使用的是ProGuard 7.1.0-beta5测试版,可能存在兼容性问题,建议切换到7.4.x及以上的稳定版本。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 23:01:30