Создание пакетов 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 имеет несколько вариантов:

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.