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

问题描述 投票:0回答:1

我得到的是一个简单的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

proguard
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
            }
        }
    })
}
© www.soinside.com 2019 - 2024. All rights reserved.