将其迁移到Kotlin后,Proguard找不到引用的类

时间:2019-04-23 21:54:13

标签: proguard

我得到了一个看起来像是简单的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

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
            }
        }
    })
}