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)?
Android/java:从 ProGuard 到 R8 的过渡/迁移?