Ошибка преобразования AndroidX для библиотеки после обновления Android Studio до версии 3.3.1. Является ли это ошибкой Jetifier?

Я использую библиотеку Чака https://github.com/jgilfelt/chuck

Я не совсем уверен, когда, но я недавно обновил Android Studio, и я думаю, что это, вероятно, основная причина, поскольку, похоже, это связано с преобразованием androidx с помощью jetifier, в настоящее время я использую Android Studio 3.3.1

У меня Чак работал нормально до обновления, и я был на AndroidX довольно долгое время, так что это ошибка? Или это ожидаемо, и пора мне форкнуть проект двухлетней давности и преобразовать его для совместимости с AndroidX? Эта библиотека - настоящее благо, и я действительно не хочу ее терять.

Когда я смотрю на исходный код Чака, BaseChuckActivity расширяет AppCompatActivity, который уже должен расширять класс LifecycleOwner, поэтому я пришел к выводу, что это, похоже, ошибка Jetifier.

Авария, которую я получаю

java.lang.IncompatibleClassChangeError: Class 'com.readystatesoftware.chuck.internal.ui.TransactionActivity' does not implement interface 'androidx.lifecycle.LifecycleOwner' in call to 'androidx.lifecycle.Lifecycle androidx.lifecycle.LifecycleOwner.getLifecycle()' (declaration of 'androidx.lifecycle.LiveData' appears in /data/app/com.burstoralcare-k6cLY7GKXKIODVqHmJokmw==/split_lib_dependencies_apk.apk)
    at androidx.lifecycle.LiveData.observe(LiveData.java:172)
    at androidx.loader.app.LoaderManagerImpl$LoaderInfo.setCallback(LoaderManagerImpl.java:100)
    at androidx.loader.app.LoaderManagerImpl.createAndInstallLoader(LoaderManagerImpl.java:400)
    at androidx.loader.app.LoaderManagerImpl.initLoader(LoaderManagerImpl.java:421)
    at com.readystatesoftware.chuck.internal.ui.TransactionActivity.onCreate(TransactionActivity.java:91)
    at android.app.Activity.performCreate(Activity.java:7136)
    at android.app.Activity.performCreate(Activity.java:7127)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2893)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048)
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:193)
    at android.app.ActivityThread.main(ActivityThread.java:6669)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

person king_below_my_lord    schedule 27.02.2019    source источник


Ответы (1)


Итак, поскольку по моему вопросу в SO не было никакой активности, я приложил дополнительные усилия, чтобы понять это, я разветвил проект Chuck, обновил все до Androidx, обновил цель и скомпилировал SDK до 28 и тада, АВАРИЯ ВСЕ ЕЩЕ ПРОИЗОШЛА (казалось при использовании загрузчиков?), поэтому, хотя сбой сделал его похожим на ошибку jetifier, совершенно очевидно, что это не ошибка jetifier, потому что теперь новый Chuck aar полностью основан на AndroidX (позже я пошел немного дальше и даже обновил язык, используемый библиотекой от Java до Kotlin), поэтому я предположил, что виновником были библиотеки androidx, я посмотрел на мою библиотеку appcompat, потому что сбой говорил, что действие Chuck не реализует LifeCycleOwner, что было неправильно, потому что AppCompatActivity был LifeCycleOwner, поэтому У меня была версия «androidx.appcompat: appcompat: 1.0.2», я изменил ее на «androidx.appcompat: appcompat: 1.1.0-alpha02», и больше никаких сбоев !! (Даже в исходной библиотеке, которая должна быть проверена)

Итак, что случилось? Я думаю, что какая-то зависимость, которую я мог включить, должна была использовать вариант 1.1.0. Или что-то еще, в котором была ошибочная реализация, и более новая библиотека должна была иметь приоритет над моей 1.0.2, поэтому другое решение должно заставлять использование 1.0.2 для androidx.appcompat что-то вроде

configurations.all {
    resolutionStrategy { 
        force 'androidx.appcompat:appcompat:1.0.2'
    }
}

Я не тестировал вышеперечисленное, но теоретически он должен работать, если вы хотите придерживаться стабильной версии, в противном случае вы можете просто перейти на альфа-вариант, о котором я упоминал выше, и он определенно должен работать.

person king_below_my_lord    schedule 02.03.2019