Expo开发的React Native应用仅在真实Android设备崩溃的问题排查与解决
解决Expo构建APK后Android真机崩溃的
java.lang.IllegalArgumentException问题 我最近刚碰到几乎一模一样的状况——用Expo开发的React Native应用在Expo Go和模拟器里跑得毫无问题,连代码警告都没有,但打包成APK装到Android真机上就各种崩溃,有时候启动时崩,有时候打开特定页面时崩。
问题核心定位
通过Android Studio的Logcat分析,我抓到了触发崩溃的致命错误:
java.lang.IllegalArgumentException: Unexpected type in an array: class org.json.JSONObject
日志里还附带了几个次要错误,比如OkHttp缓存目录不可读、MalformedURLException(空协议)、TaskDescription主色不透明,但这些都不是导致崩溃的核心原因。
排查与解决过程
一开始我排查了代码里的JSON处理逻辑、第三方库的配置,后来高度怀疑是react-native-maps库的问题——毕竟崩溃都集中在包含MapView的页面。最后我尝试移除了页面中的MapView组件(包括内部的Marker),重新打包APK后,所有Android真机上的崩溃都消失了。我之前用的MapView代码是这样的:
<MapView initialRegion={{ latitude: Number(lat), longitude: Number(lng), latitudeDelta: 0.005, longitudeDelta: 0.005, }} > <Marker coordinate={{ latitude: Number(lat), longitude: Number(lng), }} title={name} /> </MapView>
可能的原因分析
结合我的项目依赖(和你类似,用的Expo 41 + react-native-maps 0.27.1),推测问题出在以下几点:
- 版本兼容问题:Expo 41对应的官方推荐地图库版本可能和你用的社区版
react-native-maps0.27.1不匹配,导致打包时底层出现JSON序列化错误 - 配置缺失:可能没有在
app.json中正确配置地图相关的权限或API密钥,Expo Go环境下会自动兼容,但打包成APK后触发了错误 - 参数序列化问题:MapView传递的region或coordinate参数在原生层转换时,出现了JSON类型不匹配的情况
如果还想继续使用地图功能,可以试试这些优化方案:
- 替换为Expo官方的
expo-maps(Expo 41对应的版本是~10.1.0),而非社区版react-native-maps,官方库会更好地适配Expo打包流程 - 检查
app.json中是否添加了必要的权限:"permissions": ["ACCESS_COARSE_LOCATION", "ACCESS_FINE_LOCATION"] - 确保传递给MapView的参数都是合法的Number类型(比如你代码里用了
Number(lat),这个是对的,但可以再确认lat/lng是否为空或NaN)
我的项目依赖参考
"dependencies": { "@expo-google-fonts/inter": "^0.1.0", "@react-native-async-storage/async-storage": "^1.13.0", "@react-native-community/masked-view": "0.1.10", "@react-native-community/slider": "3.0.3", "@react-navigation/bottom-tabs": "^5.11.9", "@react-navigation/native": "^5.9.4", "@react-navigation/stack": "^5.14.4", "@reduxjs/toolkit": "^1.5.1", "axios": "^0.21.1", "expo": "^41.0.0", "expo-font": "~9.1.0", "expo-localization": "~10.1.0", "expo-splash-screen": "~0.10.2", "expo-status-bar": "~1.0.4", "expo-updates": "~0.5.4", "i18n-js": "^3.8.0", "moment": "^2.29.1", "native-base": "^2.15.2", "react": "16.13.1", "react-dom": "16.13.1", "react-native": "0.63.4", "react-native-calendars": "^1.1258.0", "react-native-check-box": "^2.1.7", "react-native-gesture-handler": "~1.10.2", "react-native-i18n": "^2.0.15", "react-native-maps": "0.27.1", "react-native-material-dropdown": "^0.11.1", "react-native-reanimated": "~2.1.0", "react-native-safe-area-context": "3.2.0", "react-native-screens": "~3.0.0", "react-native-snap-carousel": "^3.9.1", "react-native-svg": "12.1.0", "react-native-svg-transformer": "^0.14.3", "react-native-unimodules": "~0.13.3", "react-native-web": "~0.13.12", "react-navigation": "^4.4.4", "react-navigation-stack": "^2.10.4", "react-redux": "^7.2.3", "redux": "^4.0.5", "redux-thunk": "^2.3.0" }, "devDependencies": { "@babel/core": "~7.9.0", "@expo/webpack-config": "~0.12.63", "@svgr/webpack": "^5.5.0", "babel-jest": "~25.2.6", "jest": "~25.2.6", "react-test-renderer": "~16.13.1" }
内容的提问来源于stack exchange,提问作者user15785090




