首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法/未能转换仍然使用支持库的第三方传递依赖关系的AndroidX引导符

无法/未能转换仍然使用支持库的第三方传递依赖关系的AndroidX引导符
EN

Stack Overflow用户
提问于 2020-04-12 23:05:56
回答 1查看 3.8K关注 0票数 1

最近,我将我的项目迁移到使用AndroidX

我的应用程序在迁移到AndroidX之后崩溃,原因是库仍然使用Support 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

我的设置:

代码语言:javascript
运行
复制
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工具,但最终强制关闭它,因为需要很长时间
  2. android.enableJetifier=true & android.useAndroidX=true
  3. 使用shell脚本将工件、类和导入从Support Library手动映射到AndroidX、谢谢@Danlew@Danlew在ADS的19次演讲中提到
  4. 已经检查了我的:app:dependencies,第三方依赖项已经迁移到使用AndroidX工件,但只有少数(上面的依赖项列表失败)。
  5. 删除./root_project/.idea./root_project/.gradle~/.gradle/caches (要修复编译错误/IDE错误,引用:AndroidX迁移依赖/库 )
  6. 理解玩艺儿:什么是吉蒂弗? & 官方android文档
  7. 使用AndroidX作为注释处理器的解决方案,如:滑翔与匕首
  8. 检查~/.gradle目录中的jetified-*

jetified aar存在,不幸的是,它对clevertap和上面列出的其他库失败了。

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

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

嘲笑者目前也不支持第三方库中的传递依赖吗?但是,奇怪的是,它在一些图书馆工作(上面没有列出)。

更新1

同时(快速修正):

  1. 我逐个下载了库的所有传递依赖项。
  2. 为库aar使用aar命令
  3. 将库aar及其依赖项手动添加到app/build.gradle.kts中作为flatDirs

这真的是个解决办法吗,还有什么更好的办法吗?

更新2

我也使用了一个维护版本的恰克。但也发现了同样的问题:

代码语言:javascript
运行
复制
cannot generate view binders com.sun.tools.javac.code.Symbol$CompletionFailure: class file for android.support.v7.widget.AppCompatImageView not found

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

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

许多人还建议使用implementation,但对我来说,我不想用传递依赖来充实我的项目

其他情况中,还建议如下:

  1. 要么移除图书馆,
  2. 分叉支持androidx /等待作者对其进行升级
  3. 手动使用jetifier-standalone作为本地aar (这是我现在最好的方法)。

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

看来我们至少可以做些什么,希望许多第三方作家很快就能升级到AndroidX。

这里有一篇值得参考的文章:

  1. 您可以将易拉罐库用于检测您的lib(临时的)是否需要启用或不启用
  2. 带着这个小步子
  3. 同时也让人头疼
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-13 20:21:39

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

将黑名单变成白名单的神奇法则

代码语言:javascript
运行
复制
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
  5. YoutubeAndroidPlayer (v7)仍未使用v10
  6. 多产互作
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61179356

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档