React Native Android编译失败求助:多第三方库依赖冲突
问题根源拆解
兄弟,你这情况典型得很——就是AndroidX和旧Android Support Library的兼容性冲突闹的。之前能正常跑,突然炸了,大概率是这俩原因:
- 你执行
./gradlew assembleRelease -x bundleReleaseJsAndAssets的时候,Gradle偷偷同步并更新了依赖(比如Gradle插件、Android SDK Build Tools版本),原本用旧Support库的项目,突然被迫引入AndroidX相关资源,直接触发了fontVariationSettings、ttcIndex这些AndroidX专属属性找不到的错误。 - 本地的Android SDK Build Tools或者Platform Tools被自动升级了,新工具默认往AndroidX上靠,直接把原来的Support库依赖环境搞崩了。
你加了android.useAndroidX=true和android.enableJetifier=true后,Jetifier本来该自动把旧Support库的依赖转成AndroidX,但架不住有些第三方RN库的原生代码硬写了旧Support库的包名(比如android.support.annotation、android.support.v4.net),Jetifier搞不定这些硬编码的引用,就导致一个个库编译失败。
分步解决办法
1. 先让Jetifier好好干活(优先选这个,不用删库)
Jetifier没生效大概率是配置不全或者缓存搞鬼,按这个步骤来:
- 先把
gradle.properties的配置补全,强制Jetifier处理所有依赖:android.useAndroidX=true android.enableJetifier=true android.jetifier.ignorelist= # 清空忽略列表,不让任何依赖逃过转换 - 彻底清掉各种缓存,避免残留的旧配置搞事:
# 清Gradle构建缓存 ./gradlew cleanBuildCache # 清项目构建文件 ./gradlew clean # 删node_modules重装依赖 rm -rf node_modules && npm install # 清RN的缓存 npx react-native start --reset-cache - 检查
android/build.gradle里的Gradle插件版本,必须是3.2.0及以上(AndroidX的最低要求),比如改成:buildscript { dependencies { classpath 'com.android.tools.build:gradle:4.2.2' # 选个稳定的高版本就行 } }
2. 手动改第三方库的原生代码(Jetifier搞不定的时候用)
要是有些库硬编码的引用Jetifier转不动,那就手动改:
- 找到报错的库的Android文件夹(比如
node_modules/@JWWon/react-native-universal-pedometer/android) - 把所有
import android.support.annotation.*改成import androidx.annotation.*,import android.support.v4.net.*改成import androidx.core.net.* - 改完后用
patch-package保存修改,不然下次npm install又变回原样:# 装patch-package npm install patch-package --save-dev # 生成补丁 npx patch-package @JWWon/react-native-universal-pedometer
3. 锁死依赖版本(防止以后再炸)
为了避免依赖自动更新搞事情,把package.json里所有RN第三方库的版本锁死,去掉^或~符号,比如:
{ "dependencies": { "@react-native-community/netinfo": "5.9.7", "react-native-camera-kit": "1.13.10", // 其他库都这么改,固定住版本 } }
4. 紧急回退(实在不行就回到之前的状态)
要是上面的方法都不管用,直接用Git回退到两天前能正常构建的提交:
git log --oneline # 找到能正常跑的那个提交的哈希值 git reset --hard <提交哈希>
回退后执行./gradlew clean和npm install,应该就能回到之前的状态了。
以后怎么避免?
- 别随便升级Android SDK Build Tools或者Gradle插件,升级前先查下所有第三方RN库是不是支持AndroidX。
- 执行
./gradlew命令的时候,尽量加个--no-build-cache,避免缓存搞出奇怪的问题。 - 定期看看第三方库的更新,优先选已经迁移到AndroidX的版本。
内容的提问来源于stack exchange,提问作者irondsd
相关产品推荐
相关产品推荐

