【问题标题】:AndroidX conversion failure for library after Android Studio update to 3.3.1, is this a Jetifier bug?Android Studio 更新到 3.3.1 后库的 AndroidX 转换失败,这是 Jetifier 错误吗?
【发布时间】:2019-07-20 22:53:10
【问题描述】:

我正在使用库 Chuck https://github.com/jgilfelt/chuck

我不确定是什么时候,但我最近更新了 Android Studio,我认为这可能是根本原因,因为它似乎与 jetifier 转换 androidx 有关,目前我使用的是 Android Studio 3.3.1

在更新之前我让 Chuck 正常工作,而且我已经使用 AndroidX 很长一段时间了,所以这是一个 jetifier 错误吗?或者这是预期的,是我分叉这个 2 年的项目并将其转换为 AndroidX 兼容性的时候了?这个库很不错,我真的不想放弃它。

当我查看 Chuck 源时,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)

【问题讨论】:

    标签: android android-studio androidx appcompatactivity android-jetifier


    【解决方案1】:

    因此,由于我的问题在 SO 中没有任何活动,因此我加倍努力想弄清楚,我将 Chuck 项目分叉,将所有内容更新到 Androidx 并更新了目标并将 SDK 编译到 28 和 tada 崩溃仍然发生(这似乎是在使用 Loaders 时发生的?),所以即使崩溃使它看起来像一个 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.variant 或其他具有错误实现的东西,并且较新的库必须优先于我的 1.0.2,因此其他解决方案应该强制将 1.0.2 用于 androidx.appcompat 之类的

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

    我还没有测试过上面的,但理论上如果你想坚持稳定版本它应该可以工作,否则你可以更改为我上面提到的 alpha 变体,它肯定可以工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-29
      • 1970-01-01
      • 2019-04-11
      • 2019-08-22
      • 1970-01-01
      • 2019-09-13
      • 2019-02-28
      • 2019-07-18
      相关资源
      最近更新 更多