【React Native SDK】Expo アプリのデバッグが簡単に

Article by:

 

Expo アプリからのイベントは、React Native アプリ全体のイベント量の約 75% を占めています。この数値を受けて、Expo アプリのデバッグとパフォーマンスのワークフローを改善するために、Sentry React Native SDK への投資を行うことは自然な判断でした。

このアップデートにより、以下が可能になります。

  • OTA アップデートのチャンネルやバージョンでイシューをフィルタリングし、特定のアップデートに起因する問題かどうかを即座に絞り込む
  • 緊急リリースに対するアラートを受け取り、ユーザーから報告される前に OTA パイプラインの障害を検知
  • EAS Build の健全性を Sentry 上で追跡できるため、ビルドログを辿ることなく問題の発生箇所を特定
  • ナビゲーションパフォーマンス全体を可視化し、プリフェッチのタイミングやアセット読み込みまで含めて確認

 

 

自動 OTA 更新コンテキストの付与

Expo Updates を使った OTA 配信では、適切なコンテキストがないと問題の原因が見えづらくなります。どの update channel だったのか、どの runtime version だったのか、埋め込みバンドルだったのか、それともダウンロードされた更新だったのか、といった情報です。

今回のアップデートでは、すべての Sentry イベントに ota_updates コンテキストが自動で付与されます。追加設定は不要です。update ID、channel、runtime version、起動時間、埋め込みアセットの使用有無などが取得できます。これらは Expo プロジェクトで標準で収集されます。

さらに、すべてのイベントには検索可能なタグ(expo.updates.channel、expo.updates.runtime_version、expo.updates.update_id)も付与されるため、特定のチャンネルやアップデートに絞ったフィルタリングを簡単に行えます。

Sentry の問題の詳細には、アップデート ID、チャネル、ランタイム バージョン、起動期間タグを含む OTA アップデートのコンテキストが表示されます。

 

緊急起動の検知

Expo Updates は最新の OTA アップデートの読み込みに失敗した際にエマージェンシー起動を行い、埋め込みバンドルへフォールバックします。この状態では、ユーザーは古いバージョンのアプリを静かに使い続けている可能性があり、開発側もそれに気づけない場合があります。

今回の SDK では、起動時にエマージェンシー起動を検知し、その理由とともに warning レベルのイベントを自動的に Sentry へ送信します。これにより、expo.updates.emergency_launch タグを使ってアラートを設定でき、プロダクション環境でアップデートパイプラインが壊れた瞬間に即座に把握できます。

緊急起動時のExpo Updatesイベントで、フォールバック理由と関連タグが表示されます。

 

EAS Build フック: Sentry でビルド失敗を追跡

EAS Build のビルド失敗はリモートインフラ上で発生するため、ローカル環境やアプリ内部からは見えません。これまでは、EAS のビルドログを手動で確認する必要がありました。

新しい EAS Build Hooks を使うと、ビルドのライフサイクルイベントを直接 Sentry に送信できます。package.json に3つのスクリプトエントリを追加するか、on-complete フックを使えば1つの設定でも構いません。これにより、すべての失敗したビルドは EASBuildError イベントとして送信され、ビルドプラットフォーム、プロファイル、ビルド ID、Git コミットハッシュ、CI ステータスなどが含まれます。

成功したビルドも送信できるため、ビルドパイプライン全体の健全性を Sentry 上で一貫して把握できます。すべてのイベントには eas.* タグが付与され、フィルタリングやアラート設定も容易です。

セットアップは最小限です。SDK が提供するスクリプトをフックに指定し、DSN を EAS シークレットとして設定するだけで完了します。詳細は EAS Build Hooks のドキュメントを参照してください。

 

Expo Router のプリフェッチに対するパフォーマンススパン

Expo Router v5 では router.prefetch() により、ユーザーの画面遷移前にルートをプリロードできるようになりました。体感速度の向上には有効ですが、これまでプリフェッチのタイミングはトレース上で可視化されていませんでした。

Sentry.wrapExpoRouter(useRouter()) でルーターをラップすると、navigation.prefetch スパンが生成され、プリフェッチごとの実行時間を他のナビゲーションスパンと並べて確認できます。これにより、プリフェッチが遅いルートや不要なプリフェッチを特定できます。

 

Expo constants と環境コンテキスト

Expo アプリから送信されるすべてのイベントには、自動で expo_constants コンテキストが付与されます。ここには実行環境のメタデータが含まれます。例えば、Expo Go か standalone か bare かといった実行形態、app.json 由来のアプリ名とバージョン、Expo SDK バージョン、EAS project ID、デバッグモードの状態などです。

OTA update のコンテキストと組み合わせることで、追加設定なしで各イベントの実行環境を完全に把握できます。

 

画像とアセット読み込みのインストルメンテーション

画像やアセットの読み込みは、アプリ体験の速度に大きく影響する要素です。Expo の主要パッケージに対して、自動パフォーマンススパンを追加しました。

  • expo-image: Sentry.wrapExpoImage(Image) を起動時に一度だけ適用すると、Image.prefetch() と Image.loadAsync() に対してスパンが生成されます。
  • expo-asset: Sentry.wrapExpoAsset(Asset) を適用すると Asset.loadAsync() に対してスパンが記録されます。

 

どちらのラッパーも複数回呼び出しても安全で、トレースが存在する場合のみスパンを生成するためオーバーヘッドはありません。また expo-image や expo-asset が未インストールでも動作します(peer dependency)。

 

セットアップ

OTA update と constants コンテキストはデフォルトで有効です。追加設定や依存関係は不要です。ビルドフックやパフォーマンス計測については数行のコードでセットアップできます。最新の改善と修正を利用するにはバージョン 8.10 にアップデートしてください。

Expo では、EAS デプロイメントで発生したエラーについて、Sentry のイシュー詳細やリプレイを参照することも可能です。

まだ Sentry アカウントを持っていない場合は無料でサインアップできます。デベロッパープランには Expo アプリのエンドツーエンド計測に必要な機能がすべて含まれています。今回の統合に関するフィードバックや次に追加してほしい機能があれば、getsentry/sentry-react-native に issue を作成するか、Discord に参加してください。

 

 

Original Page: Improved debugging for Expo apps with the React Native SDK

 




IchizokuはSentryと提携し、日本でSentry製品の導入支援、テクニカルサポート、ベストプラクティスの共有を行なっています。Ichizokuが提供するSentryの日本語サイトについてはこちらをご覧ください。またご導入についての相談は「お問い合わせ」からお気軽にお問い合わせください。

 

シェアする

Recent Posts

;