You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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-maps 0.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

火山引擎 最新活动