如何在Expo应用中内置主JS Bundle以实现离线运行?
问题背景
需要实现Expo应用内置JS Bundle离线运行,要求:
- 无需本地运行Metro Bundler
- 不从远程服务器获取JS Bundle
目前通过npx expo run:android --variant release命令构建的安装包能满足需求,但使用eas build --profile production --platform android --local生成的.aab文件,上传至Play商店进行内部测试时,应用会立即崩溃。已搜索相关方案但未找到有效解决办法,仅发现过时的expo publish命令。
排查与解决步骤
检查EAS配置文件
确认eas.json中production配置是否正确开启离线bundle打包:{ "build": { "production": { "android": { "buildType": "app-bundle", "gradleCommand": ":app:bundleRelease" }, "ios": { "buildConfiguration": "Release" }, "env": { "EXPO_NO_PUBLISH": "1" }, "distribution": "store" } } }重点确保
EXPO_NO_PUBLISH环境变量设置为1,强制构建时将JS Bundle内置到安装包,而非依赖远程发布版本。验证本地AAB完整性
用bundletool将本地生成的AAB转成通用APK,直接安装到真机测试:bundletool build-apks --bundle=./app.aab --output=./app.apks --mode=universal bundletool install-apks --apks=./app.apks若此APK运行正常,说明问题出在Play商店的签名或分发流程;若同样崩溃,说明本地构建过程存在问题。
核对签名配置
EAS本地构建时,确认使用的签名密钥与Play商店要求一致。首次上传需确保eas.json配置了正确的签名信息,或构建时选择与Play商店关联的密钥库。抓取崩溃日志
通过Play商店控制台内部测试页面获取崩溃报告,或用Android Studio的Logcat连接真机抓取日志,定位具体崩溃原因(常见原因:bundle未正确内置、签名不匹配、权限缺失、原生依赖冲突等)。对比两种构建方式的差异
npx expo run:android --variant release是调用本地Gradle构建,而EAS构建使用Expo预配置环境。检查项目中android/app/build.gradle的自定义配置,确保EAS构建时能继承这些配置。
内容的提问来源于stack exchange,提问作者derickito

