升级compileSdkVersion至31后React Native Release构建失败
React Native 0.66.5 升级 compileSdkVersion 至31后Release构建失败
问题概述
将React Native 0.66.5项目的compileSdkVersion和targetSdkVersion升级到31后,执行./gradlew assembleRelease时抛出错误:
Execution failed for task ':app:bundleReleaseJsAndAssets'
Process 'command 'node'' finished with non-zero exit value 1
但yarn android可以正常构建Debug包并运行。
核心错误原因
从报错日志可定位,问题根源是Node.js版本与旧版Metro的加密哈希算法不兼容:
- Metro在创建Transformer时触发
ERR_OSSL_EVP_UNSUPPORTED错误,这是因为Node.js 17+版本默认启用了更严格的OpenSSL算法,而RN0.66配套的Metro版本不支持该算法。 - 后续的
Cannot read properties of undefined (reading 'transformFile')是该错误导致的连锁反应。
解决方案
方法1:临时注入兼容环境变量执行构建
在终端执行构建命令前,添加指定加密算法的环境变量:
# macOS/Linux export NODE_OPTIONS=--openssl-legacy-provider && ./gradlew assembleRelease
# Windows set NODE_OPTIONS=--openssl-legacy-provider && gradlew assembleRelease
方法2:配置package.json脚本简化构建
在项目根目录的package.json中添加Release构建脚本,自动携带环境变量:
"scripts": { // 保留原有脚本,新增以下内容 "android:release": "NODE_OPTIONS=--openssl-legacy-provider ./gradlew assembleRelease" }
之后只需执行yarn android:release或npm run android:release即可完成Release构建。
方法3:降级Node.js到兼容版本
RN0.66官方推荐Node.js版本范围为12.x-16.x,使用版本管理工具(如nvm)切换到16.x LTS版本:
# 安装并切换到Node.js 16 nvm install 16 nvm use 16
切换后直接执行./gradlew assembleRelease即可正常构建。
方法4:升级Metro依赖(需谨慎验证)
如果希望保留高版本Node.js,可以尝试升级Metro到兼容版本(注意RN0.66的兼容性):
- 修改
package.json中的Metro相关依赖版本:
"metro": "^0.67.0", "metro-core": "^0.67.0", "metro-react-native-babel-transformer": "^0.67.0"
- 执行
yarn install或npm install更新依赖,之后重新尝试构建。此方法可能引发其他兼容性问题,需全面测试。
内容的提问来源于stack exchange,提问作者Ravis Farooq
相关产品推荐
相关产品推荐

