首先请注意,我并不期待why do you want to obfuscate library
评论。这是我要问的一个真正的问题。
我在使用 Kotlin 编写的 Android 库处理 R8/混淆时遇到了问题。
我有一个公共 API 方法,其注释为@JvmStatic
该方法需要一个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
and Kotlin
已按预期写入。
但现在我想在打开时释放库minification
.
这就产生了一个问题。
这是错误
java.lang.InknownClassChangeError:方法“void setCallback(kotlin.jvm.functions.Function2)”预计为 virtual 类型,但发现为 static 类型(出现“com.demo.basic.Application”声明)在/data/app/com.demo.basic-_0uJXPbtfs3UZ2Rp2h-RdQ==/base.apk!classes2.dex)
我是否在某个地方犯了错误,或者这被认为是某种限制?
我尝试了什么?
-
去除@Jvmstatic
解决了问题,但它创建了丑陋的 Java 调用代码
-
Kept @Jvmstatic
但删除了Lambda
将 Lambda 转换为interface with one method
一切正常。很遗憾SAM for Kotlin classes
还没到,所以打电话Kotlin
代码看起来很难看。
这是在 R8 问题跟踪器上跟踪的http://issuetracker.google.com/158393309 http://issuetracker.google.com/158393309其中有更多详细信息。
简而言之,这个问题已在 R8 2.1.35 版本中修复,可以通过对顶层进行以下更改来使用build.gradle
file:
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.
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)