Вы можете использовать инструмент 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.