Android中使用ProGuard如何保留特定内部类?
解决ProGuard混淆时保留特定内部类方法签名的问题
针对你遇到的问题,只需通过精准的ProGuard规则配置,就能在不全局保留所有内部类的前提下,实现保留类A的setXX方法参数为原内部接口B的需求,具体配置如下:
核心配置规则
# 保留内部接口A$B的完整名称与所有成员,避免被重命名 -keep interface com.yourpackage.A$B { *; } # 锁定类A中setXX方法的签名,确保参数类型为A$B(原内部接口B) -keepclassmembers class com.yourpackage.A { public void setXX(com.yourpackage.A$B); } # 仅保留类A及其内部接口B的InnerClasses属性,而非全局生效 -keepattributes InnerClasses -dontkeepattributes InnerClasses,!com.yourpackage.A,!com.yourpackage.A$B
规则说明
- 第一条规则直接指定保留内部接口
A$B的所有信息,ProGuard不会对其进行重命名或裁剪成员。 - 第二条规则锁定类A的
setXX方法签名,确保参数类型始终指向未混淆的A$B。 - 第三条规则通过
-keepattributes InnerClasses开启内部类属性保留,再用-dontkeepattributes排除其他类的该属性,仅让A和A$B的InnerClasses属性被保留——这一步是让方法参数在混淆后仍显示为B而非A$B的关键,同时避免了全局保留所有内部类的问题。
注意:将配置中的com.yourpackage替换为你实际的包路径。
内容的提问来源于stack exchange,提问作者dx3906
相关产品推荐
相关产品推荐

