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

Posted

技术标签:

【中文标题】Android R8(Proguard) 参数名称已更改(我不想更改我的参数名称)【英文标题】:Android R8(Proguard) parameter name changed (i don't want change my parameter name) 【发布时间】:2022-01-18 08:29:59 【问题描述】:

我使用 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” -> 类参数名称未更改但接口参数名称已更改

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


补充

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

define interface "ITicketBoxCount" -> make aar -> build time run r8 -> decompile aar -> ITicketBoxCount 接口参数名称全部混淆

【问题讨论】:

您能否提供一些额外的背景信息?这是在构建一个 Android 库 (.aar),然后在应用程序中使用该库吗?如果有,请查看 Medium 帖子 Shrinking Kotlin libraries and applications using Kotlin reflection with R8 以及最后提到的保持规则 -keepattributes RuntimeVisibleAnnotations-keep class kotlin.Metadata *; 【参考方案1】:

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

-keep class ** implements ITicketBoxCount  *; 

这可能会进一步改进,因为通常只需要 public 方法而不是整个类(它不是混淆文件是/否,但可以非常精确地配置想要保留的类和方法)。

【讨论】:

【参考方案2】:

我在 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 元数据进行建模,只是将其传递出去。

【讨论】:

这里是原始 R8 问题跟踪线程的链接以获取上下文,感谢 @Ryan 发布此解决方案! issuetracker.google.com/issues/206855609 谢谢!!你拯救了我的一天!!!

以上是关于Android R8(Proguard) 参数名称已更改(我不想更改我的参数名称)的主要内容,如果未能解决你的问题,请参考以下文章

Android/Java 混淆:R8 与(ProGuard 或 DexGuard)?

同时使用 ProGuard 和 R8

Android/java:从 ProGuard 到 R8 的过渡/迁移?

在 Android 上使用 R8 时,是不是需要卸载现有的 Proguard?

R8 和 Proguard 规则

无法从 R8 配置中删除“-ignorewarnings”(Android Proguard 问题)