Expo 53 - 安卓模拟器中expo-maps导致应用崩溃求助
我完全懂你现在的头疼——Expo 53搭配expo-maps在iOS上好好的,一到安卓打开带地图的模态框就直接崩,翻遍文档也找不到原因,确实让人抓狂。结合你贴出来的package.json和app.json配置,我整理了几个大概率能解决问题的排查方向,你可以挨个试试:
1. 先确认Google Maps API密钥是否配置到位
安卓上使用expo-maps必须配置Google Maps API密钥,iOS可能会自动处理相关权限,但安卓这边没密钥的话直接就会崩溃!看你现在的app.json里的expo-maps插件配置,好像没加安卓的API密钥,这很可能是罪魁祸首。
你需要在app.json的expo-maps插件配置里补充安卓API密钥:
["expo-maps", { "requestLocationPermission": true, "locationPermission": "Allow $(PRODUCT_NAME) to use your location for finding nearby dessert shops", "android": { "apiKey": "你的Google Maps API密钥" // 替换成你自己的密钥 } }]
配置完后,记得重新运行expo run:android让配置生效。
2. 检查依赖版本的兼容性
虽然你用的expo-maps ~0.11.0和Expo 53是匹配的,但可以试试更新到SDK 53支持的最新补丁版本,避免版本里的已知bug:
npx expo install expo-maps@latest
同时确认你的react-native-reanimated版本(~3.17.4)和Expo 53的要求一致,这个版本是对的,但也要确保babel.config.js里已经添加了reanimated的插件,否则可能和地图或bottom sheet产生冲突:
// babel.config.js module.exports = function(api) { api.cache(true); return { presets: ['babel-preset-expo'], plugins: ['react-native-reanimated/plugin'], // 必须加这个 }; };
3. 排查模态框与地图的渲染冲突
你用了@gorhom/bottom-sheet作为模态框,这类交互式组件有时候会和地图的渲染时机冲突。可以先做个测试:把地图放到普通页面里渲染,不要放在模态框里,看会不会崩溃。如果普通页面没问题,那就是模态框和地图的交互问题:
试试延迟渲染地图,等模态框完全打开后再加载地图组件:
import { useState } from 'react'; import MapView from 'expo-maps'; import BottomSheet from '@gorhom/bottom-sheet'; export default function MapModal() { const [isMapReady, setIsMapReady] = useState(false); const handleSheetOpen = () => { // 延迟500ms渲染地图,给模态框足够的初始化时间 setTimeout(() => setIsMapReady(true), 500); }; return ( <BottomSheet onOpen={handleSheetOpen}> {isMapReady ? ( <MapView style={{ flex: 1 }} initialRegion={{ latitude: 37.78825, longitude: -122.4324, latitudeDelta: 0.0922, longitudeDelta: 0.0421, }} /> ) : null} </BottomSheet> ); }
4. 检查安卓模拟器的环境
安卓模拟器的Google Play服务版本过低也会导致地图崩溃:
- 打开模拟器里的Google Play应用,检查是否有可用更新,把Google Play服务更到最新
- 试试换一个带Google Play的模拟器镜像(比如选择“Google Play”结尾的系统镜像),或者换Android 13/14的模拟器测试
- 条件允许的话,直接在真实安卓设备上测试,排除模拟器本身的问题
5. 获取崩溃日志精准定位
如果以上方法都不行,一定要去拿崩溃日志,这是找到问题根源的关键:
- 用debug模式启动安卓应用:
expo run:android --variant debug - 触发崩溃后,打开新的终端执行:
adb logcat *:E - 从日志里找到和expo-maps、Google Maps相关的错误信息,比如权限缺失、API密钥错误、native层的异常等
如果还是解决不了,把崩溃日志贴出来,大家能更精准地帮你定位问题~
内容来源于stack exchange

