如何使用 Android R8 保留 class 构造函数参数名称

How to keep class constructor argument parameter names with Android R8

我正在编写 Android 库,所以我想保留一些 constructors/methodes 的参数名称。我正在将我的库部署为 AAR 文件。

Gradle 从 3.3.2 升级到 3.4.0 后,构造函数中的所有参数和 public 方法都重命名为类似 "var1" 的名称,在此之前一切都很好。

据我了解,主要区别在于,现在默认使用 R8 来缩小和混淆我们的代码,而不是 Proguard。所以可能我在配置中遗漏了一些东西。

假设我有 class:

public class Foo {
    public String bar;

    public Foo(String bar) {
        this.bar = bar;
    }
}

所以在 proguard-rules.pro 我有:

-keepparameternames
-keepattributes MethodParameters
-keepattributes Signature

-keep class my.class.path.Foo { *; }

然后我将该配置加载到我的模块 gradle 文件中:

buildTypes {
    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}}

现在我的 AAR 文件中的 class 看起来像这样 ->

public class Foo {
    public String bar;

    public SecureElement(String var1) {
        this.bar = var1;
    }
}

所以我的构造函数中甚至保留了字段名,但没有保留变量名。

如何保留 method/constructor 个参数名称?

我错过了什么?

如前所述here,检查 R8 版本 1.5.51 是否一切正常

buildscript {
    repositories {
        maven {
            url 'http://storage.googleapis.com/r8-releases/raw'
        }
    }
    dependencies {
        // Must be before the Gradle Plugin for Android
        classpath 'com.android.tools:r8:1.5.51'
        classpath 'com.android.tools.build:gradle:X.Y.Z'
     }
}

或者您可以按照说明禁用 R8 here

You can disable R8 by adding one of the following lines to your project’s gradle.properties file:

# Disables R8 for Android Library modules only.
android.enableR8.libraries = false
# Disables R8 for all modules.
android.enableR8 = false