差分アップデート
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 CNG
- iOS
- Android
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
}
}
]
次のキーをInfo.plistに追加します。
<key>CodePushEnableDeltaUpdates</key>
<true/>
次をres/values/strings.xmlに追加します。
<bool name="CodePushEnableDeltaUpdates">true</bool>
アップデート間でデルタが作成される仕組み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 を使用します。