AndroidStudio 更新到 3.3.1 后 AndroidX 库转换失败,这是 Jetifier 错误吗?
AndroidX conversion failure for library after Android Studio update to 3.3.1, is this a Jetifier bug?
我正在使用库查克
https://github.com/jgilfelt/chuck
我不确定什么时候,但我最近做了一个 Android Studio 更新,我认为这可能是根本原因,因为它似乎与 jetifier 的 androidx 转换有关,目前我正在 Android Studio 3.3.1
在更新之前,我一直让 Chuck 正常工作,而且我已经在 AndroidX 上使用了很长一段时间,所以这是一个 jetifier 错误吗?或者这是预期的,现在是时候我 fork 这个 2 年前的项目,并将其转换为 AndroidX 兼容性?这个库真是个福音,我真的不想失去它。
当我查看 Chuck 源代码时,BaseChuckActivity 正在扩展 AppCompatActivity,而 AppCompatActivity 应该已经在扩展 LifecycleOwner class,所以我得出结论,这似乎是一个 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)
因此,由于我的问题在 SO 中没有 activity,我付出了额外的努力来弄清楚,我分叉了 Chuck 项目,将所有内容更新为 Androidx,并将目标和编译 SDK 更新为 28和 tada 崩溃仍然发生(它似乎在使用装载机时发生?),所以即使崩溃使它看起来像一个 jetifier 错误,它很明显不是一个 jetifier 错误,因为现在新的 Chuck aar 完全基于 AndroidX(我后来更进一步,甚至将库使用的语言从 Java 更新为 Kotlin)所以我认为罪魁祸首是 androidx 库,我查看了我的 appcompat 库,因为崩溃是说 Chuck activity 没有实现 LifeCycleOwner,这是错误的,因为 AppCompatActivity 是一个 LifeCycleOwner,所以我在版本 "androidx.appcompat:appcompat:1.0.2" 并将其更改为 "androidx.appcompat:appcompat:1.1.0-alpha02" 并且不再崩溃!! (即使在必须jetified的原始库上)
所以发生了什么事?我认为我可能包含的某些依赖项一定是在使用 1.1.0.variant 或其他有错误实现的东西,而较新的库一定优先于我的 1.0.2,所以另一个解决方案应该是强制对 androidx.appcompat 使用 1.0.2,例如
configurations.all {
resolutionStrategy {
force 'androidx.appcompat:appcompat:1.0.2'
}
}
我没有测试过上面的内容,但理论上如果你想坚持使用稳定版本,它应该可以工作,否则你可以换成我上面提到的 alpha 变体,它肯定可以工作。
我正在使用库查克 https://github.com/jgilfelt/chuck
我不确定什么时候,但我最近做了一个 Android Studio 更新,我认为这可能是根本原因,因为它似乎与 jetifier 的 androidx 转换有关,目前我正在 Android Studio 3.3.1
在更新之前,我一直让 Chuck 正常工作,而且我已经在 AndroidX 上使用了很长一段时间,所以这是一个 jetifier 错误吗?或者这是预期的,现在是时候我 fork 这个 2 年前的项目,并将其转换为 AndroidX 兼容性?这个库真是个福音,我真的不想失去它。
当我查看 Chuck 源代码时,BaseChuckActivity 正在扩展 AppCompatActivity,而 AppCompatActivity 应该已经在扩展 LifecycleOwner class,所以我得出结论,这似乎是一个 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)
因此,由于我的问题在 SO 中没有 activity,我付出了额外的努力来弄清楚,我分叉了 Chuck 项目,将所有内容更新为 Androidx,并将目标和编译 SDK 更新为 28和 tada 崩溃仍然发生(它似乎在使用装载机时发生?),所以即使崩溃使它看起来像一个 jetifier 错误,它很明显不是一个 jetifier 错误,因为现在新的 Chuck aar 完全基于 AndroidX(我后来更进一步,甚至将库使用的语言从 Java 更新为 Kotlin)所以我认为罪魁祸首是 androidx 库,我查看了我的 appcompat 库,因为崩溃是说 Chuck activity 没有实现 LifeCycleOwner,这是错误的,因为 AppCompatActivity 是一个 LifeCycleOwner,所以我在版本 "androidx.appcompat:appcompat:1.0.2" 并将其更改为 "androidx.appcompat:appcompat:1.1.0-alpha02" 并且不再崩溃!! (即使在必须jetified的原始库上)
所以发生了什么事?我认为我可能包含的某些依赖项一定是在使用 1.1.0.variant 或其他有错误实现的东西,而较新的库一定优先于我的 1.0.2,所以另一个解决方案应该是强制对 androidx.appcompat 使用 1.0.2,例如
configurations.all {
resolutionStrategy {
force 'androidx.appcompat:appcompat:1.0.2'
}
}
我没有测试过上面的内容,但理论上如果你想坚持使用稳定版本,它应该可以工作,否则你可以换成我上面提到的 alpha 变体,它肯定可以工作。