アプリ パッケージの更新プログラム

最新の Windows アプリ パッケージの更新処理は、アプリの重要な変更部分のみをダウンロードして既存の Windows アプリを更新するように最適化されています。

AppxBlockMap.xml ファイル内のメタデータ

大まかに言うと、パッケージ作成中に 1 つのメタデータが作成され、アプリ パッケージ ファイル (.appx または .msix) に保存されます。これにより、パッケージの一部を Windows で一意に識別できます。 アプリ パッケージを更新するとき、Windows ではメタデータ ファイルを使用して古いパッケージと新しいパッケージを比較し、デバイスに何をダウンロードする必要があるかを判断します。

メタデータによってパッケージの一部を一意に識別できるため、差分更新機構がパッケージの任意のバージョンからパッケージの他の任意のバージョンまで完全に機能します (ソース パッケージのバージョンがターゲット パッケージより低いことを想定しています)。

メタデータは、AppxBlockMap.xml ファイル (前述のメタデータ) に含まれます。 AppxBlockMap.xml ファイルは、パッケージ内のファイルに関する情報の 2 次元の一覧が含まれている XML ファイルです。 最初の次元はファイルに関する高レベルの詳細 (たとえば、名前およびサイズ) を示し、2 番目の次元はそのファイルの各 64 KB スライス ("ブロック") の SHA2-256 ハッシュ表現を提供します。

AppxBlockMap.xml ファイルのサンプルを次に示します。

<!--?xml version="1.0" encoding="UTF-8"?-->
<blockmap hashmethod="http://www.w3.org/2001/04/xmlenc#sha256" 
          xmlns="http://schemas.microsoft.com/appx/2010/blockmap">
  <file lfhsize="66" size="101188" name="asset1.jpg">
    <block hash="2bidNE0JyaO+FjaTpRe0g8HzUCblUf/cfBcTXiZR74c="/>
    <block hash="+jeFwKrGk5gw9wSICWsWRtEQXwcLC7af4EWS7DgrAkY="/>
  </file>
  <file lfhsize="61" size="108823" name="asset2.jpg">
    <block hash="u0+5S0GOzwyAfYx54tKycZyHRBYm2ybvq27dkIKqDsQ="/>
    <block hash="F9h0FRMetL6BNCszAYB0bgyx2KWN+dO1bls4Q9m267c="/>
  </file>
  ...
</blockmap>

最初のファイル (asset1.jpg) には、2 つのブロック ハッシュがあります。 最初のハッシュは、ファイルの最初の 64 KB ブロックを表します。2 番目のハッシュは、残りの 35 KB を表します (ファイルのサイズが 101,188 バイトの場合)。

更新中にこのファイルの 2 番目のブロックが変更されると、それを反映するようハッシュも更新されます。 ダウンロード コンポーネントによって 2 番目のブロックが取得され、変更されていない最初のブロックは古いパッケージから再利用されます。

大きな規模では、ファイル全体が変更されない場合 (変更されないブロックの完全なセットによって決定されます)、そのファイルを既存のパッケージから再利用して時間とリソースを節約できます。

アプリの更新プログラムの制約

更新は同じパッケージ ファミリ内で実行される

パッケージ ファミリ名は、パッケージ名と発行元で構成されます。 更新できるようにするには、新しいパッケージのメタデータを、以前にインストールしたパッケージと同じにする必要があります。 パッケージ ファミリ名の例を次に示します: Contoso.ContosoApp_8wekyb3d8bbwe

アプリの更新によってより高いバージョンにインクリメントする必要がある

一般に、アプリの更新プログラムでは、新しいパッケージのバージョンを現在のものよりも高くする必要があります。 アプリの更新プロセスでは、既定で下位バージョンのパッケージをインストールすることはできません。 Windows 10 バージョン 1809 以降、更新の引数の一部として上書きスイッチが提供されている場合は、ForceUpdateToAnyVersion を使用して、より低いバージョンのパッケージをインストールすることができます。 現在、PowerShell で PackageManager APIEnterpriseModernAppManagement CSP 経由で ForceUpdateFromAnyVersion オプションを使用して利用することも、AppInstaller ファイルで利用することもできます。

注意

Windows ストアのアプリで ForceUpdateToAnyVersion を使用すると、Windows Update は最新の該当するバージョンに自動的に更新されます。

アプリの更新プログラム パッケージはさまざまなアーキテクチャを備えることができる

現在インストールされているアプリ パッケージに対する更新プログラム パッケージは、新しいアーキテクチャが展開先の OS でサポートされている限り、異なるアーキテクチャにすることができます。 次に、例を示します。x64 Windows 10 デバイスに x86 バージョンの MyFavApp (v1.0.0.0) がインストールされていて、更新プログラム パッケージ (v2.0.0.0) が x64 バージョンの場合: MyFavApp (1.0.0.0) は MyFavApp (v2.0.0.0) に正常に更新されます。

パッケージは MSIX から MSIXbundle に更新できる

更新プログラム パッケージは MSIX パッケージから MSIXbundle パッケージに変更できますが、その逆はできません。 MSIXbundle がインストールされている場合、パッケージの更新プログラムはバンドルのままである必要があります。

差分更新テクノロジの最適化

差分更新テクノロジが最大限に最適化されるようにするための方法はいくつかあります。

  • パッケージ内のファイルを小さく保つ - これにより、ファイル全体に影響を与えるような変更が必要になった場合でも、更新プログラムを小さいままにすることができます。
  • 可能であれば、ファイルへの変更を追加的にする - 追加的な変更にすることで、変更されたそれらのブロックのみがエンド ユーザーのデバイスにダウンロードされるようになります。
  • 可能であれば、ファイルへの変更を 64 KB ブロックに収める - アプリのファイルが大きく、そのファイルの途中に変更を加える必要がある場合は、ブロックのセットに変更を含めると非常に役立ちます。