AndroidX Jetifier unable/failed 转换仍然使用支持库的 3rd 方传递依赖

AndroidX Jetifier unable/failed to transform 3rd-party transitive dependency that still use Support Library

我最近迁移了我的项目以使用 AndroidX

在我迁移到 AndroidX 后,我的应用程序崩溃了,因为库仍在使用 支持库。这是我的第 3 方 dependencies/library 的列表,未能转换为 AndroidX:

  1. com.clevertap.android:clevertap-android-sdk:3.4.2
  2. com.readystatesoftware.chuck:library:1.1.0
  3. com.ncapdevi:frag-nav:2.4.0
  4. jp.wasabeef:recyclerview-animators:2.3.0
  5. com.github.chivorns:smartmaterialspinner:1.1.6
  6. com.facebook.android:facebook-android-sdk:5.0.1
  7. com.github.PierfrancescoSoffritti:AndroidYouTubePlayer:7.0.1(我还是不能升级到10.x.x,因为主要的API变化了)
  8. 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

到目前为止我做了什么:

  1. 使用 Android Studio 中的 Refactor -> Migrate to AndroidX 工具,但最终强制关闭它,因为需要很长时间
  2. android.enableJetifier=true & android.useAndroidX=true
  3. 使用shell脚本手动映射artifact, class and imports from Support Library to AndroidX, thanks @Danlew, also @Danlew mentioned in ADS '19 talks here
  4. 已经检查了我的 :app:dependencies,第 3 方依赖项已经迁移到使用 AndroidX 工件,但只有少数(因为以上依赖项列表)
  5. 删除./root_project/.idea./root_project/.gradle & ~/.gradle/caches(修复compile-error/IDE错误,参考:
  6. 了解喷射器: & official android docs
  7. 是否使用 AndroidX 作为注释处理器的解决方法,例如:Glide & Dagger
  8. 正在检查 ~/.gradle 目录中的 jetified-* jetified aar 存在,不幸的是 clevertap 和上面列出的其他库失败了。

我的结论是,如果检测到 支持库 imports/class,jetifier 通过重写我们第 3 方库的二进制 .class 来工作,并将(jetified/mapping它)分别修改为AndroidX

但就我而言,上面列出的 依赖项 没有使用正确的 AndroidX 导入并导致运行时崩溃, 由于 支持库 .

具有传递依赖

jetifier 目前也不支持 3rd 方库中的传递依赖吗?但是,奇怪的是它适用于一些图书馆(上面未列出)

[更新 1]

同时(快速修复):

  1. 我确实一个一个地详尽地下载了库的所有传递依赖项
  2. 使用 jetifier-standalone 命令代替库 aar
  3. 手动将库 aar 及其依赖项添加到 app/build.gradle.kts 作为 flatDirs

这真的是一种解决方法吗,我能做些什么更好的事情吗?

[更新 2]

我也在使用 chuck 的维护版本。但也发现了同样的问题:

cannot generate view binders com.sun.tools.javac.code.Symbol$CompletionFailure: class file for android.support.v7.widget.AppCompatImageView not found

在检查了我的第 3 方库之后,我还手动添加了 aar 之后我对这个库使用了 jetifier-standalone

  1. com.clevertap.android:clevertap-android-sdk:3.4.2
  2. com.github.nikartm:image-support:1.0.5

许多人还建议使用 但对我来说,我不想让我的项目因传递依赖而变得臃肿

other SO下面还推荐:

  1. 要么删除库,
  2. fork 支持androidx / 等待作者升级
  3. 为那些特定的库手动使用 jetifier-standalone,并将其包含为本地 aar(这是我目前最好的方法)

除非jetifier能够在官方文档中说明这一点,因为它的局限性:https://developer.android.com/jetpack/androidx/releases/jetifier

似乎我们能做的最少,希望许多第 3 方作者能尽快升级到 AndroidX

附赠一篇参考文献:

  1. 您可以使用can-i-drop-jetifier libs to detects does your libs (transitively) needs jetifier enabled or not
  2. The time is right to migrate to AndroidX with this baby-steps
  3. Better structure packaging with AndroidX and also a headache along the way

原来我目前的解决方法是使用这种方法:https://github.com/bumptech/glide/issues/3080#issuecomment-495430590

神奇的正则表达式将黑名单变成白名单

android.jetifier.blacklist=^(?!.*[\\/](com\.github\.bumptech\.glide|com\.clevertap\.android|com\.facebook\.android|com\.github\.nikartm|com\.github\.PierfrancescoSoffritti|com\.github\.prolificinteractive)[\\/]).*$

如果抛出 NoClassDef 异常,那么我将库包名称添加到 android.jetifier.blacklist 中以将它们列入白名单。

在上述情况下,我尝试将其列入白名单:

  1. 滑行
  2. 妙手
  3. 尼卡特姆
  4. facebook-sdk
  5. YoutubeAndroidPlayer (v7) 仍未使用 v10
  6. 多产互动