Обновления пакетов приложенийApp package updates

Мы оптимизировали обновление современных пакетов приложений Windows, чтобы обеспечить скачивание только измененных частей существующего приложения Windows.Updating modern Windows app packages is optimized to ensure that only the essential changed bits of the app are downloaded to update an existing Windows app.

Метаданные в файле AppxBlockMap.xmlMetadata in the AppxBlockMap.xml file

Не вдаваясь в подробности, при создании пакета, создается часть метаданных и сохраняется в файле пакета приложения (с расширением .appx или .msix), что позволяет Windows однозначно идентифицировать части пакета.At a high level, during package creation, a piece of metadata is created and stored in the app package file (.appx or .msix) which allows parts of the package to be uniquely identified by Windows. При обновлении пакета приложения Windows использует файл метаданных для сравнения старого пакета c новым и определения частей, которые нужно скачать на устройство.When updating an app package, Windows uses the metadata file to compare the old package to the new package and determine what needs to be downloaded to the device.

Так как метаданные позволяют однозначно идентифицировать части пакета, это означает, что механизм выборочного обновления с любой версии пакета до любой другой версии пакета полностью работает (предполагается, что исходный пакет имеет более раннюю версию, чем целевой пакет).Since the metadata allows parts of the package to be uniquely identified, this means the differential update machinery fully functions from any version of a package to any other version of a package (assuming the source package has a lower version than the target package).

Упомянутые выше метаданные содержатся в файле AppxBlockMap.xml.The metadata is contained in the AppxBlockMap.xml file (the aforementioned metadata). Файл AppxBlockMap.xml представляет собой XML-файл, содержащий двумерный список сведений о файлах в пакете.The AppxBlockMap.xml file is an XML file that contains a two dimensional list of information about files in the package. В первом измерении размещаются общие сведения о файле (например, имя и размер), а во втором измерении — хэш-код SHA2-256 каждого среза (размером 64 КБ) этого файла ("блок").The first dimension lays out high level details on the file (e.g., name and size) and the second dimension provides SHA2-256 hash representations of each 64KB slice of that file (the "block").

Ниже приведен пример файла AppxBlockMap.xml.Here's a sample of an AppxBlockMap.xml file.

<!--?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) имеет два хэш-кода блоков. Первый хэш-код представляет первый блок (64 КБ) файла, а второй хэш-код — остальные 35 КБ с учетом того, что размер этого файла составляет 101188 байта.The first hash represents the first 64KB block of the file and the second hash represents the remaining 35KB - given the file is 101188 bytes.

Если при обновлении вносятся изменения во второй блок этого файла, хэш также обновляется соответствующим образом.During an update, if the second block of that file is modified, the hash is also updated to reflect that. Компонент скачивания извлекает второй блок и повторно использует первый блок без изменений из старого пакета.The download component pulls down the second block and reuses the first unchanged block from the old package.

По большому счету, если весь файл не изменен (то есть весь набор блоков не изменен), он может повторно использоваться из существующего пакета для экономии времени и ресурсов.On a larger scale, if an entire file does not change (determined by a full set of blocks not changing), that file can be reused from the existing package, saving time and resources.

Ограничения на обновление приложенияApp update constraints

Обновления выполняются в том же семействе пакетовUpdates are performed within the same package family

Семейство пакетов состоит из имени и издателя пакета.The package family is comprised of the Package Name and Publisher. Для выполнения обновления новые метаданные пакета должны быть такими же, как у ранее установленного пакета.To be able to update, the new package metadata will need to be the same as the previously installed package.

Обновления приложения должны иметь больший номер версииApp updates must increment to a higher version

Как правило, чтобы обновить приложение, обычно требуется, чтобы у новой версии пакета был больший номер, чем у текущей.In general, app updates require the version of the new package to be higher than the current one. При обновлении приложения по умолчанию нельзя устанавливать пакеты более ранних версий.The app update process will not allow packages with lower versions to be installed by default. Начиная с Windows 10, версия 1809, вы можете использовать ForceUpdateToAnyVersion, чтобы устанавливать пакеты более ранних версий, если параметр переопределения предоставляется как часть аргументов обновления.Starting in Windows 10 version 1809, you can use ForceUpdateToAnyVersion to allow lower version packages to be installed when an override switch is provided as part of the update arguments. В настоящее время он доступен в PowerShell при использовании параметра ForceUpdateFromAnyVersion, API PackageManager, поставщика служб конфигурации EnterpriseModernAppManagement и файла AppInstaller.It is currently available in PowerShell using the ForceUpdateFromAnyVersion option, via PackageManager API, EnterpriseModernAppManagement CSP and in the AppInstaller file.

Примечание

Если вы используете ForceUpdateToAnyVersion для приложения из Microsoft Store, то Центр обновления Windows автоматически выполнит обновление до последней применимой версии.If you use ForceUpdateToAnyVersion on an app from the Windows Store, Windows Update will automatically update the to the latest applicable version.

Пакет обновления приложения может иметь другую архитектуруApp update package can have a different architecture

Пакет обновления для установленного в этот момент пакета может иметь другую архитектуру, так как новая архитектура поддерживается в операционной системе, где развертывается пакет.The update package to the currently installed app package can be of a different architecture as long as the new architecture is supported on the OS where it is being deployed to. Например: если вы установили 32-разрядную версию MyFavApp 1.0.0.0 на устройстве с 64-разрядной версией Windows 10, MyFavApp 1.0.0.0 успешно обновится до MyFavApp 2.0.0.0.For example: If you have x86 version of MyFavApp(v1.0.0.0) installed on a x64 Windows 10 device and the update package(v2.0.0.0) is x64 version: MyFavApp(1.0.0.0) will be updated to MyFavApp(v2.0.0.0) successfully.

Пакеты MSIX можно обновить до MSIXbundlePackages can update from an MSIX to an MSIXbundle

Пакеты обновления можно обновить с MSIX на MSIXbundle, но не наоборот.An update package can go from MSIX package to an MSIXbundle package but not vice-versa. Если устанавливается MSIXbundle, в результате обновления пакета должен остаться набор пакетов.When an MSIXbundle is installed, the package update will need to remain a bundle.

Оптимизация технологии выборочного обновленияOptimize differential update technology

Обеспечить максимальную оптимизацию для технологии выборочного обновления можно несколькими способами.There are a few ways to ensure that the differential update technology is optimized to the max.

  • Храните небольшие файлы в пакете. Так вы сможете гарантировать, что при изменении не будут затронуты все файлы, а обновление не будет большим.Keep files in the package small - doing this will ensure that if a change is needed that would impact the full file, the update would still be small.
  • По возможности сделайте изменения для файлов добавочными, чтобы устройства пользователей скачивали только измененные блоки.Changes to files should be additive if possible - additive changes will ensure that end-user devices only download those changed blocks.
  • Постарайтесь поместить изменения для файлов в блоки, размером 64 КБ. Если в приложении есть большие файлы и вам нужно внести изменение в середину файла, будет значительно эффективнее поместить изменения в набор блоков.Changes to files should be contained to 64KB blocks if possible - if your app does have large files and requires changes to the middle of a file, containing changes to a set of blocks will help significantly.