我得到的是一个简单的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
在进行了一些挖掘和调查之后,结果证明是Jetbrains的跟踪问题:https://youtrack.jetbrains.com/issue/KT-16084
基本上:Proguard找不到封闭类的let闭包里面应用闭包所以,似乎是嵌套类或嵌套调用的问题。
在我的情况下,我在同步块中包含静态方法调用,因此proguard无法解析调用。
解决方案是从该块中获取调用。在这种情况下,无论如何都可以处理同步,确保单独使用代码和单个colaborator初始化:
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
}
}
})
}