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

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

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

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

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

Полное обновление — это пакет 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-пакета для нескольких устройств с разными артикулами. Для этого необходимо настроить целевые устройства на использование динамических отпечатков и обновить метаданные OTA (с помощью инструментов OTA), включив имя устройства и отпечаток в записи условий до и после.

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

Формат 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.