【发布时间】:2020-07-25 12:12:03
【问题描述】:
我最近迁移了我的项目以使用 AndroidX
在我迁移到 AndroidX 后,我的应用程序崩溃了,因为库仍在使用 Support Library。这是我的第 3 方依赖项/库的列表,它未能转换为 AndroidX:
com.clevertap.android:clevertap-android-sdk:3.4.2com.readystatesoftware.chuck:library:1.1.0com.ncapdevi:frag-nav:2.4.0jp.wasabeef:recyclerview-animators:2.3.0com.github.chivorns:smartmaterialspinner:1.1.6com.facebook.android:facebook-android-sdk:5.0.1-
com.github.PierfrancescoSoffritti:AndroidYouTubePlayer:7.0.1(我仍然无法将其升级到 10.x.x,因为 API 发生了重大变化) com.github.nikartm:image-support:1.0.5
我的设置:
AS & AGP: 3.6.2
targetSdk: 29
minSdk: 16
Data & View Binding: Both enabled
Gradle DSL: Kotlin
Gradle: gradle-6.0.1-all
到目前为止我做了什么:
- 使用 Android Studio 中的
Refactor -> Migrate to AndroidX工具,但最终强制关闭它,因为需要很长时间 -
android.enableJetifier=true&android.useAndroidX=true - 使用shell脚本手动将artifact, class and imports从支持库映射到AndroidX,thanks @Danlew,还有@Danlew mentioned in ADS '19 talks here
- 已经检查了我的
:app:dependencies,第 3 方依赖项已经迁移到使用 AndroidX 工件,但只有少数(上述依赖项列表失败) - 删除
./root_project/.idea、./root_project/.gradle和~/.gradle/caches(修复编译错误/IDE错误,参考:AndroidX migrate dependency / libraries - 了解喷射器:What is Jetifier? & official android docs
- 解决方法将 AndroidX 用于注释处理器,例如:Glide & Dagger
- 检查
~/.gradle目录中是否存在jetified-*库 和jetifiedaar,不幸的是,对于clevertap和上面列出的其他库,它失败了。
我的结论是,如果检测到 Support Library 导入/类,jetifier 的工作原理是重写我们第三方库的二进制 .class,并将其修改(喷射/映射)为 AndroidX。
但在我的例子中,上面列出的依赖项没有使用正确的AndroidX导入并导致运行时崩溃,因为支持库具有传递依赖项。
jetifier 目前是否也不支持 3rd-party 库中的传递依赖?但是,奇怪的是它适用于一些图书馆(上面未列出)
[更新 1]
与此同时(快速修复):
- 我确实一个一个地详尽地下载了库的所有传递依赖项
- 使用
jetifier-standalone命令代替库aar - 手动将库
aar及其依赖项添加到app/build.gradle.kts为flatDirs
这真的是一种解决方法吗,有什么更好的办法吗?
[更新 2]
我也使用了一个维护版本的卡盘。但也发现了同样的问题:
cannot generate view binders com.sun.tools.javac.code.Symbol$CompletionFailure: class file for android.support.v7.widget.AppCompatImageView not found
在检查了我的 3rd-party 库之后,我还为这个库使用了 jetifier-standalone 之后手动添加了 aar:
com.clevertap.android:clevertap-android-sdk:3.4.2com.github.nikartm:image-support:1.0.5
许多人还建议使用api instead of implementation,但对我来说,我不想让我的项目因传递依赖而变得臃肿
在other SO下面也推荐:
- 要么删除库,
- fork 支持androidx / 等待作者升级
- 为这些特定库手动使用
jetifier-standalone,并作为本地 aar 包含(这是我目前最好的方法)
除非jetifier 能够在官方文档中说明这一点,因为它的局限性:https://developer.android.com/jetpack/androidx/releases/jetifier
似乎我们能做的最少,希望许多第 3 方作者能尽快升级到 AndroidX。
这是一篇供参考的奖励文章:
【问题讨论】:
-
您是否尝试过使用actually maintained fork of chuck?
-
感谢 @ianhanniballake 将我指向维护的夹头,将对其进行更新。我还更新了我的问题,以获取有关失败的依赖项列表的详细信息。我是否必须自己重写该库以支持 androidx 或手动使用
jetifier-standalone?或者有什么办法可以吗? -
我已经更新它以使用维护的夹头库,但现在发现了这个问题:
cannot generate view binders com.sun.tools.javac.code.Symbol$CompletionFailure: class file for android.support.v7.widget.AppCompatImageView not found这是否意味着,jetifier 无法将其他库转换为 AndroidX? @ianhanniballake 我也删除了我的 .gradle & .idea 似乎也不起作用
标签: android android-studio android-support-library androidx android-jetifier