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

Android R8如何保留类构造函数的参数名称

这个问题我之前升级Gradle到3.4.x版本的时候也踩过坑!核心原因是Gradle 3.4.0默认用R8替代了ProGuard,而你配置的-keepparameternames是ProGuard专属指令,R8根本不识别它,相当于这条配置完全没起作用,所以参数名才会被混淆成var1这种占位符。

下面给你一步步的修复方案:

  1. 先移除无效的指令
    把proguard-rules.pro里的-keepparameternames删掉,R8不认这个规则,留着也是白搭。

  2. 确保保留关键属性
    你已经添加的-keepattributes MethodParameters一定要保留!它负责告诉R8不要删除class文件中存储参数名的MethodParameters属性——没有这个属性,参数名根本没法被留存下来。

  3. 精准配置要保留参数名的类成员
    调整你的-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 {
        *;
    }
    
  4. 检查R8 Full Mode配置
    如果你在gradle.properties里设置了android.enableR8.fullMode=true,这个模式会执行更激进的优化,可能会覆盖你的参数名保留规则。如果不需要这么严格的优化,把它改成false即可;如果必须使用Full Mode,那你需要在规则里更明确地指定要保留的内容。

最后,构建AAR之后,可以用Android Studio的反编译功能或者JD-GUI打开AAR里的class文件,确认构造函数的参数名是不是已经变回bar了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:30:52