Proguard не может найти указанный класс после перехода на Kotlin - PullRequest
0 голосов
/ 24 апреля 2019

Я получаю сообщение об ошибке 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 Ответ

2 голосов
/ 24 апреля 2019

После некоторого копания и исследования выяснилось, что это отслеживаемая проблема от Jetbrains: https://youtrack.jetbrains.com/issue/KT-16084

В основном: Proguard не может найти вмещающий класс let let замыкания внутри применения замыкания Итак, похоже, проблема с вложенными классами или вложенными вызовами.

В моем случае я заключаю статический вызов метода в синхронизированный блок, поэтому proguard не может разрешитьcall.

Решение - получить вызов из этого блока.В этом случае синхронизация может быть обработана в любом случае, будучи уверенным в одноразовом использовании кода и инициализации одного колоратора:

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