迁移到 Kotlin 后,Proguard 找不到引用的 class
Proguard can't find referenced class after migration to Kotlin
我收到一个看似简单的 ProGuard 错误,指出无法找到引用的 class。在将 class 从 Java 迁移到 Kotlin 后不久发生错误。
Warning: com.x.android.ui.ads.offerwall.OfferWallLoader$initIronSrc$run: can't find referenced class com.x.android.ui.ads.offerwall.OfferWallLoader$initIronSrc
Warning: com.x.android.ui.ads.offerwall.OfferWallLoader$initIronSrc$run: can't find referenced class com.x.android.ui.ads.offerwall.OfferWallLoader$initIronSrc
问题是我试图将它保留在混淆文件中,但它看起来没有效果..
-keep class com.x.android.ui.ads.offerwall.OfferWallLoader$initIronSrc$* { *;}
我不确定在名称中的 $ 后面保留 class 或成员时的区别。
我该如何解决它,我做错了什么?
编辑:这是迁移到 Kotlin 的失败代码(代码已简化):
private fun initIronSrc(activity: Activity) {
synchronized(initIronSrcLock) {
if (isIronSourceInitialised) {
return
}
MyStaticClass.callAsync(object : BackgroundRunnable() {
override fun run(backgroundServiceAccess: BackgroundServiceAccess) {
synchronized(initIronSrcLock) {
if (isIronSourceInitialised) {
return
}
// Init IronSource
}
}
})
}
}
通知访问失败initIronSrc$run
经过一些挖掘和调查后发现这是 Jetbrains 的一个跟踪问题:https://youtrack.jetbrains.com/issue/KT-16084
基本上:Proguard 无法在 apply 闭包中找到包含 class 的 let 闭包
因此,嵌套 classes 或嵌套调用似乎是一个问题。
在我的例子中,我在 synchronized 块中封装了一个静态方法调用,因此混淆器无法解析该调用。
解决方案是从该块中取出调用。在这种情况下,无论如何都可以处理同步,确保代码的单一使用和单一合作者初始化:
private fun initIronSrc(activity: Activity) {
synchronized(initIronSrcLock) {
if (isIronSourceInitialised) {
return
}
}
MyStaticClass.callAsync(object : BackgroundRunnable() {
override fun run(backgroundServiceAccess: BackgroundServiceAccess) {
synchronized(initIronSrcLock) {
if (isIronSourceInitialised) {
return
}
// Init IronSource
}
}
})
}
我收到一个看似简单的 ProGuard 错误,指出无法找到引用的 class。在将 class 从 Java 迁移到 Kotlin 后不久发生错误。
Warning: com.x.android.ui.ads.offerwall.OfferWallLoader$initIronSrc$run: can't find referenced class com.x.android.ui.ads.offerwall.OfferWallLoader$initIronSrc
Warning: com.x.android.ui.ads.offerwall.OfferWallLoader$initIronSrc$run: can't find referenced class com.x.android.ui.ads.offerwall.OfferWallLoader$initIronSrc
问题是我试图将它保留在混淆文件中,但它看起来没有效果..
-keep class com.x.android.ui.ads.offerwall.OfferWallLoader$initIronSrc$* { *;}
我不确定在名称中的 $ 后面保留 class 或成员时的区别。 我该如何解决它,我做错了什么?
编辑:这是迁移到 Kotlin 的失败代码(代码已简化):
private fun initIronSrc(activity: Activity) {
synchronized(initIronSrcLock) {
if (isIronSourceInitialised) {
return
}
MyStaticClass.callAsync(object : BackgroundRunnable() {
override fun run(backgroundServiceAccess: BackgroundServiceAccess) {
synchronized(initIronSrcLock) {
if (isIronSourceInitialised) {
return
}
// Init IronSource
}
}
})
}
}
通知访问失败initIronSrc$run
经过一些挖掘和调查后发现这是 Jetbrains 的一个跟踪问题:https://youtrack.jetbrains.com/issue/KT-16084
基本上:Proguard 无法在 apply 闭包中找到包含 class 的 let 闭包 因此,嵌套 classes 或嵌套调用似乎是一个问题。
在我的例子中,我在 synchronized 块中封装了一个静态方法调用,因此混淆器无法解析该调用。
解决方案是从该块中取出调用。在这种情况下,无论如何都可以处理同步,确保代码的单一使用和单一合作者初始化:
private fun initIronSrc(activity: Activity) {
synchronized(initIronSrcLock) {
if (isIronSourceInitialised) {
return
}
}
MyStaticClass.callAsync(object : BackgroundRunnable() {
override fun run(backgroundServiceAccess: BackgroundServiceAccess) {
synchronized(initIronSrcLock) {
if (isIronSourceInitialised) {
return
}
// Init IronSource
}
}
})
}