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