React Native应用Android 13生产环境崩溃,Android 11正常求解决
问题描述
我开发了一个React Native应用,用Expo App测试时运行正常,但打包生产版本后,在我的Android 13设备上仅能成功打开一次,后续多次尝试打开时频繁崩溃;发给使用Android 11的朋友后,应用运行完全正常。我推测问题出在某个依赖包上。
已经参考Stack Overflow相关帖子,尝试更换部分依赖包并在app.json中添加配置,但问题仍未解决。
app.json 配置
{ "expo": { "name": "Finder", "slug": "finder", "version": "2.3.1", "orientation": "portrait", "icon": "./assets/icon.png", "userInterfaceStyle": "light", "splash": { "image": "./assets/splash.png", "resizeMode": "contain", "backgroundColor": "#ffffff" }, "updates": { "fallbackToCacheTimeout": 0 }, "assetBundlePatterns": [ "**/*" ], "ios": { "supportsTablet": true, "bundleIdentifier": "apple.spoonfinder.ml" }, "android": { "adaptiveIcon": { "foregroundImage": "./assets/adaptive-icon.png", "backgroundColor": "#FFFFFF" }, "package": "com.im_the_tea_drinker.spoon_finder" }, "web": { "favicon": "./assets/icon.png" }, "extra": { "eas": { "projectId": "2f14cfae-f990-4aab-9d8e-ca06ea8bec1d" } } } }
当前依赖包
{ "name": "finder", "version": "1.0.0", "main": "node_modules/expo/AppEntry.js", "scripts": { "start": "expo start", "android": "expo start --android", "ios": "expo start --ios", "web": "expo start --web" }, "dependencies": { "expo": "~47.0.8", "expo-cli": "^6.0.8", "expo-location": "~15.0.1", "expo-permissions": "~14.0.0", "expo-sensors": "~12.0.1", "expo-status-bar": "~1.4.2", "geolib": "^3.3.3", "react": "18.1.0", "react-dom": "18.1.0", "react-native": "0.70.5" }, "devDependencies": { "@babel/core": "^7.19.3" }, "private": true }
排查与解决方向
针对Android 13独有的崩溃问题,结合你的配置给出以下具体方案:
1. 修复权限适配问题
Android 13对位置权限做了严格划分,expo-permissions已被废弃,旧版本在Android 13下易触发权限冲突:
- 移除
expo-permissions依赖,直接使用expo-location自带的权限请求方法,比如requestForegroundPermissionsAsync、requestBackgroundPermissionsAsync。 - 在app.json的android字段中补充Android 13所需权限声明:
"android": { // ...原有配置 "permissions": [ "ACCESS_COARSE_LOCATION", "ACCESS_FINE_LOCATION", "POST_NOTIFICATIONS" // 若使用后台定位,必须添加该权限 ] }
2. 升级Expo版本提升兼容性
Expo 47对Android 13的支持存在部分缺陷,建议升级到Expo 48或更高版本:
- 执行命令
expo upgrade 48,按提示同步更新所有关联依赖。 - 升级完成后重新构建生产版本包。
3. 检查传感器监听的资源泄漏
Android 13对后台资源限制更严格,expo-sensors若未正确取消监听会导致内存泄漏:
- 确保组件卸载时停止所有传感器监听,示例代码:
import { Accelerometer } from 'expo-sensors'; useEffect(() => { const subscription = Accelerometer.addListener(accelerometerData => { // 处理传感器数据 }); return () => { subscription.remove(); // 组件卸载时移除监听 }; }, []);
4. 通过崩溃日志精准定位
以上为推测方案,最准确的方式是获取设备崩溃日志:
- 连接Android设备到电脑,执行命令
adb logcat *:E,触发应用崩溃后查看输出的错误栈信息,直接定位问题根源。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

