より小さな OTA 更新:SDK 55 の EAS Update にバンドル差分比較が登場
SDK 55 の EAS Update に bundle diffing が導入されました。デバイスは完全な bundle ではなくパッチだけをダウンロードするようになり、ダウンロードサイズを最大 75% 削減できます。
日本語
コピー

EAS Update で更新を配信するたびに、ユーザーは新しい bundle をダウンロードすることになる。ほとんどのリリース(バグ修正、文言の変更、UI の微調整)では、数 MB のコードを転送することになり、実際に変わっているのはそのごく一部でしかない。
SDK 55 から、EAS Update が bundle diffing に対応した。デバイスは完全な bundle をダウンロードする代わりに、旧更新と新更新の差分だけを含む小さなバイナリパッチを受け取る。
私たちのテストでは、パッチによるダウンロードサイズは完全な bundle と比べて約 75% 削減された。つまり、典型的な 3MB の更新が 0.75MB 程度になる。ユーザーはより早く更新を受け取れ、消費する帯域も減る。
Bundle diffing は現在 beta 版で、手動で有効にする必要がある。以下では、その仕組みと有効化の方法を説明する。
bundle diffing とは
bundle diffing を使うと、expo-updates クライアントはデバイス上の既存の内容から新しい更新への diff をサーバーに要求し、そのパッチをローカルで適用する。diff によって、Android と iOS のどちらでも Hermes バイトコードと JavaScript のダウンロード時間が約 75% 短縮されると見積もっている。
bundle diffing の仕組み
EAS Update は bsdiff アルゴリズムでパッチを生成する。
デバイスが更新を要求したとき、EAS Update がパッチを配信するのは次の場合だけだ。
-
パッチが明らかに小さい場合。そうでなければデバイスは完全な bundle を受け取る。
-
パッチを効率よく生成できる場合。生成にコストがかかりすぎるなら、EAS Update は同じく完全な bundle にフォールバックする。
パッチ適用がどの段階でも確実に得にならないなら、これまでどおり更新を配信すればよい。
アプリで bundle diffing を有効にする
前提として、アプリは Expo SDK 55 以降を使っている必要がある。
そのうえでアプリ設定で有効にする。
{
"expo":{
"updates":{
"enableBsdiffPatchSupport":true
}
}
有効になっているか確認する

Expo のウェブサイト: Update Details ページで bundle diff が配信されたか確認できる。公開した Update Group を開き、確認したいプラットフォームを選ぶ。
アプリ内ログ: Updates.readLogEntriesAsync() を呼び出し、パッチが適用されたことを示すログ(例: “patch successfully applied”)を探す。
問題があれば、Discord かウェブサイトから連絡してほしい。
bundle diffing の制限
bundle diffing は SDK 55 では beta 版だ。現時点の制限は次のとおり。
-
内蔵 bundle には使えない。 内蔵 bundle がパッチの基準になることはない。パッチを受け取るには、デバイスがすでに公開済みの更新を実行している必要がある。
-
任意の 2 つの更新の間で即座にパッチを生成できるわけではない。 更新を公開すると、EAS Update はその channel で 2 番目に新しい更新に対してのみパッチを事前計算する。デバイスが別の公開済み更新を実行中に新しい更新を要求した場合、最初は完全な bundle を受け取る。その基準更新に対するパッチはその後オンデマンドで生成され、以降の同種のリクエストに使われる。
-
パッチは公開後すぐには生成されない。 更新の公開からパッチが準備できるまで数分かかることがある。その間、デバイスは完全な bundle を受け取る可能性がある。
フィードバック
bundle diffing は、ユーザーの帯域コストを下げ、更新配信をより効率的にするために開発した。今後は内蔵 bundle の diffing にも対応する予定だ。
bundle diffing が実際にどう機能しているかを知りたい。ぜひ Discord かウェブサイトで知らせてほしい。どう力になれるか教えてほしい。