Android R8如何保留类构造函数的参数名称
这个问题我之前升级Gradle到3.4.x版本的时候也踩过坑!核心原因是Gradle 3.4.0默认用R8替代了ProGuard,而你配置的-keepparameternames是ProGuard专属指令,R8根本不识别它,相当于这条配置完全没起作用,所以参数名才会被混淆成var1这种占位符。
下面给你一步步的修复方案:
先移除无效的指令
把proguard-rules.pro里的-keepparameternames删掉,R8不认这个规则,留着也是白搭。确保保留关键属性
你已经添加的-keepattributes MethodParameters一定要保留!它负责告诉R8不要删除class文件中存储参数名的MethodParameters属性——没有这个属性,参数名根本没法被留存下来。精准配置要保留参数名的类成员
调整你的-keep规则,明确指定要保护的类和成员。针对你的Foo类,可以修改成这样:-keepattributes MethodParameters -keepattributes Signature # 保留Foo类的构造函数和公共字段,确保参数名不被混淆 -keepclassmembers class my.class.path.Foo { # 匹配带String参数的构造函数 <init>(java.lang.String); # 保留公共字段bar public java.lang.String bar; }如果想偷懒,要保留该类所有方法、构造函数的参数名,可以简化成:
-keepattributes MethodParameters -keepattributes Signature -keepclassmembers class my.class.path.Foo { *; }检查R8 Full Mode配置
如果你在gradle.properties里设置了android.enableR8.fullMode=true,这个模式会执行更激进的优化,可能会覆盖你的参数名保留规则。如果不需要这么严格的优化,把它改成false即可;如果必须使用Full Mode,那你需要在规则里更明确地指定要保留的内容。
最后,构建AAR之后,可以用Android Studio的反编译功能或者JD-GUI打开AAR里的class文件,确认构造函数的参数名是不是已经变回bar了。
内容的提问来源于stack exchange,提问作者coren

