Создание пакетов OTA

Вы можете использовать инструмент ota_from_target_files , предоставленный в build/make/tools/releasetools , для создания полных и добавочных пакетов OTA для устройств, которые используют системные обновления A/B или системные обновления без A/B . Инструмент использует в качестве входных данных файл target-files.zip , созданный системой сборки Android.

Для устройств под управлением Android 11 или более поздней версии вы можете создать один пакет OTA для нескольких устройств с разными SKU. Для этого требуется настроить целевые устройства для использования динамических отпечатков пальцев и обновить метаданные OTA , чтобы включить имя устройства и отпечаток пальца в записи до и после условия.

В Android 8.0 не рекомендуются пакеты OTA на основе файлов для устройств, отличных от A/B, которые вместо этого должны использовать пакеты OTA на основе блоков . Чтобы создать блочные OTA-пакеты или устройства под управлением Android 7.x или более ранней версии, передайте параметр --block в параметр ota_from_target_files .

Сборка полных обновлений

Полное обновление — это OTA-пакет, содержащий все конечное состояние устройства (системный, загрузочный и разделы восстановления). Пока устройство способно получать и применять пакет, пакет может установить сборку независимо от текущего состояния устройства. Например, следующие команды используют инструменты выпуска для создания архива target-files.zip для устройства tardis .

. build/envsetup.sh && lunch tardis-eng
mkdir dist_output
make dist DIST_DIR=dist_output

make dist создает полный пакет OTA (в $OUT ). Результирующий файл .zip содержит все необходимое для создания пакетов OTA для устройства tardis . Вы также можете собрать ota_from_target_files как двоичный файл Python и вызывать его для создания полных или добавочных пакетов.

ota_from_target_files dist_output/tardis-target_files.zip ota_update.zip

Путь ota_from_target_files устанавливается в $PATH , а полученный двоичный файл python находится в каталоге out/ .

ota_update.zip готов к отправке на тестовые устройства (все подписано тестовым ключом). Для пользовательских устройств создайте и используйте собственные закрытые ключи, как описано в разделе Подписание сборок для выпуска .

Создание добавочных обновлений

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

Вы можете установить добавочный пакет обновления только на устройства, для которых исходная сборка использовалась при создании пакета. Чтобы собрать добавочное обновление, вам понадобится файл target_files.zip из предыдущей сборки (тот, который вы хотите обновить), а также файл target_files.zip из новой сборки. Например, следующие команды используют инструменты выпуска для создания добавочного обновления для устройства tardis .

ota_from_target_files -i PREVIOUS-tardis-target_files.zip dist_output/tardis-target_files.zip incremental_ota_update.zip

Эта сборка очень похожа на предыдущую, а пакет добавочного обновления ( incremental_ota_update.zip ) намного меньше соответствующего полного обновления (около 1 МБ вместо 60 МБ).

Распространяйте добавочный пакет только на устройства, на которых запущена точно такая же предыдущая сборка, которая использовалась в качестве отправной точки добавочного пакета. Вы должны прошить образы в PREVIOUS-tardis-target_files.zip или PREVIOUS-tardis-img.zip (оба созданы с помощью make dist , которые должны быть прошиты с помощью fastboot update ), а не в каталоге PRODUCT_OUT (созданные с помощью make , которые будет прошит с помощью fastboot flashall ). Попытка установить инкрементный пакет на устройство с какой-либо другой сборкой приводит к ошибке установки. При сбое установки устройство остается в том же рабочем состоянии (работает на старой системе); пакет проверяет предыдущее состояние всех файлов, которые он обновляет, прежде чем прикасаться к ним, поэтому устройство не находится в полуобновленном состоянии.

Для наилучшего взаимодействия с пользователем предлагайте полное обновление для каждых 3–4 добавочных обновлений. Это помогает пользователям получить последнюю версию и избежать длительной последовательности установки добавочных обновлений.

Создание пакетов OTA для нескольких SKU

Android 11 или более поздней версии поддерживает использование одного пакета OTA для нескольких устройств с разными SKU. Для этого требуется настроить целевые устройства для использования динамических отпечатков пальцев и обновить метаданные OTA (с помощью инструментов OTA), чтобы включить имя устройства и отпечаток пальца в записи до и после условия.

О SKU

Формат SKU представляет собой вариант комбинированных значений параметров сборки и обычно является необъявленным подмножеством текущих параметров build_fingerprint . OEM-производители могут использовать любую комбинацию одобренных CDD параметров сборки для SKU, а также использовать один образ для этих SKU. Например, следующий артикул имеет несколько вариантов:

SKU = <product><device><modifierA><modifierB><modifierC>
  • modifierA — это уровень устройства (например, Pro, Premium или Plus).
  • modifierB — аппаратная вариация (например, радио)
  • modifierC — это регион, который может быть общим (например, NA, EMEA или CHN) или специфичным для страны или языка (например, JPN, ENG или CHN).

Многие OEM-производители используют один образ для нескольких SKU, а затем получают окончательное название продукта и отпечаток устройства во время выполнения после загрузки устройства. Этот процесс упрощает процесс разработки платформы, позволяя устройствам с незначительными настройками, но с разными названиями продуктов, использовать общие образы (например, tardis и tardispro ).

Использование динамических отпечатков пальцев

Отпечаток — это определенное объединение параметров сборки, таких как ro.product.brand , ro.product.name и ro.product.device . Отпечаток устройства получается из отпечатка системного раздела и используется в качестве уникального идентификатора изображений (и байтов), работающих на устройстве. Чтобы создать динамический отпечаток пальца, используйте динамическую логику в файле build.prop устройства, чтобы получить значение переменных загрузчика во время загрузки устройства, а затем используйте эти данные для создания динамического отпечатка пальца для этого устройства.

Например, чтобы использовать динамические отпечатки пальцев для устройств tardis и tardispro , обновите следующие файлы, как показано ниже.

  • Обновите файл odm/etc/build_std.prop , чтобы он содержал следующую строку.

    ro.odm.product.device=tardis
    
  • Обновите файл odm/etc/build_pro.prop , чтобы он содержал следующую строку.

    ro.odm.product.device=tardispro
    
  • Обновите файл odm/etc/build.prop , добавив в него следующие строки.

    ro.odm.product.device=tardis
    import /odm/etc/build_${ro.boot.product.hardware.sku}.prop
    

Эти строки динамически устанавливают значения имени устройства, отпечатка пальца и ro.build.fingerprint на основе значения свойства загрузчика ro.boot.product.hardware.sku (которое доступно только для чтения).

Обновление метаданных пакета OTA

Пакет OTA содержит файл метаданных ( META-INF/com/android/metadata ), который описывает пакет, включая предварительное и постусловие пакета OTA. Например, следующий код представляет собой файл метаданных для пакета OTA, нацеленного на устройство tardis .

post-build=google/tardis/tardis:11/RP1A.200521.001/6516341:userdebug/dev-keys
post-build-incremental=6516341
post-sdk-level=30
post-security-patch-level=2020-07-05
post-timestamp=1590026334
pre-build=google/tardis/tardis:11/RP1A.200519.002.A1/6515794:userdebug/dev-keys
pre-build-incremental=6515794
pre-device=tardis

Значения pre-device , pre-build-incremental и pre-build определяют состояние, в котором должно находиться устройство, прежде чем можно будет установить пакет OTA. Значения post-build-incremental и post-build определяют ожидаемое состояние устройства после установки пакета OTA. Значения pre- и post- -полей получены из следующих соответствующих свойств построения.

  • Значение pre-device получается из свойства сборки ro.product.device .
  • Значения pre-build-incremental и post-build-incremental получаются из свойства сборки ro.build.version.incremental .
  • Значения pre-build и post-build получаются из свойства сборки ro.build.fingerprint .

На устройствах под управлением Android 11 или более поздней версии вы можете использовать флаг --boot_variable_file в инструментах OTA, чтобы указать путь к файлу, содержащему значения переменных среды выполнения, используемых при создании динамического отпечатка пальца устройства. Затем данные используются для обновления метаданных OTA, чтобы включить имя устройства и отпечаток пальца в pre- и post- условия (с использованием вертикальной черты | в качестве разделителя). Флаг --boot_variable_file имеет следующий синтаксис и описание.

  • Синтаксис: --boot_variable_file <path>
  • Описание: Указывает путь к файлу, содержащему возможные значения свойств ro.boot.* . Используется для вычисления возможных отпечатков времени выполнения, когда некоторые свойства ro.product.* переопределяются оператором импорта. Файл ожидает одно свойство на строку, где каждая строка имеет следующий формат: prop_name=value1,value2 .

Например, если свойство имеет ro.boot.product.hardware.sku=std,pro , метаданные OTA для устройств tardis и tardispro будут такими, как показано ниже.

post-build=google/tardis/tardis:11/<suffix>|google/tardis/tardispro:11/<suffix>
pre-build=google/tardis/tardis:11/<suffix>|google/tardis/tardispro:11/<suffix>
pre-device=tardis|tardispro

Для поддержки этой функциональности на устройствах под управлением Android 10 см. эталонную реализацию . Этот список изменений условно анализирует операторы import в файле build.prop , что позволяет распознавать переопределения свойств и отражать их в окончательных метаданных OTA.