我们知道,RN项目低于0.60
是没法使用androidx
的。
我的RN 项目今天在Android端打包(build release)时,突然报了这个错:
Manifest merger failed : Attribute application@appComponentFactory value=(androidx.core.app.CoreComponentFactory) from [androidx.core: core:1.0.0-beta01] AndroidManifest.xml:22:18-86
is also present at [com.android.support:support-compat:28.0.0-alpha3] AndroidManifest.xml:22:18-91 value=(android.support.v4.app.CoreComponentFactory).
Suggestion: add 'tools:replace="android:appComponentFactory"' to <application> element at AndroidManifest.xml:11:5-49:19 to override.
各种Google了一番,得出结论是因为 第三方库混用Androidx 和 support库导致冲突的问题,至于 Androidx
是什么,可以查一下,网上的资料很多。我的项目依赖的某个第三方库使用了 androidx
, 而项目使用的是 support
库,导致出现这个问题。 这两个库是互斥的,只能选择其中的一个,不能混用。。
按照上面报错的提示,在项目的AndroidManifest.xml
的 <Application>
标签下加入 tools:replace="android:appComponentFactory"
, 然后导入 tools
命名空间,重新运行,又报了新的错误。
网上给的解决方案是 migrate to androidx
, 让你迁移到 Androidx
. 但是这个方案其实是原生android的解决方案,而对于React Native
来说,这个方案是行不通的,具体原因官方在github 上有讨论和说明。
而官方给出的解决方案需要你对Android原生很精通,还需要时间成本。这样一来,最方便的解决方案就是,把使用了androidx
的第三方库的版本降级,换成还未迁移到androidx
的那个版本。
在android/
目录下运行
./gradlew :app:dependencies
然后搜索 androidx
:
可把你逮到了~ 原来是
:react-native-device-info
的一个依赖 :com.google.android.gms:play-services-gcm:+ -> 17.0.0 使用了androidx
赶紧搜一下,这个 play-services-gcm
一天前刚升级到 17.0.0
, 新版本正是使用了 androidx
!! 然后看一下 :react-native-device-info
的 build.gradle
:
就是这里了!!版本号用了 '+',然后就自动升级到
17.0.0
了...于是, 把这个版本号写死,并且去掉 +
, 终于运行成功了。
或者使用 jetifier
不过,jetifier并不是万能的,例如:
https://github.com/mikehardy/jetifier#troubleshooting
其他原因
https://juejin.im/post/596415805188250da35f0bf4
其他原因2
在 Android Studio
全局搜索 useAndroidX
和 enableJetifier
,如果主项目或其他第三方module中有这两个字段,确保他们的值是 false
我安装了react-native-viewpager
,这个第三方库这两个字段是true
网友评论