メインコンテンツまでスキップ

差分アップデート

over-the-air アップデートをデバイスに配信する際は、アップデートのダウンロードとインストールにかかる時間が、スムーズなユーザーエクスペリエンスにとって重要です。

CodePush でデプロイされるアップデートは、通常、アプリのコードのごく一部しか変更しないため、バンドル全体をダウンロードしてインストールするのは非効率です。CodePush はパッケージのバージョン間の差分アップデートを自動的に計算するため、変更部分のみがダウンロードおよびインストールされます。

差分アップデートの仕組みClick to copy link​

差分アップデートパッケージには、新しいバージョン全体ではなく、デバイスにインストール済みのバージョンとインストールするバージョンとの間の変更のみが含まれます。

ファイル単位の差分とバイナリ差分のアップデートパッケージを比較した図

ファイル単位の差分: CodePush は 2 つのリリースをファイルごとに比較します。アップデートパッケージには、新たに追加されたファイルと変更されたファイルの全体、および削除するファイルの一覧のみが含まれます。変更のないファイルはパッケージに含まれません。

バイナリ差分: より効率的な差分の仕組みです。ファイル単位の差分と同様に、変更のないファイルはパッケージに含まれず、パッケージには削除するファイルの一覧が含まれます。2 つのバージョン間で変更されたファイルについては、CodePush はそのファイルの旧バージョンと新バージョンの間のバイトレベルのパッチを計算し、ファイル全体の代わりにそのパッチを配信します。ほとんどの React Native アップデートでは、バージョン間で JS バンドルが必ず変更されるため、この手法により JS バンドルファイル全体の取得を避けられます。

CodePush のデルタアップデートClick to copy link​

CodePush は、パッケージのバージョン間のデルタアップデートを自動的に計算します。デルタアップデートはサイズが小さいため、クライアントSDKはより速くダウンロードしてインストールできます。また、データ転送コストも削減できます。

ファイルレベルの差分は既定で有効になっており、一般的なすべての CodePush SDK実装で動作します。Bitrise CodePush SDKは、バージョン 10.6.1 以降で、より効率的なバイナリ差分に対応しています。

バイナリ差分は現在オプトイン方式です。有効にするには、アプリの設定で CodePushEnableDeltaUpdates を true に設定します。

Expoの Continuous Native Generation 機能を使用する場合は、次のキーをapp.jsonファイルに追加します。設定の全体については、Expoアプリ向けの CodePush の設定を参照してください。

[
"@bitrise/code-push-sdk/expo",
{
"ios": {
"CodePushDeploymentKey": "...",
"CodePushServerURL": "https://<workspace-slug>.codepush.bitrise.io",
+ "CodePushEnableDeltaUpdates": true
},
"android": {
"CodePushDeploymentKey": "...",
"CodePushServerURL": "https://<workspace-slug>.codepush.bitrise.io",
+ "CodePushEnableDeltaUpdates": true
}
}
]

アップデート間でデルタが作成される仕組みClick to copy link​

CodePush のデルタは、new updateの作成時にサーバー側で自動的に計算されます。デルタは常に以前のアップデートに対する差分であり、Bitriseは、新しく作成されたアップデートと直前の 5 つのアップデートとの間でデルタを生成します。具体例を示します。

アップデート v8 が作成されると、v7、v6、v5、v4、v3 に対するv8のデルタパッケージが生成されます。これらの以前のバージョンのいずれかから v8 にアップグレードするアプリは、サイズの小さいデルタパッケージを受け取ります。v1、v2、またはストアリリース(バイナリのアプリストアリリースの一部として配布されたバンドル)からアップグレードするアプリは、完全なアップデートを受け取ります。

Bitriseは、以前の CodePush アップデートに対してのみデルタを生成し、ストアバイナリ内のバンドルに対しては生成しません。このため、バイナリリリースの最初の CodePush アップデートにはデルタがなく、クライアントは完全なパッケージをダウンロードします。

バイナリ差分を含むデルタアップデートは、署名付きアップデートでも動作します。詳細については、CodePush でのCode signingを参照してください。

デルタアップデートの検証Click to copy link​

デルタアップデートは、次の 2 つの方法で検証できます。Bitriseが作成したデルタをサーバー上で確認する方法と、SDKがデルタを適用したことをデバイス上で確認する方法です。

アップデートのデルタ生成を確認するClick to copy link​

Bitriseがアップデートに対して作成したデルタを確認するには、CodePush CLIで update status を実行します。

bitrise :codepush update status Staging --label v13

出力には、デルタ生成の状態と、デルタを持つ以前のアップデートごとに 1 行が含まれます。

Update v13
Status processed_valid
Delta generation completed
Delta from v12 file-level diff, binary patch
Delta from v9, v11 file-level diff
  • Delta generation は、Bitriseがデルタをビルドしている間は pending になり、ダウンロードの準備ができると completed になります。
  • 各 Delta from 行は、以前のアップデートをバージョンラベルで示します。1 行に複数のラベルがある場合は、それらのアップデートが同じパッケージを共有していることを意味します。そのパッケージを持つアップデートがデプロイメントに残っていない場合、その行には代わりに短縮されたパッケージハッシュが表示されます。
  • completed 状態で Delta from 行がない場合、クライアントは完全なパッケージをダウンロードします。
  • 機械可読な出力が必要な場合は、--json フラグを追加します。

デバイス上でデルタアップデートを確認するClick to copy link​

バージョン 10.6.1 以降、Bitrise CodePush SDKは、起動時に設定をログに出力し、アップデートのインストールの各ステップもログに出力します。デバイスがバイナリ差分を使用していることを確認するには、次のログ行を探します。

  • 起動時に、バイナリ差分が有効な場合は Configuration 行に deltaUpdates=true が表示されます。
  • インストール中は、Applying diff update. binaryDiff=true patchedFiles=<count> により、デバイスがバイナリパッチを含むデルタパッケージを受信したことがわかります。バイナリパッチを含まないファイルレベルのデルタは binaryDiff=false をログに出力します。完全なパッケージの場合は、代わりに Applying full update. がログに出力されます。
  • パッチ適用後、Applied <count> binary diff patches. により、SDKがパッチを適用したことが確認できます。

接続されたAndroidデバイスまたは iOS シミュレーターからこれらのログをストリーミングするには、bitrise :codepush debug android または bitrise :codepush debug ios を使用します。