如何通过Proguard仅保留特定包下方法的参数名称?
如何在ProGuard中仅保留特定包下的方法参数名称?
当然可以做到!你当前的配置-keep class com.example.web.** { *; }确实能避免这个包下的类和方法被混淆,但默认情况下方法参数名还是会被ProGuard处理掉——这正是Spring Web这类依赖反射获取参数名的框架头疼的点。
要精准保留com.example.web包下方法的参数名称,只需要两步配置:
开启方法参数属性的保留
ProGuard默认会移除Java字节码中的MethodParameters属性(这个属性存储着方法参数的原始名称,Java 8+支持),所以首先要全局开启保留这个属性:-keepattributes MethodParameters绑定到目标包的规则
接下来把这个属性保留规则和你的目标包绑定,确保只有这个包下的方法参数名被保留(如果需要,也可以进一步缩小范围到特定子类,比如Controller)。结合你原有的配置,最终的规则可以是:# 全局保留方法参数属性 -keepattributes MethodParameters # 保留com.example.web包下所有类的方法参数名,同时保留类和方法不被混淆 -keep class com.example.web.** { <methods>; }
如果你的项目基于Java 7或更早版本,还要额外注意:Java 7及以下的字节码本身不存储参数名,你需要在编译时加上-parameters选项(比如在Maven/Gradle的编译配置中开启),生成包含参数名的字节码后,再用上面的ProGuard配置才能生效。
这样配置后,com.example.web包下的方法参数名就会完整保留,Spring Web就能正常解析请求参数绑定了,而其他包的代码依然可以正常被混淆压缩。
内容的提问来源于stack exchange,提问作者benji
相关产品推荐
相关产品推荐

