Expo新项目在Android模拟器运行报错:未注册main及权限问题
Expo新项目Android14模拟器报错原因分析与解决办法
问题概况
新初始化的Expo应用在Android 14模拟器运行时触发两个错误:
Error: Exception in HostObject::get for prop 'NativeUnimoduleProxy': java.lang.SecurityException: Permission Denial: registerScreenCaptureObserver from pid=10391, uid=10192 requires android.permission.DETECT_SCREEN_CAPTURE, js engine: hermesERROR Invariant Violation: "main" has not been registered
对比表现:
- Android 11物理设备通过Expo App扫码可正常运行
- 旧Expo项目在Android 14模拟器和Android 11真机均正常
- 仅新项目在Android 14模拟器出现报错
核心原因分析
Android14权限限制引发Native层异常
Android 14新增了DETECT_SCREEN_CAPTURE权限的强制校验,Expo新版本模板默认集成了涉及屏幕捕获检测的模块(如expo-screen-capture或依赖它的基础模块),但模拟器环境下权限申请流程未被正确处理,导致Native层初始化失败,抛出SecurityException。Native层异常连锁导致JS层注册失败
第一个错误中断了NativeUnimoduleProxy的初始化,进而导致JS侧模块加载流程异常,最终无法完成AppRegistry.registerComponent("main")的调用,触发"Invariant Violation"错误——这是Native层问题引发的连锁反应,并非单纯的Metro目录或代码调用错误。
旧项目能正常运行,是因为使用的Expo SDK版本较低,未引入需要DETECT_SCREEN_CAPTURE权限的模块,避开了Android14的权限校验限制。
解决步骤
- 适配Expo SDK版本
如果使用的最新版SDK存在适配bug,可降级到对Android14支持稳定的版本(如SDK 49):
npx expo install expo@^49.0.0
或升级到最新修复版SDK,确保官方已修复Android14权限适配问题。
- 手动添加权限到AndroidManifest
生成原生项目文件后手动声明权限:
- 执行
npx expo prebuild生成Android原生目录 - 打开
android/app/src/main/AndroidManifest.xml,添加权限声明:
<uses-permission android:name="android.permission.DETECT_SCREEN_CAPTURE" />
- 重新运行
npx expo run:android
- 移除不必要的屏幕捕获模块
如果项目不需要防截屏功能,直接卸载相关模块:
npx expo uninstall expo-screen-capture
之后清理缓存重新启动项目:npx expo start --clear
- 清理缓存与模拟器状态
- 清理Metro缓存:
npx expo start --clear - 在Android模拟器中卸载应用,进入应用信息页面清除缓存,重启模拟器后重新安装运行。
内容的提问来源于stack exchange,提问作者Louai alfarra
相关产品推荐
相关产品推荐

