迁移到 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
            }
        }
    })
}