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

Мы оптимизировали обновление современных пакетов приложений Windows, чтобы обеспечить скачивание только измененных частей существующего приложения Windows.

Метаданные в файле AppxBlockMap.xml

Не вдаваясь в подробности, при создании пакета, создается часть метаданных и сохраняется в файле пакета приложения (с расширением .appx или .msix), что позволяет Windows однозначно идентифицировать части пакета. При обновлении пакета приложения Windows использует файл метаданных для сравнения старого пакета c новым и определения частей, которые нужно скачать на устройство.

Так как метаданные позволяют однозначно идентифицировать части пакета, это означает, что механизм выборочного обновления с любой версии пакета до любой другой версии пакета полностью работает (предполагается, что исходный пакет имеет более раннюю версию, чем целевой пакет).

Упомянутые выше метаданные содержатся в файле AppxBlockMap.xml. Файл AppxBlockMap.xml представляет собой XML-файл, содержащий двумерный список сведений о файлах в пакете. В первом измерении размещаются общие сведения о файле (например, имя и размер), а во втором измерении — хэш-код SHA2-256 каждого среза (размером 64 КБ) этого файла ("блок").

Ниже приведен пример файла 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) имеет два хэш-кода блоков. Первый хэш-код представляет первый блок (64 КБ) файла, а второй хэш-код — остальные 35 КБ с учетом того, что размер этого файла составляет 101188 байта.

Если при обновлении вносятся изменения во второй блок этого файла, хэш также обновляется соответствующим образом. Компонент скачивания извлекает второй блок и повторно использует первый блок без изменений из старого пакета.

По большому счету, если весь файл не изменен (то есть весь набор блоков не изменен), он может повторно использоваться из существующего пакета для экономии времени и ресурсов.

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

Обновления выполняются в том же семействе пакетов

Имя семейства пакетов состоит из имени и издателя пакета. Для выполнения обновления новые метаданные пакета должны быть такими же, как у ранее установленного пакета. Ниже представлен пример для имени семейства пакетов: Contoso.ContosoApp_8wekyb3d8bbwe.

Обновления приложения должны иметь больший номер версии

Как правило, чтобы обновить приложение, обычно требуется, чтобы у новой версии пакета был больший номер, чем у текущей. При обновлении приложения по умолчанию нельзя устанавливать пакеты более ранних версий. Начиная с Windows 10, версия 1809, вы можете использовать ForceUpdateToAnyVersion, чтобы устанавливать пакеты более ранних версий, если параметр переопределения предоставляется как часть аргументов обновления. В настоящее время он доступен в PowerShell при использовании параметра ForceUpdateFromAnyVersion, API PackageManager, поставщика служб конфигурации EnterpriseModernAppManagement и файла AppInstaller.

Примечание

Если вы используете ForceUpdateToAnyVersion для приложения из Microsoft Store, то Центр обновления Windows автоматически выполнит обновление до последней применимой версии.

Пакет обновления приложения может иметь другую архитектуру

Пакет обновления для установленного в этот момент пакета может иметь другую архитектуру, так как новая архитектура поддерживается в операционной системе, где развертывается пакет. Например: если вы установили 32-разрядную версию MyFavApp 1.0.0.0 на устройстве с 64-разрядной версией Windows 10, MyFavApp 1.0.0.0 успешно обновится до MyFavApp 2.0.0.0.

Пакеты MSIX можно обновить до MSIXbundle

Пакеты обновления можно обновить с MSIX на MSIXbundle, но не наоборот. Если устанавливается MSIXbundle, в результате обновления пакета должен остаться набор пакетов.

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

Обеспечить максимальную оптимизацию для технологии выборочного обновления можно несколькими способами.

  • Храните небольшие файлы в пакете. Так вы сможете гарантировать, что при изменении не будут затронуты все файлы, а обновление не будет большим.
  • По возможности сделайте изменения для файлов добавочными, чтобы устройства пользователей скачивали только измененные блоки.
  • Постарайтесь поместить изменения для файлов в блоки, размером 64 КБ. Если в приложении есть большие файлы и вам нужно внести изменение в середину файла, будет значительно эффективнее поместить изменения в набор блоков.