発生した問題
- Androidのreleaseビルドでのみクラッシュする
- 実機でアプリを起動直後にクラッシュする
- debugビルドでは問題ない。エラーもなくエミュレータで立ち上がる
- 実機をMacに有線で繋ぎAndroid StudioのLogcatを開くと以下のエラーを確認できる(本当はもっとたくさん出てる)
java. lang. Exception: No launchable update was found. If this is a bare workflow app, make sure you have configured expo-updates correctly in android/app/build.gradle.
com.facebook.jni.CppException: Compiling JS failed: Wrong bytecode version. Expected 85 but got 84 Buffer size
環境
- expo: 46.0.16
- react: 18.0.0
- react-native: 0.69.6
経緯
- SDK44 -> SDK46へアップグレード完了
- 実機でreleaseビルドが問題なく動くことを確認する
- Upgrade Helperに沿って修正したタイミングでAndroidのhermesをオフにしてしまったことに気づく
-
app/build.gradle
でenableHermes: true
とする - releaseビルドでクラッシュする問題が発生
解決策
https://github.com/facebook/react-native/issues/34114
このissueに記載されている解決策に沿ってhermesCommand
の一文を消す
app/build.gradle
project.ext.react = [
enableHermes: true,
cliPath: new File(["node", "--print", "require.resolve('react-native/package.json')"].execute(null, rootDir).text.trim()).getParentFile().getAbsolutePath() + "/cli.js",
// ここの一文を消す→ hermesCommand: new File(["node", "--print", "require.resolve('hermes-engine/package.json')"].execute(null, rootDir).text.trim()).getParentFile().getAbsolutePath() + "/%OS-BIN%/hermesc",
composeSourceMapsPath: new File(["node", "--print", "require.resolve('react-native/package.json')"].execute(null, rootDir).text.trim()).getParentFile().getAbsolutePath() + "/scripts/compose-source-maps.js",
]
これで問題が解決しました。
ちょっともう記憶にないのですが、以前expo-modulesに移行したときに移行ドキュメントに従って追加したhermesCommand
が原因だったようです。
振り返り
エラー文で検索するとexpo-update
や、依存しているsentry-expo
を疑う投稿が複数あり、Androidのreleaseビルドのみクラッシュするという症状も同じだったので、その方向で調査を続けてだいぶ時間を溶かしてしまいました。
今回の自分の問題はhermesをオフにすれば消えるので、hermesの設定周りからもう少し早く見直すべきでした。