リリースビルドのデバッグ
スタックトレースのシンボル化
React Nativeアプリがリリースビルドで処理されない例外をスローした場合、出力は難読化され、読みにくい場合があります。
07-15 10:58:25.820 18979 18998 E AndroidRuntime: FATAL EXCEPTION: mqt_native_modules
07-15 10:58:25.820 18979 18998 E AndroidRuntime: Process: com.awesomeproject, PID: 18979 07-15 10:58:25.820 18979 18998 E AndroidRuntime: com.facebook.react.common.JavascriptException: Failed, js engine: hermes, stack:
07-15 10:58:25.820 18979 18998 E AndroidRuntime: p@1:132161
07-15 10:58:25.820 18979 18998 E AndroidRuntime: p@1:132084
07-15 10:58:25.820 18979 18998 E AndroidRuntime: f@1:131854
07-15 10:58:25.820 18979 18998 E AndroidRuntime: anonymous@1:131119
上記のスタックトレースでは、p@1:132161
のようなエントリは、縮小された関数名とバイトコードオフセットです。 これらの呼び出しをデバッグするには、これらをファイル、行、および関数名、たとえば AwesomeProject/App.js:54:initializeMap
に変換する必要があります。 これは**シンボル化**として知られています。
スタックトレースと生成されたソースマップを metro-symbolicate
に渡すことで、上記のような縮小された関数名とバイトコードをシンボル化できます。
ソースマップの有効化
スタックトレースをシンボル化するには、ソースマップが必要です。 ターゲットプラットフォームのビルド設定内でソースマップが有効になっていることを確認してください。
- Android
- iOS
情報
Androidでは、ソースマップは**デフォルトで有効**になっています。
ソースマップの生成を有効にするには、android/app/build.gradle
に次の hermesFlags
が存在することを確認してください。
react {
hermesFlags = ["-O", "-output-source-map"]
}
正しく行われた場合、Metroビルド出力中にソースマップの出力場所が表示されます。
Writing bundle output to:, android/app/build/generated/assets/react/release/index.android.bundle
Writing sourcemap output to:, android/app/build/intermediates/sourcemaps/react/release/index.android.bundle.packager.map
情報
iOSでは、ソースマップは**デフォルトで無効**になっています。有効にするには、次の手順に従ってください。
ソースマップの生成を有効にするには
- Xcodeを開き、「React Nativeのコードと画像をバンドルする」ビルドフェーズを編集します。
- 他のエクスポートの上に、目的の出力パスを持つ
SOURCEMAP_FILE
エントリを追加します。
+ SOURCEMAP_FILE="$(pwd)/../main.jsbundle.map";
WITH_ENVIRONMENT="../node_modules/react-native/scripts/xcode/with-environment.sh"
正しく行われた場合、Metroビルド出力中にソースマップの出力場所が表示されます。
Writing bundle output to:, Build/Intermediates.noindex/ArchiveIntermediates/application/BuildProductsPath/Release-iphoneos/main.jsbundle
Writing sourcemap output to:, Build/Intermediates.noindex/ArchiveIntermediates/application/BuildProductsPath/Release-iphoneos/main.jsbundle.map
metro-symbolicate
の使用
ソースマップが生成されたので、スタックトレースを変換できるようになりました。
# Print usage instructions
npx metro-symbolicate
# From a file containing the stack trace
npx metro-symbolicate android/app/build/generated/sourcemaps/react/release/index.android.bundle.map < stacktrace.txt
# From adb logcat (Android)
adb logcat -d | npx metro-symbolicate android/app/build/generated/sourcemaps/react/release/index.android.bundle.map
ソースマップに関する注意事項
- ビルドプロセスによって複数のソースマップが生成される場合があります。 例に示されている場所にあるものを使用してください。
- 使用するソースマップが、クラッシュしたアプリのコミットと完全に一致していることを確認してください。 ソースコードの小さな変更が、オフセットに大きな違いを引き起こす可能性があります。
metro-symbolicate
がすぐに正常に終了した場合は、入力が端末ではなくパイプまたはリダイレクトからのものであることを確認してください。