EAS构建后Expo React Native真机启动崩溃求助
问题说明
EAS构建完成的Expo React Native应用,在物理设备启动时直接崩溃。构建日志仅输出以下警告,无崩溃相关错误信息:
[stderr]
Note: Some input files use or override a deprecated API.
[stderr]
Note: Recompile with -Xlint:deprecation for details.
[stderr]
Note: Some input files use unchecked or unsafe operations.
[stderr]
Note: Recompile with -Xlint:unchecked for details.
已执行的排查操作:
- 重新安装所有依赖
- 清理npm及Expo缓存
- 代码静态分析检查
配置文件详情
app.json
{ "expo": { "name": "social", "slug": "social", "version": "1.0.0", "orientation": "portrait", "icon": "./assets/logo.png", "userInterfaceStyle": "light", "splash": { "image": "./assets/logo.png", "resizeMode": "contain", "backgroundColor": "#ffffff" }, "assetBundlePatterns": [ "**/*" ], "ios": { "supportsTablet": true }, "android": { "adaptiveIcon": { "foregroundImage": "./assets/logo.png", "backgroundColor": "#ffffff" }, "package": "com.gauravgajjar.social" }, "web": { "favicon": "./assets/logo.png" }, "extra": { "eas": { "projectId": "3eaec0b8-7c13-43eb-bb50-ff0ab227497a" } }, "runtimeVersion": { "policy": "appVersion" }, "updates": { "url": "https://u.expo.dev/3eaec0b8-7c13-43eb-bb50-ff0ab227497a" } } }
package.json
{ "name": "social", "version": "1.0.0", "main": "node_modules/expo/AppEntry.js", "scripts": { "start": "expo start", "android": "expo run:android", "ios": "expo run:ios", "web": "expo start --web" }, "dependencies": { "@react-navigation/native": "^6.1.7", "@react-navigation/native-stack": "^6.9.13", "@react-navigation/stack": "^6.3.17", "expo": "^49.0.11", "expo-av": "~13.4.1", "expo-image-picker": "~14.3.2", "expo-secure-store": "~12.3.1", "expo-splash-screen": "~0.20.5", "expo-system-ui": "~2.4.0", "expo-updates": "~0.18.13", "formik": "^2.4.3", "react": "18.2.0", "react-dom": "18.2.0", "react-native": "^0.72.4", "react-native-gesture-handler": "~2.12.0", "react-native-modal": "^13.0.1", "react-native-virtualized-view": "^1.0.0", "yup": "^1.2.0" }, "devDependencies": { "@babel/core": "^7.20.0" }, "private": true }
eas.json
{ "cli": { "version": ">= 5.2.0" }, "build": { "preview": { "android": { "buildType": "apk" }, "channel": "main" }, "preview2": { "android": { "gradleCommand": ":app:assembleRelease" }, "channel": "main" }, "preview3": { "developmentClient": true }, "production": {} }, "submit": { "production": {} } }
进一步排查方案
1. 获取设备崩溃日志
构建日志的警告不直接触发崩溃,必须获取设备端的崩溃日志才能定位根因:
- Android:设备连接电脑后执行
adb logcat *:E,启动应用后捕获错误输出; - iOS:通过Xcode打开「Window > Devices and Simulators」,选择对应设备后查看「View Device Logs」中的崩溃报告。
2. 补充权限配置
当前app.json缺少expo-image-picker、expo-av等依赖所需的权限声明,可能导致启动崩溃。在expo节点下添加权限配置:
"ios": { "supportsTablet": true, "infoPlist": { "NSCameraUsageDescription": "需要访问相机拍摄内容", "NSPhotoLibraryUsageDescription": "需要访问相册选择内容", "NSMicrophoneUsageDescription": "需要访问麦克风录制音频" } }, "android": { "adaptiveIcon": { "foregroundImage": "./assets/logo.png", "backgroundColor": "#ffffff" }, "package": "com.gauravgajjar.social", "permissions": [ "CAMERA", "READ_MEDIA_IMAGES", "RECORD_AUDIO" ] }
3. 测试开发客户端构建
执行eas build --profile preview3构建开发客户端,安装到设备后启动,开发客户端会显示详细的错误堆栈,帮助定位代码或依赖问题。
4. 验证更新配置
当前runtimeVersion使用appVersion策略,需确保构建版本与app.json中的version完全一致,且updates.url正确。可临时移除updates节点,重新构建测试是否仍崩溃。
5. 排查依赖兼容性
react-native-virtualized-view@1.0.0与Expo 49的兼容性存疑,尝试移除该依赖后重新构建;- 确认所有依赖版本与Expo 49官方兼容列表匹配。
6. 清理原生缓存
若之前执行过expo run:android/ios生成过原生项目,EAS构建可能复用旧配置。执行expo prebuild --clean清理原生文件后,重新发起EAS构建。
内容的提问来源于stack exchange,提问作者Gaurav

