我得到了一个看起来像是简单的ProGuard错误,说找不到引用的类。在将类从Java迁移到Kotlin之后,就会发生错误。
Warning: com.x.android.ui.ads.offerwall.OfferWallLoader$initIronSrc$1$1$run$1$1: can't find referenced class com.x.android.ui.ads.offerwall.OfferWallLoader$initIronSrc$1$1
Warning: com.x.android.ui.ads.offerwall.OfferWallLoader$initIronSrc$1$1$run$1$1: can't find referenced class com.x.android.ui.ads.offerwall.OfferWallLoader$initIronSrc$1$1
问题是我试图将其保存在proguard文件中,但似乎没有效果。.
-keep class com.x.android.ui.ads.offerwall.OfferWallLoader$initIronSrc$* { *;}
在名称中保留$后面的类或成员时,我不确定是否会有所区别。 我该怎么解决,我在做什么错了?
编辑:这是迁移到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$1$1$run$1$1
答案 0 :(得分:1)
经过一些调查和调查,结果发现这是Jetbrains跟踪到的问题:https://youtrack.jetbrains.com/issue/KT-16084
基本上: Proguard无法在应用闭包中找到let闭包的封闭类 因此,嵌套类或嵌套调用似乎是一个问题。
在我的情况下,我将静态方法调用包含在 synchronized 块中,因此proguard无法解决该调用。
解决方案是将调用移出该块。在这种情况下,无论如何都可以处理同步,请确保只使用一次代码并进行单个协作者初始化:
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
}
}
})
}