Expo React Native升级SDK51后,入口配置致应用致命崩溃
Expo SDK 47升级至SDK 51启动崩溃解决方法
问题概述
将Expo应用从SDK 47升级到SDK 51后,执行expo run:android出现启动致命崩溃,核心报错信息:
java.lang.IllegalStateException: DevelopmentClientController was initialized.
当前相关配置:
- package.json中
"main": "./index.js" - index.js使用
registerRootComponent(App)注册根组件 - MainActivity.kt通过
ReactActivityDelegateWrapper包装代理类
解决步骤
1. 修正package.json入口配置
将main字段修改为SDK 51推荐的裸工作流入口:
"main": "node_modules/expo/AppEntry.js"
若使用expo-router,可改为:
"main": "expo-router/entry"
2. 简化MainActivity.kt代码
移除ReactActivityDelegateWrapper,改用默认的ReactActivityDelegate实现,避免重复初始化冲突:
package com.expoplayground import android.os.Bundle import com.facebook.react.ReactActivity import com.facebook.react.ReactActivityDelegate import com.facebook.react.defaults.DefaultReactActivityDelegate class MainActivity : ReactActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(null) } override fun getMainComponentName(): String = "main" override fun createReactActivityDelegate(): ReactActivityDelegate { return DefaultReactActivityDelegate( this, mainComponentName, fabricEnabled = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED ) } }
3. 调整根组件注册逻辑(可选)
如果保留自定义index.js,将registerRootComponent替换为React Native原生的AppRegistry注册方式:
import { AppRegistry } from 'react-native'; import App from './App'; import { name as appName } from './app.json'; AppRegistry.registerComponent(appName, () => App);
也可以直接删除自定义index.js,使用Expo默认的AppEntry入口。
问题原因
SDK 51对裸工作流与托管工作流的入口初始化逻辑做了明确区分,旧代码中ReactActivityDelegateWrapper和registerRootComponent同时使用,导致DevelopmentClientController被重复初始化,触发崩溃异常。
内容的提问来源于stack exchange,提问作者Amir-Mousavi
相关产品推荐
相关产品推荐

