Как создавать пакеты OTA

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

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

В Android 8.0 прекращена поддержка пакетов беспроводного обновления на основе файлов для устройств, не поддерживающих A/B-обновления. Вместо этого необходимо использовать пакеты беспроводного обновления на основе блоков. Чтобы создать пакеты 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 МБ).

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

Чтобы пользователям было удобнее, предлагайте полное обновление после каждых трех-четырех частичных. Это помогает пользователям быстро перейти на последнюю версию и избежать длительной установки последовательных обновлений.

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

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

О кодах SKU

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

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

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