Expo SDK 55アップグレード完全ガイド — New Architecture必須化とexpo-av廃止への対応

Expo SDK 55へのアップグレード手順を実践的に解説。New Architecture必須化、expo-av廃止への移行コード、Hermesバイトコード差分によるOTAサイズ75%削減、Expo Routerの新機能まで、2026年最新の移行ガイドをコード例付きでお届けします。

はじめに:SDK 55は「歴史的な転換点」です

2026年2月、ついにExpo SDK 55が正式リリースされました。正直に言うと、今回のアップデートは単なるバージョンアップという言葉では片付けられません。Legacy Architecture(旧アーキテクチャ)のサポートが完全に廃止され、New Architectureが唯一の選択肢になりました。React Native開発にとって、まさに歴史的な転換点です。

SDK 55にはReact Native 0.83React 19.2が同梱されています。Hermesバイトコード差分による最大75%のOTA更新サイズ削減、expo-avの完全廃止、新しいExpo Router API、expo-brownfieldによるブラウンフィールドサポート強化など、重要な変更がてんこ盛りです。

この記事では、SDK 54以前からSDK 55へのアップグレードを安全かつ確実に進めるための実践ガイドをお届けします。実際のコード例、トラブルシューティング、よくある落とし穴まで、一通りカバーしていきますので、ぜひ最後までお付き合いください。

SDK 55の主要スペック一覧

まずはSDK 55の基本スペックをざっと確認しておきましょう。

  • React Native:0.83.2
  • React:19.2
  • 対応Android API:Level 36(最低 Android 7+)
  • 対応Xcode:16.1以上(EAS Buildデフォルト:Xcode 26.2)
  • 対応iOS:15.1以上
  • 対応Node.js:^20.19.4、^22.13.0、^24.3.0、^25.0.0
  • アーキテクチャ:New Architecture のみ(Legacy Architecture完全廃止)

Node.jsの対応バージョンが幅広いのはありがたいですね。ただ、v18系はサポート外なので、まだ使っている方は先にNode.jsのアップグレードが必要です。

アップグレード前の準備:順序が重要です

最重要ポイント:New Architectureへの移行を先に行う

SDK 55へのアップグレードで一番大事なルールを先にお伝えします。それは、SDKのバージョンアップとNew Architectureへの移行を同時にやらないことです。

これ、本当に重要です。両方を一度にやってしまうと、問題が起きたときに原因の切り分けがほぼ不可能になります。

推奨される手順はこちら。

  1. SDK 54のままNew Architectureを有効化する
  2. 開発ビルドを作成し、しっかりテストする
  3. 問題があればNew Architectureトラブルシューティングガイドを参照して解決する
  4. New Architectureが安定稼働することを確認してから、SDK 55にアップグレードする

焦る気持ちは分かりますが、この順序を守ることで結果的にアップグレード作業がスムーズに進みます。

依存パッケージの互換性チェック

アップグレード前に、サードパーティライブラリがNew Architectureに対応しているかも確認しておきましょう。React Native Directoryで互換性ステータスをチェックできます。

特に注意したいのが、react-native-reanimated v4と@shopify/flash-list v4です。これらはNew Architecture専用になっているので、使っている場合は最新バージョンへの更新も必要になります。

ステップバイステップ:SDK 55へのアップグレード手順

ステップ1:依存パッケージの更新

では、実際のアップグレード手順に入りましょう。まずはExpo SDKと関連パッケージの更新からです。

# SDK 55にアップグレード
npx expo install expo@^55.0.0 --fix

# 診断ツールで問題をチェック
npx expo-doctor@latest

expo-doctorはかなり優秀で、バージョンの不整合やNew Architecture非対応パッケージ、その他の問題をしっかり検出してくれます。警告が出たら、以下のコマンドで修正しましょう。

# 依存パッケージを最新のパッチバージョンに更新
npx expo install --fix

ステップ2:app.jsonの設定変更

SDK 55では、いくつかの設定オプションが不要になっています。app.jsonから以下の設定を削除してください。残っていてもエラーにはなりませんが、不要な設定は消しておくのがベストです。

// 削除が必要な設定項目
{
  "expo": {
    // ❌ 削除:New Architectureは常に有効
    "newArchEnabled": true,

    // ❌ 削除:React 19が標準
    "experiments": {
      "reactCanary": true
    },

    // ❌ 削除:Android 16+でedge-to-edgeは必須
    "edgeToEdgeEnabled": true,

    // ❌ 削除:通知設定はapp.jsonスキーマから削除
    "notification": { ... }
  }
}

ステップ3:ネイティブプロジェクトの再生成

Continuous Native Generation(CNG)を使用している場合

# android/iosディレクトリを削除(次回ビルド時に自動再生成)
rm -rf android ios

# または、明示的に再生成
npx expo prebuild --clean

CNGを使用していない場合(ベアワークフロー):

# iOSのPodを再インストール
npx pod-install

# React Native Upgrade Helperで差分を確認
# https://react-native-community.github.io/upgrade-helper/

ベアワークフローの方は、Upgrade Helperでの差分確認を忘れずに。手動で追わないといけない変更が意外とあったりします。

ステップ4:開発ビルドの作成とテスト

SDK 55への移行では、Expo Goではなく開発ビルドを使うことを強くおすすめします。リリース直後はExpo GoがまだSDK 54ベースのままなので、SDK 55の全機能を正しくテストできません。

# 開発ビルドの作成
eas build --profile development --platform all

# ローカルでの実行
npx expo run:ios
npx expo run:android

破壊的変更の詳細と対応方法

expo-avの完全廃止

SDK 55でおそらく最も影響が大きい破壊的変更が、expo-avの廃止です。Expo Goから完全に削除され、今後パッチも提供されません。つまり、代替パッケージへの移行は避けて通れません。

移行マッピング

  • expo-avのAudio機能 → expo-audio
  • expo-avのVideo機能 → expo-video

まずは新しいパッケージをインストールします。

npx expo install expo-video expo-audio

音声再生の移行例

// ❌ 旧:expo-av を使用
import { Audio } from 'expo-av';

const { sound } = await Audio.Sound.createAsync(
  require('./audio.mp3')
);
await sound.playAsync();

// ✅ 新:expo-audio を使用
import { useAudioPlayer } from 'expo-audio';

function AudioPlayerComponent() {
  const player = useAudioPlayer(require('./audio.mp3'));

  const handlePlay = () => {
    player.play();
  };

  return (
    <TouchableOpacity onPress={handlePlay}>
      <Text>再生</Text>
    </TouchableOpacity>
  );
}

新しいAPIはReact Hooksベースになっていて、個人的にはずっと使いやすくなったと感じています。

動画再生の移行例

// ❌ 旧:expo-av を使用
import { Video } from 'expo-av';

<Video
  source={{ uri: 'https://example.com/video.mp4' }}
  useNativeControls
  resizeMode="contain"
  style={{ width: 300, height: 200 }}
/>

// ✅ 新:expo-video を使用
import { VideoView, useVideoPlayer } from 'expo-video';

function VideoPlayerComponent() {
  const player = useVideoPlayer(
    'https://example.com/video.mp4',
    (player) => {
      player.loop = true;
    }
  );

  return (
    <VideoView
      player={player}
      style={{ width: 300, height: 200 }}
      contentFit="contain"
      nativeControls={true}
    />
  );
}

expo-routerの変更点

Expo Routerにもいくつか破壊的変更があるので押さえておきましょう。

  • ExpoRequest/ExpoResponseが廃止 → 標準のRequest/Responseを使用
  • ヘッドレスタブのreset propがresetOnFocusにリネーム
// ❌ 旧
import { ExpoRequest, ExpoResponse } from 'expo-router/server';

export function GET(request: ExpoRequest): ExpoResponse {
  return ExpoResponse.json({ message: 'hello' });
}

// ✅ 新
export function GET(request: Request): Response {
  return Response.json({ message: 'hello' });
}

Web標準のAPIに寄せてきた形ですね。個人的にはこの方向性は歓迎です。

その他の破壊的変更

  • expo-videoallowsFullscreenが廃止 → fullscreenOptions.enableを使用
  • expo-clipboard:イベントリスナーのcontentプロパティ廃止 → getStringAsync()を使用
  • expo-blurexperimentalBlurMethodblurMethodにリネーム
  • プッシュ通知:Expo Go(Android)でプッシュ通知を使用すると、警告ではなくエラーがスローされるように変更

プッシュ通知の変更は地味にハマりやすいポイントなので、Expo Goでの開発中に通知周りをテストしている方は気をつけてください。

SDK 55の注目すべき新機能

Hermesバイトコード差分(OTA更新の最適化)

さて、ここからは嬉しい話です。SDK 55で個人的に一番テンションが上がった新機能が、Hermesバイトコード差分です。

従来、OTA更新ではHermesでコンパイルされたJavaScriptバンドル全体をダウンロードする必要がありました。でもこの機能を有効にすると、差分(パッチ)だけをダウンロードするようになります。その結果、更新ダウンロードサイズが最大75%も削減されるんです。

有効化はapp.jsonに1行追加するだけ。

{
  "expo": {
    "updates": {
      "enableBsdiffPatchSupport": true
    }
  }
}

ちなみに、SDK 56ではこの機能がデフォルトで有効になる予定だそうです。

Hermes V1(オプトイン)

Hermes V1は、ES6クラス、const/let構文、async/awaitなど、モダンなJavaScript機能のネイティブサポートが強化された新しいJSエンジンです。パフォーマンスの改善も報告されています。

ただし、SDK 55の段階ではオプトイン扱いで、React Nativeをソースからビルドする必要があるため、ビルド時間がかなり増加します。本番投入は慎重に判断した方がよさそうです。

// app.json での有効化
{
  "expo": {
    "plugins": [
      [
        "expo-build-properties",
        {
          "android": {
            "buildReactNativeFromSource": true,
            "useHermesV1": true
          },
          "ios": {
            "buildReactNativeFromSource": true,
            "useHermesV1": true
          }
        }
      ]
    ]
  }
}

// package.json でのバージョン指定
{
  "overrides": {
    "hermes-compiler": "250829098.0.4"
  }
}

パッケージバージョンの統一

これは地味だけど嬉しい変更です。SDK 55から、すべてのExpoパッケージがSDKと同じメジャーバージョンを使うようになりました。例えばexpo-camera@^55.0.0のように、パッケージの互換性が一目で分かります。

「このバージョンのexpo-cameraってSDK 55で使えるんだっけ?」と迷うことがなくなりますね。

expo-brownfield:ブラウンフィールドアプリのサポート強化

既存のネイティブアプリにReact Nativeを組み込む「ブラウンフィールド」開発が、新しいexpo-brownfieldパッケージで大きく改善されました。2つの統合モードが用意されています。

  • Integrated(統合型):React NativeコードがネイティブプロジェクトやJetpack Compose内に共存する形。両方を同時に開発するチーム向け
  • Isolated(分離型):React NativeアプリをAAR(Android)やXCFramework(iOS)としてパッケージ化。ネイティブ開発者はNode.js環境なしで利用可能

特にIsolatedモードは、大規模なチームでネイティブ開発者とRN開発者が分かれている場合にかなり便利そうです。

Expo Routerの新機能

Expo RouterにもUIと機能面で多くの改善が入りました。

  • Apple Zoomトランジション:iOSでインタラクティブな共有要素トランジションがデフォルト有効
  • Colors API:AndroidでMaterial 3のダイナミックカラー、iOSでアダプティブカラーを提供
  • Stack.Toolbar API:iOSでUIToolbarベースのメニュー・アクション領域を追加
  • 同期レイアウト更新:ナビゲーション時のジャンプアーティファクトを軽減
  • ネイティブタブのセーフエリア自動処理:手動でのインセット設定が不要に

Zoomトランジションはデモを見るとかなりスムーズで、ネイティブアプリ感がグッと増します。

新しいデフォルトテンプレート

プロジェクトテンプレートも刷新されました。

  • アプリコードが/appではなく/src/appに配置される新構成
  • iOS・AndroidでNative Tabs APIを使用したネイティブなタブ体験
  • ウェブ向けのレスポンシブレイアウト
# 新しいテンプレートでプロジェクトを作成
npx create-expo-app@latest --template default@sdk-55

SDK 55で追加された注目API

パッケージ単位での新機能もかなり充実しています。主要なものをまとめておきます。

  • expo-crypto:AES-GCM暗号化・復号化のサポート追加
  • expo-sqlite:DevToolsプラグインによるSQLiteインスペクター、タグ付きテンプレートリテラルで型安全なクエリ
  • expo-audio:ロック画面コントロール、バックグラウンド録音、プレイリスト対応、ネイティブプリロード
  • expo-video:seekTolerance、スクラビングモード、Android複数VideoView PiP対応
  • expo-image:iOS HDR画像対応、SF Symbolsレンダリング
  • expo-camera:ビデオスタビライゼーション、Androidフロントカメラでのスクリーンフラッシュ
  • expo-blur:Android 12以上でRenderNode APIによる安定したブラー効果
  • expo-widgets(Alpha):Expo UIを使ったiOSホーム画面ウィジェットとLive Activities(ネイティブコード不要)

expo-widgetsはまだAlphaですが、SwiftUIを書かずにウィジェットが作れるのはインパクトがありますね。今後の発展が楽しみです。

AI支援によるアップグレード

面白いことに、SDK 55ではExpoがAI支援開発のファーストクラスサポートも構築しています。Expo CLIがModel Context Protocol(MCP)を通じてAIエージェントにコマンドを公開しているんです。

Claude Codeを使っている場合、以下の手順でAI支援アップグレードを試せます。

# Expoスキルをインストール
/plugin marketplace add expo/skills
/plugin install upgrading-expo

# その他のAIエージェントの場合
bunx skills add expo/skills

AIエージェントが移行ガイドを読み込んで、コードベースを分析し、依存関係を更新し、破壊的変更まで修正してくれます。ただし、必ず別ブランチで作業して、マージ前にすべての変更をレビューしてください。AIは便利ですが、最終チェックは人間の目で行うのが安全です。

トラブルシューティング:よくある問題と解決策

ビルドエラーが発生する場合

サードパーティパッケージのビルドエラーに遭遇したら、そのパッケージがReact Native 0.83にまだ対応していない可能性があります。以下の順序で確認しましょう。

  1. パッケージのリリースページで新バージョンが出ていないかチェック
  2. npx expo-doctor@latestで互換性を確認
  3. React Native Directoryで対応状況を確認

node_modulesの状態が不正になる場合

大量のパッケージが同時に更新されると、node_modulesがおかしな状態になることがあります。経験上、変に悩むよりクリーンインストールした方が早いです。

# node_modulesを完全にクリーンアップ
rm -rf node_modules
rm -rf package-lock.json  # npmの場合
# または rm -rf yarn.lock  # yarnの場合

# 再インストール
npm install
# または yarn install

ランタイムクラッシュの調査

ビルドは通るのにランタイムでクラッシュする…これが一番厄介なパターンですよね。以下のツールでネイティブ側のエラーを確認できます。

# Android: ADB Logcatでログを確認
adb logcat | grep -i "react\|expo\|fatal"

# iOS: macOS Consoleアプリでログを確認
# Xcode > Window > Devices and Simulators でもクラッシュログを確認可能

Expo Goが使えない場合

SDK 55リリース直後は、App StoreのExpo GoがまだSDK 54ベースのままです。SDK 55を使うには以下の方法があります。

# Android: Expo CLI経由でSDK 55版Expo Goをインストール
npx expo start  # QRコードを読み取ると自動インストール

# iOS: TestFlight External Betaを使用
# または独自のExpo Goビルドを作成
eas go

SDK 56で予告されている変更

先のことも少し見ておきましょう。SDK 56で予告されている主な変更です。

  • Hermesバイトコード差分がデフォルト有効に
  • 最低iOSバージョンが15.1から16.4に引き上げ
  • expo-video-thumbnailsの完全削除(expo-videogenerateThumbnailsAsyncに移行)

iOS 16.4への引き上げは、古いデバイスをサポートしているアプリでは影響があるかもしれません。今のうちに自分のアプリのiOSサポート範囲を確認しておくといいでしょう。

よくある質問(FAQ)

Q: SDK 54からSDK 55に直接アップグレードできますか?

はい、直接アップグレードできます。ただし、New Architectureへの移行をSDK 54の段階で先に完了させてからSDK 55にアップグレードすることを強くおすすめします。両方を同時にやると、問題の原因特定が本当に大変です。

Q: expo-avをまだ使っていますが、すぐに移行しないとどうなりますか?

expo-avはSDK 55のExpo Goから完全に削除されました。今後パッチの提供もありません。開発ビルドでは一時的に動くかもしれませんが、動作保証はなし。expo-audioexpo-videoへの早めの移行をおすすめします。

Q: Hermes V1は本番環境で使っても大丈夫ですか?

正直なところ、SDK 55の段階ではまだ様子見がいいと思います。オプトイン機能であり、本番環境での実績はまだ十分とは言えません。ビルド時間も増えるので、まずはステージング環境でしっかりテストしてから判断してください。

Q: New Architectureに対応していないサードパーティライブラリはどうすれば?

React Native 0.83には互換レイヤー(インターオップレイヤー)が含まれているので、多くのライブラリはそのまま動作します。ただ、完全な互換性は保証されていません。まずReact Native Directoryで対応状況を確認して、未対応であればライブラリの開発者にIssueを立てるか、代替ライブラリへの切り替えを検討しましょう。

Q: SDK 55のExpo Goはいつストアで利用可能になりますか?

正確な日程は公表されていませんが、正式リリース後に順次更新される予定です。それまでは、Android版はExpo CLI経由でインストール、iOS版はTestFlight External Betaまたはeas goコマンドで独自のExpo Goビルドを作成して乗り切りましょう。

著者について Editorial Team

Our team of expert writers and editors.