Вы можете использовать инструмент 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 или ниже передайте параметру 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 для нескольких устройств с разными SKU. Для этого требуется настроить целевые устройства для использования динамических отпечатков пальцев и обновить метаданные 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.