React Native Hermes启用后JS代码报错,如何排查解决?
刚给项目配置了Hermes,按照文档在android/app/build.gradle里加了enableHermes: true,打包后运行时JS代码突然报错,但堆栈信息全是Hermes的内部函数,完全看不到我的代码位置。试过清除metro缓存、重装node_modules都没用,错误提示是HermesInternalException: Could not find JS module 'index',明明入口文件路径没错啊,这是哪里出问题了?
android/app/build.gradle配置:
project.ext.react = [
// ...其他配置
enableHermes: true, // 这里改成true后问题出现
hermesCommand: "../../node_modules/hermes-engine/hermesc/bin/hermesc"
]
你这个报错
Could not find JS module 'index',大概率是android/app/build.gradle里没显式指定入口文件,或者生成的 hermes 字节码没打包进 APK。先确认几个关键点:
1.
android/app/build.gradle里有没有这行(缺了这个 Hermes 就不会生成字节码):2. 如果你用了
index.android.bundle以外的入口(比如index.ts或带路径的),那entryFile必须手动指定,否则 Hermes 打包会默认找index.js,自然就报找不到。3. 打包前先清干净缓存(别只清 metro):
./gradlew clean+ 删除android/app/build和android/.gradle,再重新打包。Hermes 的字节码缓存特别顽固,不清干净很容易残留旧的 bundle 路径。
4. 最后检查一下
android/app/src/main/assets里有没有index.android.bundle或index.android.bundle.meta,这两个文件必须存在,而且大小正常(比如 JS 500KB 的项目,bundle 一般 200KB+,meta 几 KB)。如果为空或不存在,说明打包阶段就失败了。我之前就遇到过因为
entryFile没配,Hermes 生成了空字节码包,运行时一加载就崩,堆栈全是HermesInternal,查了半小时才发现是入口没指定。效率更高的是直接在android/app/build.gradle里加个打印:重新打包前先跑一遍
./gradlew clean,大概率就解决了。然后 clean 一下项目:cd android && ./gradlew clean,再重新打包。