При разработке и выпуске новых устройств поставщики могут определить и объявить целевую версию FCM в манифесте устройства (DM). При обновлении образа поставщика для старых устройств поставщики могут реализовать новые версии HAL и увеличить целевую версию FCM.
Разработка новых устройств
При определении целевой версии FCM устройства для новых устройств:
- Оставьте
DEVICE_MANIFEST_FILE
иPRODUCT_ENFORCE_VINTF_MANIFEST
неопределенными. - Реализуйте HAL для целевой версии FCM.
- Напишите правильный файл манифеста устройства.
- Запишите целевую версию FCM в файл манифеста устройства.
- Установите
DEVICE_MANIFEST_FILE
. - Установите для
PRODUCT_ENFORCE_VINTF_MANIFEST
значениеtrue
.
Выпуск новых устройств
Когда новое устройство выпускается, его первоначальная целевая версия FCM должна быть определена и объявлена в манифесте устройства как атрибут « target-level
» в элементе <manifest>
верхнего уровня.
Например, устройства, запускаемые с Android 9, должны иметь целевую версию FCM, равную 3 (более поздняя версия, доступная в настоящее время). Чтобы объявить это в манифесте устройства:
<manifest version="1.0" type="device" target-level="3"> <!-- ... --> </manifest>
Обновление образа поставщика
При обновлении образа поставщика для старого устройства поставщики могут реализовать новые версии HAL и увеличить целевую версию FCM.
Обновление HAL
Во время обновления образа поставщика поставщики могут внедрять новые версии HAL при условии, что имя HAL, имя интерфейса и имя экземпляра совпадают. Например:
- Устройства Google Pixel 2 и Pixel 2 XL, выпущенные с Target FCM версии 2, в которой реализован необходимый звук 2.0 HAL
android.hardware.audio@2.0::IDeviceFactory/default
. - Для аудио 4.0 HAL, выпущенного с Android 9, устройства Google Pixel 2 и Pixel 2 XL могут использовать полный OTA для обновления до 4.0 HAL, который реализует
android.hardware.audio@4.0::IDeviceFactory/default
. - Несмотря на то, что в
compatibility_matrix.2.xml
указано только аудио 2.0, требование к образу поставщика с Target FCM Version 2 было ослаблено, поскольку платформа Android 9 (FCM Version 3) рассматривает аудио 4.0 как замену аудио 2.0 HAL с точки зрения функциональности. .
Подводя итог, учитывая, что для compatibility_matrix.2.xml
требуется аудио 2.0, а для compatibility_matrix.3.xml
требуется аудио 4.0, требования следующие:
Версия FCM (Система) | Целевая версия FCM (поставщик) | Требования |
---|---|---|
2 (8,1) | 2 (8,1) | Аудио 2.0 |
3 (9) | 2 (8,1) | Аудио 2.0 или 4.0 |
3 (9) | 3 (9) | Аудио 4.0 |
Обновление целевой версии FCM
Во время обновления образа поставщика поставщики также могут увеличить целевую версию FCM, чтобы указать целевую версию FCM, с которой может работать обновленный образ поставщика. Чтобы изменить целевую версию FCM устройства, поставщики должны:
- Реализуйте все новые требуемые версии HAL для целевой версии FCM.
- Измените версии HAL в файле манифеста устройства.
- Измените целевую версию FCM в файле манифеста устройства.
- Удалите устаревшие версии HAL.
Например, устройства Google Pixel и Pixel XL запущены с Android 7.0, поэтому их целевая версия FCM должна быть как минимум устаревшей. Однако манифест устройства объявляет целевую версию FCM 2, поскольку образ поставщика был обновлен в соответствии с compatibility_matrix.2.xml
:
<manifest version="1.0" type="device" target-level="2">
Если поставщики не реализуют все необходимые новые версии HAL или не удаляют устаревшие версии HAL, целевая версия FCM не может быть обновлена.
Например, устройства Google Pixel 2 и Pixel 2 XL имеют Target FCM версии 2. Хотя они реализуют некоторые HAL, требуемые compatibility_matrix.3.xml
(например, аудио 4.0, здоровье 2.0 и т. д.), они не удаляют android.hardware.radio.deprecated@1.0
. android.hardware.radio.deprecated@1.0
, который устарел в FCM версии 3 (Android 9). Следовательно, эти устройства не могут обновить целевую версию FCM до 3.
Обязательные требования к ядру во время OTA
Обновление устройств с Android 9 или ниже
На устройствах с Android 9 или более ранней версии убедитесь, что выбраны следующие CL:
Эти изменения вводят флаг сборки PRODUCT_OTA_ENFORCE_VINTF_KERNEL_REQUIREMENTS
и не устанавливают флаг для устройств, запущенных с Android 9 или более ранней версией.
- При обновлении до Android 10 клиенты OTA на устройствах под управлением Android 9 или более ранней версии неправильно проверяют требования ядра в пакете OTA. Эти изменения необходимы для исключения требований ядра из сгенерированного пакета OTA.
- При обновлении до Android 11 необязательно устанавливать флаг сборки
PRODUCT_OTA_ENFORCE_VINTF_KERNEL_REQUIREMENTS
для проверки совместимости VINTF при создании пакета обновления.
Дополнительные сведения об этом флаге сборки см. в разделе Обновление устройств с Android 10 .
Обновление устройств с Android 10
В Android 10 представлен новый флаг сборки PRODUCT_OTA_ENFORCE_VINTF_KERNEL_REQUIREMENTS
. Для устройств, запущенных с Android 10, для этого флага автоматически устанавливается значение true
. Когда для флага установлено значение true
, сценарий извлекает версию ядра и конфигурации ядра из установленного образа ядра.
- При обновлении до Android 10 пакет обновления OTA содержит версию ядра и конфигурацию. Клиенты OTA на устройствах под управлением Android 10 читают эту информацию, чтобы проверить совместимость.
- При обновлении до Android 11 генератор пакетов OTA считывает версию и конфигурацию ядра для проверки совместимости.
Если сценарию не удается извлечь эту информацию для вашего образа ядра, выполните одно из следующих действий:
- Отредактируйте сценарий, чтобы он поддерживал формат вашего ядра и внес свой вклад в AOSP.
- Установите
BOARD_KERNEL_VERSION
на версию ядра иBOARD_KERNEL_CONFIG_FILE
на путь к собранному файлу конфигурации ядра.config
. Обе переменные должны обновляться при обновлении образа ядра. - Либо установите для
PRODUCT_OTA_ENFORCE_VINTF_KERNEL_REQUIREMENTS
значениеfalse
, чтобы пропустить проверку требований ядра. Это не рекомендуется, поскольку любая несовместимость скрыта и обнаруживается только при запуске тестов VTS после обновления.
Вы можете просмотреть исходный код скрипта извлечения информации о ядре extract_kernel.py
.