В выпуске фреймворка Android есть несколько матриц совместимости фреймворка (FCM), по одной для каждой версии Target FCM, которую можно обновить. В этих матрицах указано, что может использовать фреймворк, и требования к версии Target FCM. В рамках жизненного цикла FCM Android прекращает поддержку и удаляет HAL-интерфейсы HIDL, а затем изменяет файлы FCM, чтобы отразить статус версии HAL.
Чтобы включить OTA-обновления только фреймворка в своих экосистемах, партнерам, которые расширяют интерфейсы поставщика, также следует прекратить поддержку и удалить HAL-уровни HIDL, используя те же методы.
Терминология
- Матрица совместимости фреймворков (FCM)
- XML-файл, в котором указаны требования к фреймворку для совместимых реализаций поставщиков. Матрица совместимости имеет версию, и новая версия замораживается для каждого выпуска фреймворка. Каждый выпуск фреймворка содержит несколько FCM.
- Версии платформы FCM (SF)
- Набор всех версий FCM в выпуске фреймворка. Спецификация может работать с любой реализацией поставщика, которая соответствует одной из этих FCM.
- Версия FCM (F)
- Самая высокая версия среди всех FCM в выпуске фреймворка.
- Целевая версия FCM (V)
- Целевая версия FCM (из SF), явно объявленная в манифесте устройства, которой соответствует реализация поставщика. Реализация поставщика должна быть создана на основе опубликованного FCM, хотя в манифесте устройства могут быть указаны более новые версии HAL.
- Версия HAL
- Версия HAL имеет формат
foo@x.y, гдеfoo– это название HAL, аx.y– конкретная версия, напримерnfc@1.0,keymaster@3.0(корневой префикс, напримерandroid.hardware, в этом документе опущен). - Манифест устройства
- XML-файлы, в которых указано, какие версии HAL предоставляет устройство для интерфейса поставщика, включая образы поставщика и ODM. Содержимое манифеста устройства ограничено целевой версией FCM устройства, но может содержать HAL, которые строго новее, чем FC, соответствующие версии V. .
- Уровни абстракции оборудования
- HAL, указанные в манифесте устройства и матрице совместимости фреймворка (FCM).
- Матрица совместимости устройств (DCM)
- XML-файл, в котором указаны требования поставщика к реализации фреймворка. Каждое устройство содержит один DCM.
- Манифест фреймворка
- XML-файл, в котором указано, какие версии HAL предоставляет фреймворк для интерфейса поставщика, включая образы system, system_ext и product. HAL в манифесте фреймворка динамически отключаются в соответствии с целевой версией FCM устройства.
- HAL фреймворка
- HAL, указанные как предоставленные в манифесте фреймворка и в матрице совместимости устройств (DCM).
Жизненный цикл FCM в базе кода
В этом документе описывается жизненный цикл FCM в абстрактном виде. Чтобы посмотреть поддерживаемые манифесты, перейдите по ссылке hardware/interfaces/compatibility_matrices/compatibility_matrix.<FCM>.xml, где FCM можно найти в system/libvintf/include/vintf/Level.h.
Устройство с соответствующей конечной версией Android должно иметь значение FCM, большее или равное эквивалентному уровню. Например, устройство с Android 12 обычно имеет уровень FCM 6, но может поддерживать уровень FCM 7 или выше. Это меняет поведение Android и требует использования более новых API поставщиков, как указано в матрицах совместимости. Для Android 16 поддерживаются следующие уровни:
| FCM | Версия Android |
|---|---|
| 6 | Android 12/S |
| 7 | Android 13/T |
| 8 | Android 14/U |
| 202404 | Android 15/V |
| 202504 | Android 16/B |
Уровень FCM равен уровню API поставщика или выше.
Когда было объявлено о Project Treble, образы системы Android создавались так, чтобы быть обратно совместимыми с тремя предыдущими версиями реализаций поставщиков (всего четыре). Чтобы поддерживать устройства с более длительным сроком службы, этот период был увеличен до текущей и шести предыдущих версий FCM (всего семь) для 202404 и более поздних версий.
Когда Android прекращает поддержку определенного уровня FCM, он по-прежнему поддерживается на существующих устройствах. Устройствам, предназначенным для более низких уровней FCM, неявно разрешено использовать HAL, перечисленные на более высоких уровнях FCM, если они доступны в ветке.
Разработка в новой версии FCM
В Android версия FCM увеличивается при каждом выпуске платформы (например, Android 8 и 8.1). В процессе разработки создается новый compatibility_matrix.F.xml, а существующий compatibility_matrix.f.xml (где f < F) больше не изменяется.
Чтобы начать разработку с использованием новой версии FCM F:
- Скопируйте последнюю версию
compatibility_matrix.<F-1>.xmlвcompatibility_matrix.F.xml. - Измените значение атрибута
levelв файле наF. - Добавьте соответствующие правила сборки, чтобы установить эту матрицу совместимости на устройство.
Как добавить новый HAL
При разработке, когда вы добавляете новый уровень абстракции оборудования (HAL) (например, Wi-Fi или NFC) в Android на текущей версии FCM F, добавьте HAL в compatibility_matrix.F.xml.
Например, в Android 8.1 появилась функция cas@1.0. Устройства с Android 8.1 могут реализовать этот HAL, поэтому в compatibility_matrix.F.xml (который во время разработки этой версии временно назывался compatibility_matrix.current.xml) была добавлена следующая запись:
<hal format="hidl">
<name>android.hardware.cas</name>
<version>1.0</version>
<interface>
<name>IMediaCasService</name>
<instance>default</instance>
</interface>
</hal>
Как обновить HAL (незначительное обновление)
Версии HAL, определенные с помощью AIDL, считаются промежуточными версиями HAL. У версий интерфейса HIDL есть major.minor версии, например 1.2.
Во время разработки, когда версия AIDL HAL обновляется с 2 до 3 при текущей версии FCM F, новая версия добавляется в запись HAL в compatibility_matrix.F.xml. Поле версии записи HAL принимает диапазоны, например 2-3.
Например, Android FCM F был представлен foo@3 как промежуточная версия обновления HAL. Более старая версия foo@2 используется для устройств, на которых настроен таргетинг на более старые FCM, а более новая версия foo@3 – для устройств, на которых настроен таргетинг на Android FCM F. В более ранних версиях FCM до версии 2 запись выглядит следующим образом:
<hal format="aidl">
<name>foo</name>
<version>2</version>
<interface>
<name>IFoo</name>
<instance>default</instance>
</interface>
</hal>
Эта запись была скопирована в compatibility_matrix.F.xml и изменена для поддержки версии 3 следующим образом:
<hal format="aidl">
<name>foo</name>
<version>2-3</version>
<interface>
<name>IFoo</name>
<instance>default</instance>
</interface>
</hal>
Обновление HAL (крупное)
Во время разработки, когда HAL получает обновление основной версии в текущей версии FCM F, новая основная версия x.0 добавляется в compatibility_matrix.F.xml со следующими настройками:
- Только версия
x.0, если устройства, поставляемые сV = F, должны запускаться сx.0. - С более старыми основными версиями в том же теге
<hal>, если устройства, поставляемые сV = F, могут запускаться с более старой основной версией.
Например, в версии FCM F представлена foo@2.0 как основное обновление HAL 1.0, а HAL 1.0 объявлен устаревшим. Более старая версия, foo@1.0, используется для устройств, на которых установлены предыдущие версии FCM. Устройства, на которых установлена версия FCM F и которые поддерживают HAL, должны предоставлять новую версию 2.0. В этом примере предыдущие версии FCM содержат следующую запись:
<hal format="hidl">
<name>foo</name>
<version>1.0</version>;
<interface>
<name>IFoo</name>
<instance>default</instance>
</interface>
</hal>
Скопируйте эту запись в compatibility_matrix.F.xml и измените ее следующим образом:
<hal format="hidl">
<name>foo</name>
<version>2.0</version>
<interface>
<name>IFoo</name>
<instance>default</instance>
</interface>
</hal>
Ограничения:
- Поскольку HAL версии 1.0 отсутствует в
compatibility_matrix.F.xml, устройства, предназначенные для FCM версииF, не должны предоставлять HAL версии 1.0 (поскольку этот HAL считается устаревшим). - Поскольку HAL 1.0 присутствует в более старых версиях FCM, фреймворк может работать с HAL 1.0, поэтому он обратно совместим со старыми устройствами, на которых установлены более старые версии FCM.
Новые версии FCM
Выпуск версии FCM в системном разделе выполняется только Google в рамках выпуска AOSP и включает следующие этапы:
- Убедитесь, что у элемента
compatibility_matrix.F.xmlесть атрибутlevel="F". - Убедитесь, что все устройства собраны и загружены.
- Обновите тесты VTS, чтобы устройства, выпущенные с последней версией фреймворка (на основе уровня API для доставки), имели целевую версию FCM
V >= F. - Опубликуйте файл в AOSP.
Например, тесты VTS гарантируют, что устройства, выпущенные с Android 9, имеют целевую версию FCM >= 3.
Кроме того, в FCM-файлах product и system_ext могут быть указаны требования для каждой версии FCM на платформе. Выпуск версий FCM в разделах product и system_ext выполняется владельцем этих образов. Номера версий FCM в разделах product и system_ext должны совпадать с номерами в разделе system. Как и в случае с версиями FCM в системном разделе, матрица совместимости в разделе product и system_ext для версии FCM F отражает требования к устройству с целевой версией FCM F.
Прекращение поддержки версии HAL
Прекращение поддержки версии HAL является решением разработчика (т.е. для HAL AOSP Google принимает решение). Это может произойти при выпуске более новой версии HAL (как основной, так и дополнительной).
Как прекратить поддержку HAL устройства
Если определенный HAL устройства foo@x.y устарел в версии FCM F, это означает
, что любое устройство, запущенное с целевой версией FCM V = F или более поздней, не должно
реализовывать foo в версии x.y или любой более ранней версии x.y. Устаревшая версия HAL по-прежнему поддерживается фреймворком для обновления устройств.
Когда выпускается FCM версии F, HAL версии foo@x.y считается устаревшим, если он не указан в последней FCM для целевой FCM версии V = F. Для устройств, выпущенных с V = F, выполняется одно из следующих условий:
- Для фреймворка требуется более новая версия (основная или дополнительная).
- Фреймворку больше не требуется HAL.
Например, в Android 9 health@2.0 представлен как основное обновление HAL версии 1.0. health@1.0 удален из compatibility_matrix.3.xml, но присутствует в compatibility_matrix.legacy.xml, compatibility_matrix.1.xml и compatibility_matrix.2.xml.
Поэтому health@1.0 считается устаревшим.
Как прекратить поддержку HAL фреймворка
Если определенный HAL фреймворка foo@x.y объявлен устаревшим в версии FCM F, это означает
, что любое устройство, запущенное с целевой версией FCM V = F или более поздней, не должно
ожидать, что фреймворк предоставит foo в версии x.y или любой более
ранней версии x.y. Устаревшая версия HAL по-прежнему предоставляется фреймворком для обновления устройств.
Когда выпускается версия FCM F, версия HAL foo@x.y считается устаревшей, если в манифесте фреймворка указано max-level="F - 1" для foo@x.y. На устройствах, выпущенных с V = F, фреймворк не предоставляет HAL foo@x.y. В матрице совместимости устройств, запускаемых с V = F, не должны быть перечислены HAL-интерфейсы фреймворка с max-level < V.
Например, в Android 12 функция schedulerservice@1.0 устарела. Его атрибут max-level имеет значение 5, которое соответствует версии FCM, представленной в Android 11. См. манифест фреймворка Android 12.
Прекращение поддержки целевых версий FCM
Мы удаляем целевые версии FCM по расписанию, чтобы поддерживать совместимость в течение необходимого времени и выполнять требования партнеров в отношении устройств с более длительным сроком службы.
Когда мы удаляем целевую версию FCM из набора SF следующего выпуска платформы, мы выполняем оба следующих шага:
Удалите
compatibility_matrix.V.xmlиз правил сборки (чтобы он не устанавливался в образ системы) и удалите любой код, который реализовывал или зависел от удаленных функций.Удалите HAL фреймворка с
max-level, меньшим или равнымV, из манифеста фреймворка и удалите любой код, реализующий удаленные HAL фреймворка.
Поэтапное прекращение поддержки конфигураций выпуска
Стратегия ветвления Trunk Stable, в которой ежеквартальные выпуски платформы (QPR) берутся непосредственно из git_main, а не из отдельных ветвей release-dev, требует поэтапного прекращения поддержки. Версия FCM может быть удалена из trunk_staging-версий, но оставаться поддерживаемой в стабильной ветке, чтобы устройства могли получать обновления QPR в течение года.
Обычно выпуск фреймворка поддерживает шесть FCM: одну текущую версию, четыре предыдущие версии и одну дополнительную версию для поддержки QPR. Это число может увеличиться, если определенные версии FCM (например, 202404 в Android 15) имеют расширенную поддержку для устройств с длительным сроком службы.
Устройства с целевой версией FCM вне SF для определенной версии фреймворка не могут перейти на эту версию.
Удаление полностью устаревших HAL
Когда версия FCM удаляется, некоторые интерфейсы HAL или версии интерфейсов HAL больше не присутствуют ни в одной FCM. Это означает, что Android больше не поддерживает их, даже для обновления устройств.
После того как поддержка HAL прекращается, разработчики удаляют ссылки на этот интерфейс HAL из Android, в том числе из клиентского кода в фреймворке, реализации по умолчанию и тестовых случаев VTS.
Если нет поддерживаемых HAL, наследующих от удаляемого HAL, то определение HAL можно удалить, выполнив несколько дополнительных шагов.
- Удалите определение интерфейса HAL из исходного кода. Это касается файлов
*.aidlи модуляAndroid.bpaidl_interface. - Если используется HIDL, удалите HASH из
hardware/interfaces/current.txt. - Если вы используете AIDL, удалите каталог
aidl_apiс замороженными файлами AIDL. - Удалите интерфейс из
hardware/interfaces/compatibility_matrices/exclude/fcm_exclude.cpp.
Статус версии HAL
В разделах ниже описаны возможные состояния версии HAL в хронологическом порядке.
Бета-тест
Если версия HAL устройства не указана ни в одной из общедоступных и замороженных матриц совместимости, она считается невыпущенной и, возможно, находится в разработке.
Это относится и к версиям HAL, которые есть только в compatibility_matrix.F.xml.
Примеры:
- Во время разработки Android 9 HAL
health@2.0считался невыпущенным и присутствовал только вcompatibility_matrix.3.xml. - HAL
teleportation@1.0не входит ни в одну из опубликованных матриц совместимости и считается неопубликованным.
Для HAL фреймворка, если версия HAL есть только в манифесте фреймворка из несвязанной ветки разработки, она считается невыпущенной.
Выпущенная и текущая версия
Если версия HAL устройства есть в общедоступной и замороженной матрице совместимости, она считается выпущенной. Например, после того как FCM версии 3 будет заморожена и опубликована в AOSP, HAL health@2.0 будет считаться выпущенной и текущей версией HAL.
Если версия HAL указана в общедоступной и неизменяемой матрице совместимости с самой новой версией FCM, то версия HAL является текущей (не устаревшей). Например, существующие версии HAL (такие как nfc@1.0, представленные в compatibility_matrix.legacy.xml), которые продолжают существовать в compatibility_matrix.3.xml, также считаются выпущенными и текущими версиями HAL.
Для HAL фреймворка, если версия HAL находится в манифесте фреймворка последней выпущенной ветви без атрибута max-level или (что необычно) с атрибутом max-level, равным или превышающим версию FCM, выпущенную в этой ветви, она считается выпущенной и текущей версией HAL. Например, HAL displayservice выпущен и используется в Android 12, как указано в манифесте фреймворка Android 12.
Выпущен, но устарел
Версия HAL устройства считается устаревшей, если соблюдены все следующие условия:
- Выход альбома.
- Его нет в общедоступной и замороженной матрице совместимости с самой высокой версией FCM.
- Он указан в общедоступной и неизменяемой матрице совместимости, которая поддерживается фреймворком.
Примеры:
- Уровень абстрагирования от оборудования
health@1.0есть вcompatibility_matrix.legacy.xml,compatibility_matrix.1.xmlиcompatibility_matrix.2.xml, но не вcompatibility_matrix.3.xml. Поэтому в Android 9 он считается устаревшим. - В Android 9 у HAL управления питанием есть промежуточная версия, но
power@1.0по-прежнему находится вcompatibility_matrix.3.xml. power@1.0compatibility_matrix.legacy.xml,compatibility_matrix.1.xmlиcompatibility_matrix.2.xml.compatibility_matrix.3.xmlсодержитpower@1.0-1.
Поэтому power@1.0 является актуальным, но НЕ устаревшим в Android 9.
Если версия HAL указана в манифесте фреймворка последней выпущенной ветки с атрибутом max-level, значение которого ниже, чем версия FCM в этой ветке, то она считается выпущенной, но устаревшей. Например, HAL schedulerservice был выпущен, но признан устаревшим в Android 12, как указано в манифесте фреймворка Android 12.
Удалено
Для HAL устройств версия HAL удаляется, только если выполняются следующие условия:
- Он был выпущен ранее.
- Он не входит ни в одну из общедоступных и замороженных матриц совместимости, поддерживаемых фреймворком.
Общедоступные и замороженные матрицы совместимости, которые не поддерживаются фреймворком, хранятся в базе кода, чтобы определять набор удаленных версий HAL. Это позволяет писать тесты VTS, которые проверяют, что удаленные HAL не используются на новых устройствах.
Для HAL фреймворка версия HAL удаляется, только если выполняются следующие условия:
- Оно уже было выпущено.
- Его нет ни в одном манифесте фреймворка последней выпущенной ветви.
Устаревшие FCM
Target FCM Version legacy – это специальное значение для всех устройств, не поддерживающих Treble. В устаревшей версии FCM, compatibility_matrix.legacy.xml, перечислены требования к фреймворку на устройствах, выпущенных до Android 8.0.
Если этот файл существует для FCM версии F, любое устройство, не поддерживающее Treble, можно обновить до версии F, если его манифест совместим с этим файлом. Удаление происходит так же, как и в случае с FCM для других версий Target FCM (после того как количество активных устройств с версией ниже 8.0 опустится ниже определенного порога).
Выпущенные версии FCM
Список выпущенных версий FCM можно найти на странице hardware/interfaces/compatibility_matrices.
Чтобы узнать, какая версия FCM была выпущена вместе с определенной версией Android, нажмите Level.h.