首页 > 解决方案 > AndroidX Jetifier 无法/未能转换仍然使用支持库的 3rd-party 传递依赖项

问题描述

我最近迁移了我的项目以使用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.xx,因为主要的 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 StudioRefactor -> Migrate to AndroidX中的工具,但最终强制关闭它,因为需要很长时间
  2. android.enableJetifier=true&android.useAndroidX=true
  3. 使用 shell 脚本手动将支持库中的工件、类和导入映射到AndroidX,也感谢@Danlew感谢 @Danlew在 ADS '19 会谈中提到的这里
  4. 已经检查过我:app:dependencies的 3rd-party 依赖项已经迁移到使用AndroidX工件,但只有少数(上述依赖项列表失败)
  5. 删除./root_project/.idea./root_project/.gradle& ~/.gradle/caches(修复编译错误/IDE错误,参考:AndroidX迁移依赖/库
  6. 了解喷射器:什么是喷射器?官方安卓文档
  7. 做了一个解决方法来使用AndroidX注释处理器,比如:Glide & Dagger
  8. 检查aar 存在的库的~/.gradle目录,不幸的是,上面列出的 & 其他库失败了。jetified-*我的 <code>~/.gradle</code> 内容截图jetifiedclevertap

我的结论是,如果检测到支持库jetifier导入/类,则通过重写.class我们的第 3 方库的二进制文件,并将其分别修改(jetified/mapping)到AndroidX中。

但就我而言,上面列出的依赖项没有使用正确的 AndroidX导入并导致运行时崩溃,因为Support Library具有传递依赖项。

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

[更新 1]

与此同时(快速修复):

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

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

[更新 2]

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

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

在检查了我的 3rd-party 库之后,我还最终手动添加了用于此库的aarafter :jetifier-standalone

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

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

其他 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库来检测您的库(传递地)是否需要启用 jetifier
  2. 使用这些小步骤迁移到AndroidX的时机已经成熟
  3. 用AndroidX更好的结构打包,一路走来也很头疼

标签: androidandroid-studioandroid-support-libraryandroidxandroid-jetifier

解决方案


原来我目前的解决方法是使用这种方法: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. 多产互动

推荐阅读