为什么Android Studio强制使用Androidx替代Android Support库?

17

正在开发一个 React Native 项目,但突然间它停止工作并出现了一个错误:

Manifest merger failed : Attribute application@appComponentFactory value=(android.support.v4.app.CoreComponentFactory) from [com.android.support:support-compat:28.0.0] AndroidManifest.xml:22:18-91
is also present at [androidx.core:core:1.0.0] AndroidManifest.xml:22:18-86 value=(androidx.core.app.CoreComponentFactory).
Suggestion: add ‘tools:replace=“android:appComponentFactory”’ to <application> element at AndroidManifest.xml:7:5-117 to override.

我知道在28版本后,Google已经完成了Support Library类的迁移,我也知道如何将整个项目从Support Library类迁移到AndroidX类。

我的问题是:

  • 有没有可能继续使用Support Library类而不转向AndroidX类?

  • 如何解决这个问题?


1
遇到了同样的问题,谷歌的迁移指南也没有对我起作用。你能想办法解决编译错误吗? - Christoph Göttert
你是如何发现哪个第三方库正在使用Androidx的呢? 目前我也处于同样的境地。 - ThatsRight
你可以使用cd android && ./gradlew app:dependencies来检查哪个库依赖于androidx。在一个与这些错误相关的git-issue中发现了这个信息。 - Christoph Göttert
2
@ChristophGöttert 我和你一样有同样的问题,但是有一个更简单的方法来限制play-services-gcm的版本,在build.gradle中添加googlePlayServicesVersion =“16.1.0”或者您正在使用的任何版本即可。不需要fork libs! - ThatsRight
1
我曾经遇到过同样的问题,并使用以下方法解决了它:https://dev59.com/CLTma4cB1Zd3GeqP8ZHF#56648987 - Udai
显示剩余2条评论
5个回答

5
你可以锁定你的 Google Services 和 Firebase 版本,以避免使用 AndroidX。
在 android/build.gradle 中添加以下内容:
buildscript {
  ...
  ext {
    // Lock down googlePlayServicesVersion
    googlePlayServicesVersion = "16.1.0"
    firebaseVersion = "17.6.0"
  }
}

或在gradle.properties中添加:

googlePlayServicesVersion=16.1.0
firebaseVersion=17.6.0

我应该把这个添加到哪里?在依赖项里面吗? - chenop
1
在 buildscript 内部 @chenop - A-J-A
1
这假设 OP 正在使用这两个库中的一个或两个 - 许多项目并没有。根据其他答案更新 gradle.properties 文件似乎在这些情况下有效。 - Chris Noldus

4

可能需要在此处发布您的应用程序级别的Gradle文件。如果您正在使用其他已更新/最新的依赖项,则可能会遇到此错误。

如果任何依赖项是最新/更新的,请通过检查其 GitHub 上的更改日志将其降级为较低版本。对我来说,罪魁祸首是内部使用androidx的stripe版本,并出现了这个错误。我将其降级,瞬间问题解决 :)

还可以使用 gradle.properties 文件禁用androidx。

android.useAndroidX=false
android.enableJetifier=false

这会导致androidx被禁用。


是的,我同意这是个问题,因为我有很多模块(依赖项)与我的根项目链接在node_modules文件夹中。不知道该怎么办! :/ - Mohsin
请检查您的应用程序级 build.gradle 文件。 - pramod_m
根据文档,useAndroidX和enableJetifier默认值为false,因此这不是一个问题。 - Mohsin
在我的情况下,我尝试使用 ./gradlew :[module]:dependencies | grep "[androidx libs]" 命令来查找当前第三方库中哪些具有传递/依赖于 androidx 库,然后强制其使用 android-support 版本或将其排除。 - mochadwi
1
经过很多挫折,这个解决方案为我解决了问题 - 感谢 @pramod_m - Chris Noldus

2
有没有可能继续使用Support Library类,而不是转向AndroidX类?
是的,这是可能的,但你只能将这个事件推迟,无法避免它。
新的Firebase库和新的Google Play库需要使用androidx(请查看下面的列表)。
在短时间内,其他第三方库也会使用这些依赖项。
如何解决这个问题?
你只能使用最后版本的Firebase/Google Play Services/第三方库,这些版本可以与支持库v.28或以下版本一起工作。
下面是开始使用androidx依赖项的Firebase和Google Play Services库列表。
Ads version 18.0.0
Analytics version 17.0.0
App Indexing version 19.0.0
Authentication version 18.0.0
Cloud Firestore version 20.0.0
Cloud Firestore-ktx version 20.0.0
Cloud Functions (client) version 18.0.0
Cloud Messaging version 19.0.0
Cloud Storage version 18.0.0
Dynamic Links version 18.0.0
In-App Messaging version 18.0.0
In-App Messaging Display version 18.0.0
Instance IDs version 19.0.0
ML Kit Common version 20.0.0
ML Kit Vision version 21.0.0
ML Kit Image Labeling Model version 18.0.0
ML Kit Face Detection Model version 18.0.0
ML Kit Object Detection and Tracking Model version 17.0.0
ML Kit Vision AutoML version 17.0.0
ML Kit Natural Language version 20.0.0
ML Kit Language Identification Model version 20.0.0
ML Kit Smart Reply Model version 20.0.0
ML Kit Translate Model version 20.0.0
ML Kit Model Interpreter version 20.0.0
Realtime Database version 18.0.0
Performance Monitoring version 18.0.0
Remote Config version 18.0.0
A/B Testing version 18.0.0

Play服务库:

com.google.android.datatransport:transport-api:2.0.0
com.google.android.datatransport:transport-backend-cct:2.0.0
com.google.android.datatransport:transport-runtime:2.0.0
com.google.android.gms:play-services-ads:18.0.0
com.google.android.gms:play-services-ads-identifier:17.0.0
com.google.android.gms:play-services-ads-lite:18.0.0
com.google.android.gms:play-services-afs-native:17.0.0
com.google.android.gms:play-services-analytics:17.0.0
com.google.android.gms:play-services-analytics-impl:17.0.0
com.google.android.gms:play-services-appinvite:18.0.0
com.google.android.gms:play-services-audience:17.0.0
com.google.android.gms:play-services-auth:17.0.0
com.google.android.gms:play-services-auth-api-phone:17.0.0
com.google.android.gms:play-services-awareness:17.0.0
com.google.android.gms:play-services-base:17.0.0
com.google.android.gms:play-services-basement:17.0.0
com.google.android.gms:play-services-cast:17.0.0
com.google.android.gms:play-services-cast-framework:17.0.0
com.google.android.gms:play-services-clearcut:17.0.0
com.google.android.gms:play-services-cronet:17.0.0
com.google.android.gms:play-services-drive:17.0.0
com.google.android.gms:play-services-fido:18.0.0
com.google.android.gms:play-services-fitness:17.0.0
com.google.android.gms:play-services-flags:17.0.0
com.google.android.gms:play-services-games:18.0.0
com.google.android.gms:play-services-gass:18.0.0
com.google.android.gms:play-services-gcm:17.0.0
com.google.android.gms:play-services-identity:17.0.0
com.google.android.gms:play-services-iid:17.0.0
com.google.android.gms:play-services-instantapps:17.0.0
com.google.android.gms:play-services-location:17.0.0
com.google.android.gms:play-services-maps:17.0.0
com.google.android.gms:play-services-measurement:17.0.0
com.google.android.gms:play-services-measurement-api:17.0.0
com.google.android.gms:play-services-measurement-impl:17.0.0
com.google.android.gms:play-services-measurement-sdk:17.0.0
com.google.android.gms:play-services-measurement-sdk-api:17.0.0
com.google.android.gms:play-services-nearby:17.0.0
com.google.android.gms:play-services-oss-licenses:17.0.0
com.google.android.gms:play-services-panorama:17.0.0
com.google.android.gms:play-services-phenotype:17.0.0
com.google.android.gms:play-services-places:17.0.0
com.google.android.gms:play-services-places-placereport:17.0.0
com.google.android.gms:play-services-plus:17.0.0
com.google.android.gms:play-services-safetynet:17.0.0
com.google.android.gms:play-services-stats:17.0.0
com.google.android.gms:play-services-tagmanager:17.0.0
com.google.android.gms:play-services-tagmanager-api:17.0.0
com.google.android.gms:play-services-tagmanager-v4-impl:17.0.0
com.google.android.gms:play-services-tasks:17.0.0
com.google.android.gms:play-services-vision:18.0.0
com.google.android.gms:play-services-vision-common:18.0.0
com.google.android.gms:play-services-vision-image-label:18.0.0
com.google.android.gms:play-services-wallet:17.0.0
com.google.android.gms:play-services-wearable:17.0.0

旧的Android设备怎么样?比如v4.x。 - Yousha Aleayoub
Androidx迁移与所需的最小SDK更改无关。显然,库会不断改进,最小SDK迟早会增加。无论如何,4.x是一个相当大的范围,我们正在谈论2012-2013(6年前!),并且当前分布<10% - Gabriele Mariotti
此答案中提到的带版本的服务已经与androidX兼容。如果需要使用pre-androidX,请尝试16.0.0。在我的情况下有效。 - Dmitriy Pavlukhin
@DmitriyPavlukhin,我在答案中写道:“新的Firebase库和新的Google Play库需要androidx(请检查下面的列表)”。所有报告的版本都与androidx兼容。无论如何,感谢您的反馈,我会尝试更好地强调这一点。 - Gabriele Mariotti

2
您提到您正在使用react-native。正如其他地方所述,虽然您可以推迟它,但您无法永远避免使用AndroidX。
在react-native中,由于gradle仅在通过Android Studio进行原始重构期间才会将源文件jetify,因此转换十分困难,并且react-native将其本机代码作为源文件交付。
现在,您可以简单地使用'jetifier'工具,安装并运行它后,在package.json的postinstall中添加npx jetify,以实现对节点模块的持续jetification。
然后,您应该能够成功将应用程序转换为AndroidX,开始依赖新的AndroidX库版本,但仍然使用未转换的库。这将为react-native 0.60 which will be AndroidX做好更好的准备。
如果您必须推迟AndroidX并使用react-native,则至少可以在react-native 0.59中使用反向jetifier工具,将node_modules中的源引用从androidx修改为compat引用。

请注意,jetifier已作为“react-native start”的默认步骤纳入,因此如果这是您的工作流程的正常部分,则现在实际上默认情况下获取此行为,并且您应该能够几乎毫不畏惧地升级到AndroidX依赖项。干杯 - Mike Hardy

2

根据Dan Lew的说法:

支持库组件已被弃用,所有未来的开发都将进入AndroidX,因此无法避免进行此迁移。但愿这些提示能为您提供更清晰的过渡路径。

"Original Answer"翻译成"最初的回答"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接