【问题标题】:AndroidX Jetifier unable/failed to transform 3rd-party transitive dependency that still use Support LibraryAndroidX Jetifier 无法/未能转换仍然使用支持库的 3rd-party 传递依赖项
【发布时间】:2020-07-25 12:12:03
【问题描述】:

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

在我迁移到 AndroidX 后,我的应用程序崩溃了,因为库仍在使用 Support Library。这是我的第 3 方依赖项/库的列表,它未能转换为 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支持库映射到AndroidXthanks @Danlew,还有@Danlew mentioned in ADS '19 talks here
  4. 已经检查了我的:app:dependencies,第 3 方依赖项已经迁移到使用 AndroidX 工件,但只有少数(上述依赖项列表失败)
  5. 删除./root_project/.idea./root_project/.gradle~/.gradle/caches(修复编译错误/IDE错误,参考:AndroidX migrate dependency / libraries
  6. 了解喷射器:What is Jetifier? & official android docs
  7. 解决方法将 AndroidX 用于注释处理器,例如:Glide & Dagger
  8. 检查~/.gradle 目录中是否存在jetified-*jetified aar,不幸的是,对于clevertap 和上面列出的其他库,它失败了。

我的结论是,如果检测到 Support Library 导入/类,jetifier 的工作原理是重写我们第三方库的二进制 .class,并将其修改(喷射/映射)为 AndroidX

但在我的例子中,上面列出的依赖项没有使用正确的AndroidX导入并导致运行时崩溃,因为支持库具有传递依赖项

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

[更新 1]

与此同时(快速修复):

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

这真的是一种解决方法吗,有什么更好的办法吗?

[更新 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

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

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

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 库到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

【问题讨论】:

  • 您是否尝试过使用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


【解决方案1】:

原来我目前的解决方法是使用这种方法: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. nikartm
  4. facebook-sdk
  5. YoutubeAndroidPlayer (v7) 仍未使用 v10
  6. 多产互动

【讨论】:

    猜你喜欢
    • 2019-05-13
    • 1970-01-01
    • 2019-08-22
    • 2020-03-29
    • 2019-04-24
    • 1970-01-01
    • 1970-01-01
    • 2018-05-13
    • 2019-04-19
    相关资源
    最近更新 更多