【问题标题】:How to know if a support library already supports AndroidX?如何知道支持库是否已经支持 AndroidX?
【发布时间】:2023-02-20 17:57:06
【问题描述】:

我有统一的项目,使用 Mapbox,
Mapbox 包括以下支持库:support-v4-25.1.0.aar
这个库以 .aar 文件的形式出现,而不是以 gradle implementation 命令的形式出现
尝试构建项目时出现此错误:

无法确定任务“:launcher:lintVitalRelease”的依赖项。
无法解析配置“:launcher:debugRuntimeClasspath”的所有工件。
无法转换 support-v4-25.1.0-.aar (:support-v4-25.1.0:) 以匹配属性 {artifactType=android-manifest, org.gradle.status=integration}。
> JetifyTransform 执行失败:
C:\Users\EFGH\Documents\GitHub\AREX\Temp\gradleOut\unityLibrary\libs\support-v4-25.1.0.aar。
> 使用 Jetifier 转换 'C:\Users\EFGH\Documents\GitHub\AREX\Temp\gradleOut\unityLibrary\libs\support-v4-25.1.0.aar' 失败。
原因:AmbiguousStringJetifierException,消息:给定的工件包含一个字符串文字,其中包含无法安全重写的包引用“android.support.v4”。使用反射的库(例如注释处理器)需要手动更新以添加对 androidx 的支持。(使用 --stacktrace 运行以获取更多详细信息。)
这是一个已知的异常,Jetifier 将无法对这个库进行 jetify。 建议:
-如果你认为这个库不需要被jetified(例如,如果它已经支持AndroidX,或者如果它根本不使用支持库/AndroidX),添加android.jetifier.blacklist = {comma-separated list of regular你不想被jetified的库的表达式(或简单的名称)到gradle.properties文件。
- 如果你认为这个库需要被jetified(例如,如果它使用旧的支持库并且如果它没有jetified会破坏你的应用程序),请联系库的作者更新这个库以支持AndroidX并在支持的版本后使用释放。
如果您需要进一步的帮助,请在https://issuetracker.google.com/issues/140747218发表评论。

我的 gradle.properties:

org.gradle.jvmargs=-Xmx**JVM_HEAP_SIZE**M
org.gradle.parallel=true
android.enableJetifier=true
android.useAndroidX=true
android.enableR8=**MINIFY_WITH_R_EIGHT**
unityStreamingAssets=.unity3d**STREAMING_ASSETS**
**ADDITIONAL_PROPERTIES**

我想知道是否有办法让我知道一个特定的支持库是否已经支持 AndroidX?(所以它不需要被 jetified)
此外,首先要说的是:为什么有些图书馆不需要jetified?当支持库支持 AndroidX 并且不需要被 jetified 时,这是什么意思? jetify 不是自动用相应的 AndroidX 等效库替换支持库的行为吗?一个支持图书馆怎么能从被喷气化中获得免费通行证呢?这对我来说根本没有意义..

【问题讨论】:

  • 嗨@forstack overflowizi,我遇到了这个问题!你有没有找到解决办法?
  • @HollyC 抱歉,我不记得我是如何解决的。这是我以后回答自己问题的一个教训。

标签: android unity3d android-support-library androidx


【解决方案1】:

很确定它描述了您不需要使用 jetify 的罕见可能性,例如,如果它是在一个不使用它的类中完成的,或者在一个从未使用过的类中完成的。除非库设计者非常草率,否则这种情况不太可能发生。但是,如果它仅在您的应用程序永远不会接触的类中使用支持库,也可能没问题。如果在这种情况下将其列入黑名单,则不确定它是否能够编译。

很可能你运气不好,直到你可以让库作者修复它,或者你可以分叉他们的库并在你自己的副本中修复它(如果它是开源的)。 Jetpack 已经存在好几年了。任何仍在使用旧支持库的库很可能已被废弃多年,因此这也是需要考虑的问题。

【讨论】:

  • 手动导入 .aar 文件(从网上下载并拖入项目)和在 gradle 文件中写入“implementation <LibraryName>:<LibraryVersionNumber>”行有区别吗?
  • 因为写一个“实现......”行并没有给出我在问题中提到的错误
  • 抱歉,我不知道 jetifier 在引擎盖下是如何工作的,所以我不知道它会如何区别对待这些。但无论是否使用 Jetpack,如果 AAR 文件可通过某些公共 Maven 存储库获得,我绝不会手动将它们放入项目中,原因很简单,因为像那样手动管理依赖项要困难得多。在你的 Gradle 文件中使用 implementation 允许你通过输入新的版本号来保持你的库是最新的。对于某些 repos,IDE 甚至会在库过期时警告您并告诉您最新的版本号。
  • 是的,我同意,但正如我提到的 - 在我导入包含大量 AAR 文件的 Mapbox SDK 后开始出现错误。我只开发了大约一年,我不知道处理的常用方法是什么这。我尝试删除 AAR 文件并使用 gradle 导入它们,但这导致构建失败
【解决方案2】:

在这里添加我的答案以防它对任何人有帮助。

Jetifier 对我不起作用。在它说它已经迁移到 AndroidX 之后,我收到了一条关于重复文件的错误消息。 但是,我想我设法让它工作了……至少现在是这样。

在 Unity 中,我在构建 APK 之前使用了 Assets > External Dependency Manager > Android Resolver > Delete Resolved Libraries。 然而,在 Android Studio 中,我将错误代码复制到一个文档中,这样我就可以看到整个内容,并发现重复的引用都在一个文件中。我无法删除文件本身,而是转到 build.gradle 文件并删除了引用冲突脚本的行。

作为参考,我将我的项目从 2020.1.1 更新到 2021.3.17,它自动迁移到 Android X,只留下一个冲突文件。该文件是 Firebase Analytics 统一包的一部分。

【讨论】:

    猜你喜欢
    • 2020-04-23
    • 2017-11-07
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 2020-07-03
    • 2019-07-11
    • 2015-08-15
    相关资源
    最近更新 更多