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

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

О товарных позициях

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

SKU = <product><device><modifierA><modifierB><modifierC>
  • modifierA обозначает уровень устройства (например, Pro, Premium или Plus).
  • modifierB обозначает вариант аппаратной части (например, радио).
  • modifierC обозначает регион, который может быть общим (например, Северная Америка, Европа, Ближний Восток и Африка или Китай) или специфическим для конкретной страны или языка (например, Япония, Англия или Китай).

Многие производители используют один образ для нескольких артикулов, а затем определяют окончательное название продукта и отпечаток устройства во время выполнения после загрузки устройства. Этот процесс упрощает разработку платформы, позволяя устройствам с незначительными изменениями, но разными названиями продуктов, использовать общие образы (например, 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, предназначенного для устройства 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 определяется свойством build объекта 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.