如何完全脱离Expo服务构建React Native Android应用?
嘿,我来帮你理清这些困惑,一步步解决你的问题~
先纠正你对React Native + Expo工作流的误解
你之前的理解有点偏差:当你把Expo应用detach(eject)到ExpoKit后,你的项目已经生成了完整的原生Android/iOS目录,并不是完全依赖Expo云端的bundle运行。此时你的项目是在原生代码中集成了ExpoKit这个原生库,它作为RN和原生之间的桥接层,同时你的npm依赖里也残留了Expo相关包——这就是你即使没用到Expo功能,仍有依赖的原因。
为什么脱离Expo后还存在依赖?
Eject操作只是把Expo的“云端托管”模式转为“原生本地开发”模式,但它会自动把ExpoKit和相关npm包集成到你的项目中,目的是让你能继续使用Expo的原生模块(即使你没用到)。所以即使你没调用任何Expo API,原生代码和npm依赖里依然有Expo的残留引用,导致你还需要依赖它才能编译运行。
完全移除Expo依赖,构建纯RN Android应用的步骤
1. 先备份你的项目!
这一步非常重要,避免操作失误导致代码丢失。直接复制整个项目文件夹到其他位置即可。
2. 清理npm/yarn依赖
打开终端,进入项目根目录,执行以下命令:
- 移除所有Expo相关包:
npm uninstall expo expo-cli @expo/* expo-kit # 如果你用yarn的话: yarn remove expo expo-cli @expo/* expo-kit - 重新安装依赖:
npm install # 或者 yarn install
3. 清理Android原生项目
这是最关键的步骤,需要手动移除原生代码中所有Expo的引用:
- 修改
android/app/build.gradle:- 删除所有Expo相关的依赖(比如
implementation 'host.exp.exponent:expo-core:xxx'这类) - 删除buildscript里的Expo仓库地址
- 删除android节点下的Expo插件配置(比如
apply plugin: 'expo')
- 删除所有Expo相关的依赖(比如
- 修改
android/settings.gradle:- 删除所有包含Expo的
include语句和project引用
- 删除所有包含Expo的
- 修改
android/app/src/main/java/[你的包名]/MainApplication.java:- 删除所有Expo相关的import(比如
import expo.modules.core.ExpoPackage;) - 把
getPackages()方法中的Expo相关package移除,替换为纯RN的new PackageList(this).getPackages()
- 删除所有Expo相关的import(比如
- 修改
android/app/src/main/java/[你的包名]/MainActivity.java:- 将继承的
ExpoActivity改为ReactActivity - 删除所有Expo相关的代码,保留纯RN的MainActivity结构(比如只保留
getMainComponentName()方法)
- 将继承的
- 删除Expo相关资源文件:
- 删掉
android/app/src/main/res/values/expo-colors.xml、expo-styles.xml等Expo生成的资源 - 删除
android/.expo文件夹(如果存在)
- 删掉
4. 配置纯RN的bundle生成
之前用expo publish生成云端bundle,现在你可以用RN原生的命令生成本地bundle:
npx react-native bundle --platform android --dev false --entry-file index.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res/
或者直接运行npx react-native run-android,它会自动生成bundle并安装到设备上。
5. 测试运行
执行以下命令启动Android应用:
npx react-native run-android
如果启动报错,检查原生代码中是否还有残留的Expo引用(比如AndroidManifest.xml里的Expo配置),逐一清理即可。
最后回答你的核心疑问
当然可以直接构建无Expo依赖的应用!只是detach后的项目默认带了ExpoKit的集成,你需要手动清理这些残留的引用和依赖,完成上面的步骤后,你的项目就完全是纯React Native项目了,不再依赖任何Expo服务或库,未来也不用担心Expo关停的影响。
内容的提问来源于stack exchange,提问作者Mizlul

