Android R8(Proguard) 参数名称已更改(我不想更改我的参数名称)

Android R8(Proguard) parameter name changed (i don't want change my parameter name)

我用agp(android gradle插件)7.0.4 在 运行 proguard -> 接口参数名称更改后 (com.android.tools.build:gradle:4.2.2版本未更改接口参数名称)

在 Gradle 4.2.2

public interface ITicketBoxCount {
    public abstract fun callback(condition: kotlin.Int): kotlin.Unit
}

在 Gradle 7.0.4

public interface ITicketBoxCount {
    void callback(int var1);
}

使用相同的“proguard_rules.txt”

-keep interface myinterfaceclass.** { *; }

我已经尝试“-keepparameternames”-> class参数名称未更改但接口参数名称已更改

我不想更改我的接口参数名称 请帮助我


额外

我制作了一个“.aar”(sdk) 文件

定义接口"ITicketBoxCount" -> make aar -> build time 运行 r8 -> 反编译aar -> ITicketBoxCount 接口参数名全部混淆

我想知道保留 interface 的目的是什么...但不是实现;例如:

-keep class ** implements ITicketBoxCount { *; }

这可能会进一步改进,因为通常只需要 public 方法而不是整个 class(它不是混淆文件 yes/no,但可以配置得非常精确人们想要保留哪些 classes 和方法)。

我在 R8 问题跟踪器中找到了原因

看来您使用的是 kotlin 1.6 版。与 AGP 7.0 捆绑的 R8 版本在 1.6 发布之前发布,无法读取元数据。结果,它将简单地丢弃它,因为它不能对它做任何事情。如果通过命令行编译,您还应该得到这些信息消息:

Info: Unexpected error while reading com.noimply.mymodule.ITicketCount's kotlin.Metadata: null
Info: Unexpected error while reading com.noimply.mymodule.IUpdateNotification's kotlin.Metadata: null
Info: Unexpected error while reading com.noimply.mymodule.MyModuleSDK's kotlin.Metadata: null
Info: Unexpected error while reading com.noimply.mymodule.view.MainActivity's kotlin.Metadata: null
Info: Unexpected error while reading com.noimply.mymodule.ILoginCallback's kotlin.Metadata: null
Info: Unexpected error while reading com.noimply.mymodule.ITicketBoxCount's kotlin.Metadata: null

您将必须使用版本 3.0.77 或升级版或 R8 版本 3.1.X,它们目前处于候选发布状态。您可以通过将以下内容添加到顶级 build.gradle:

来设置特定版本
pluginManagement {
    buildscript {
        repositories {
            mavenCentral()
            maven {
                url = uri("https://storage.googleapis.com/r8-releases/raw")
            }
        }
        dependencies {
            classpath("com.android.tools:r8:3.0.77")
            classpath('com.google.guava:guava:30.1.1-jre')  // <-- THIS IS REQUIRED UNTIL R8 3.2.4-dev
        }
    }
}

如果您想知道为什么它会在 AGP 4.2 中工作,那是因为该版本的 R8 没有 kotlin 元数据的建模,只是通过它。