React Native应用仅安卓端启动崩溃,报No source URL loaded错误
该报错本质是React Native安卓端加载JS bundle时找不到有效的源URL,JS执行上下文初始化失败,iOS端因为bundle加载逻辑和安卓存在差异所以不受影响
验证metro服务链路
首先确认启动应用前已经正常运行metro服务,真机调试场景下必须先执行adb reverse tcp:8081 tcp:8081完成端口映射,检查本地有没有代理、防火墙拦截8081端口的本地连接。
如果是release包启动失败,检查android/app/build.gradle中的bundle打包配置,确认assembleRelease任务没有跳过JS bundle生成步骤,生成的bundle文件存在于assets/index.android.bundle路径。检查原生初始化配置
定位到安卓项目的MainApplication.java文件,确认getJSBundleFile()方法的返回值是否有效,有没有自定义的路径判断逻辑在崩溃后触发异常分支返回空值;同时检查是否有新增自定义JSIModule未正确注册,导致实例初始化时序异常,source URL还没加载就触发了SourceCodeModule的常量读取。执行全量缓存清理
你之前执行的清理步骤不完整,按顺序执行以下命令:# 重置metro缓存 npm start -- --reset-cache # 清理安卓构建缓存 cd android && ./gradlew cleanBuildCache # 重新安装依赖 rm -rf node_modules && npm install # 删除安卓本地构建产物 rm -rf android/app/build如果你使用Expo框架开发,额外执行
npx expo prebuild --clean重新生成原生配置文件。验证依赖兼容性
回忆崩溃前是否有升级React Native版本、新增第三方原生依赖?部分原生库(如react-native-reanimated、Realm等)如果和当前RN版本不兼容,会抢占JS上下文初始化时机,导致source URL未被正常注入,可以先回退最近新增的依赖验证是否恢复。
如果你开启了Hermes引擎,检查android/app/build.gradle中的Hermes配置是否完整,没有同时开启旧版JSVM开关导致冲突。
你可以手动将JS bundle打包到安卓assets目录,验证是否是动态加载链路的问题:
执行命令:
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
执行完成后重新启动应用,如果可以正常运行,说明问题出在metro动态加载bundle的链路上,重点排查端口映射、metro配置即可。
内容的提问来源于stack exchange,提问作者Y E

