gpt4 book ai didi

kotlin - 在用 Kotlin 编写的 Android 库的公共(public) API 中处理 R8 + JvmStatic Annotation + Lambda

转载 作者:行者123 更新时间:2023-12-02 11:49:19 25 4
gpt4 key购买 nike

首先,请注意我不期待 why do you want to obfuscate library评论。这是我要问的一个真正的问题。
我在使用 Kotlin 编写的 Android 库处理 R8/混淆时遇到问题。
我有一个带有 @JvmStatic 注释的公共(public) API 方法该方法采用 Lambda作为参数。
例如,看看下面的代码,

typealias MyLambdaCallback = (String, Map<String, Any>) -> Unit

@Keep
object MyApi {

private var callback: MyLambdaCallback? = null

@JvmStatic
fun setCallback(callback: MyLambdaCallback) {
this.callback = callback
}
}
我已添加 @Jvmstatic这样 Java调用代码可以静态调用方法而不是做 MyApi.INSTANCE.setCallback()当我释放没有 minification 的库时,一切都很好,从 Java调用代码和 Kotlin是按预期编写的。
但是现在我想在开启 minification的同时释放库.
这就产生了一个问题。
这是错误

java.lang.IncompatibleClassChangeError: The method 'void setCallback(kotlin.jvm.functions.Function2)' was expected to be of type virtual but instead was found to be of type static (declaration of 'com.demo.basic.Application' appears in /data/app/com.demo.basic-_0uJXPbtfs3UZ2Rp2h-RdQ==/base.apk!classes2.dex)


我是在某处犯了错误,还是预期这是某种限制?
我尝试了什么?
  • 删除 @Jvmstatic解决了这个问题,但它创建了丑陋的 Java 调用代码
  • 保留@Jvmstatic但删除了Lambda将 Lambda 转换为 interface with one method一切正常。不幸的是 SAM for Kotlin classes还没有,所以调用Kotlin代码看起来很难看。
  • 最佳答案

    这在 R8 问题跟踪器 http://issuetracker.google.com/158393309 上进行了跟踪。其中有更多细节。

    简而言之,这已在 R8 版本 2.1.35 中修复,可以通过对顶层 build.gradle 进行以下更改来使用它文件:

    repositories {
    maven {
    url 'https://storage.googleapis.com/r8-releases/raw'
    }
    }

    dependencies {
    classpath 'com.android.tools:r8:2.1.35' // Must be before the Gradle Plugin for Android.
    classpath 'com.android.tools.build:gradle:X.Y.Z' // Your current AGP version.
    }

    关于kotlin - 在用 Kotlin 编写的 Android 库的公共(public) API 中处理 R8 + JvmStatic Annotation + Lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62249685/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com