React Native应用启动崩溃:Module not found报错求助
这个问题我之前帮好几个开发者排查过,本质是JS bundle加载时找不到指定的原生/JS模块,进而触发JNI层面的致命异常。下面是一步步的排查和修复思路,你可以按顺序尝试:
常见原因及修复步骤
1. 检查第三方模块的链接状态
这个错误大概率和第三方库未正确链接到原生项目有关,尤其是你最近新增过依赖的话:
- 如果你使用的是React Native 0.60+版本,先尝试自动链接:执行
npx pod-install(iOS端),或者在Android Studio里点击「Sync Project with Gradle Files」同步gradle配置 - 若涉及手动链接,要确认Android端的
settings.gradle已添加对应模块、build.gradle已引入依赖,且MainApplication.java里把模块加入了getPackages()方法中
2. 清理缓存并重新构建
缓存紊乱是这类奇怪报错的高发原因,建议彻底清理后重新构建:
- 清理React Native缓存:
npx react-native start --reset-cache - 清理Android构建缓存:进入项目根目录的android文件夹,执行
./gradlew clean,之后回到根目录重新运行npx react-native run-android - 注意:如果修改过原生代码,一定要先停止当前的Metro服务,再重新启动
3. 验证bundle文件的完整性
报错日志里明确提到了index.android.bundle,可能是bundle打包不完整导致模块丢失:
- 尝试重新生成Android 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/ - 若处于Debug模式,确认Metro服务正常运行,打包过程中没有抛出其他错误
4. 排查近期的代码变更
如果之前项目运行正常,最近才出现崩溃,优先排查近期操作:
- 是否新增/删除过第三方依赖?可以尝试回滚到之前的稳定版本,验证问题是否消失
- 是否修改过
index.js或其他入口文件的导入路径?检查是否存在拼写错误或路径错误的导入语句
5. 自定义原生模块的JNI检查(如果涉及)
如果你自己开发了原生模块,要确认:
- 原生模块的包名、类名与JS层调用的名称完全一致
- JNI方法的签名没有拼写错误
- 原生模块正确继承了
ReactContextBaseJavaModule,且实现了getName()方法
终极兜底方案
如果上面的步骤都没解决问题,可以试试这招:
- 删除项目根目录的
node_modules文件夹,重新执行npm install或yarn install - 完全卸载手机上的测试APP,再重新安装
附上你提供的错误日志,方便后续排查参考:
FATAL EXCEPTION: mqt_js
Process: com.zibann.littlehome.debugEug, PID: 2790
com.facebook.jni.CppException: Exception in HostFunction: Module not found: 0 [native code]
v@index.android.bundle:2:1223
d@index.android.bundle:2:866
global code@index.android.bundle:11:4
at com.facebook.react.bridge.queue.NativeRunnable.run(Native Method)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at com.facebook.react.bridge.queue.MessageQueueThreadHandler.dispatchMessage(MessageQueueThreadHandler.java:29)
at android.os.Looper.loop(Looper.java:214)
at com.facebook.react.bridge.queue.MessageQueueThreadImpl$4.run(MessageQueueThreadImpl.java:232)
at java.lang.Thread.run(Thread.java:764)
内容的提问来源于stack exchange,提问作者eugene

