Разработка манифеста устройства

При разработке и выпуске новых устройств поставщики могут определять и объявлять целевую версию FCM в манифесте устройства (DM). При обновлении образа поставщика для старых устройств поставщики могут реализовать новые версии HAL и увеличить целевую версию FCM.

Разработка новых устройств.

При определении целевой версии FCM для новых устройств:

  1. Оставьте DEVICE_MANIFEST_FILE и PRODUCT_ENFORCE_VINTF_MANIFEST неопределенными.
  2. Реализуйте HAL для целевой версии FCM.
  3. Создайте правильный файл манифеста устройства.
  4. Запишите целевую версию FCM в файл манифеста устройства.
  5. Задайте значение DEVICE_MANIFEST_FILE.
  6. Задайте для параметра 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 были выпущены с целевой версией FCM 2, в которой реализован необходимый HAL аудио 2.0 android.hardware.audio@2.0::IDeviceFactory/default.
  • В аудиоинтерфейсе HAL 4.0, выпущенном с Android 9, устройства Google Pixel 2 и Pixel 2 XL могут использовать полное OTA-обновление для перехода на HAL 4.0, в котором реализован android.hardware.audio@4.0::IDeviceFactory/default.
  • Хотя в compatibility_matrix.2.xml указано, что требуется только аудио HAL 2.0, требование к образу поставщика с целевой версией FCM 2 было ослаблено, поскольку в платформе Android 9 (версия FCM 3) аудио HAL 4.0 считается функциональным аналогом аудио HAL 2.0.

Подведем итог. Поскольку для 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 на устройстве, поставщикам необходимо:

  1. Реализуйте все новые обязательные версии HAL для целевой версии FCM.
  2. Измените версии HAL в файле манифеста устройства.
  3. Измените целевую версию FCM в файле манифеста устройства.
  4. Удалите устаревшие версии 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 используется целевая версия FCM 2. Хотя они реализуют некоторые HAL, необходимые для compatibility_matrix.3.xml (например, audio 4.0, health 2.0 и т. д.), они не удаляют android.hardware.radio.deprecated@1.0, который не поддерживается в FCM версии 3 (Android 9). Поэтому эти устройства не могут обновить целевую версию FCM до 3.

Обязательные требования к ядру при беспроводном обновлении

Обновление устройств с 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 на устройствах с 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.