Жизненный цикл FCM

В каждом релизе фреймворка Android имеется несколько матриц совместимости фреймворков (FCM), по одной для каждой обновляемой целевой версии FCM, которые определяют, что может использовать фреймворк и какие требования предъявляются к целевой версии FCM. В рамках жизненного цикла FCM Android объявляет устаревшими и удаляет HAL-компоненты HIDL, а затем изменяет файлы FCM, чтобы отразить состояние версии HAL .

Для обеспечения возможности обновления ПО только для фреймворков в собственных экосистемах партнерам, расширяющим интерфейсы поставщиков, следует также отказаться от использования и удалить HAL-интерфейсы HIDL, используя те же методы.

Терминология

Матрица совместимости фреймворков (FCM)
XML-файл, определяющий требования к фреймворку для соответствующих реализаций поставщиков. Матрица совместимости имеет версии, и для каждого выпуска фреймворка устанавливается новая версия. Каждый выпуск фреймворка содержит несколько матриц совместимости.
Версии FCM платформы (S F )
Набор всех версий FCM в релизе фреймворка. Фреймворк может работать с любой реализацией поставщика, удовлетворяющей одному из этих FCM.
Версия FCM (F)
Самая высокая версия среди всех FCM в рамках данного релиза фреймворка.
Целевая версия FCM (V)
Целевая версия FCM (из S F ), явно указанная в манифесте устройства, которой удовлетворяет реализация поставщика. Реализация поставщика должна быть сгенерирована на основе опубликованной версии FCM, хотя она может указывать более новые версии HAL в своем манифесте устройства.
Версия HAL
Версия HAL имеет формат foo@xy , где foo — это имя HAL, а xy — конкретная версия; например nfc@1.0 , keymaster@3.0 (корневой префикс, например, android.hardware , в этом документе опущен).
Манифест устройства
XML-файлы, определяющие, какие версии HAL предоставляет интерфейс производителя на стороне устройства, включая образы производителя и ODM. Содержимое манифеста устройства ограничено версией целевого FCM устройства, но может содержать список HAL, которые являются строго более новыми по отношению к FC, соответствующему версии V.
HAL-ы устройств
HAL-компоненты, указанные (предоставленные) в манифесте устройства и в матрице совместимости фреймворков (FCM).
Матрица совместимости устройств (DCM)
XML-файл, определяющий требования поставщика к соответствующим реализациям фреймворка. Каждое устройство содержит один DCM.
Манифест фреймворка
XML-файл, определяющий, какие версии HAL предоставляет интерфейс поставщика на стороне фреймворка, включая образы системы, системных расширений и продуктов. 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:

ФКМ Версия для 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 :

  1. Скопируйте последнюю версию compatibility_matrix.<F-1>.xml в файл compatibility_matrix.F.xml .
  2. Обновите атрибут level в файле, установив значение F
  3. Добавьте соответствующие правила сборки для установки этой матрицы совместимости на устройство.

Представляем новый 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 (незначительное)

Версии AIDL HAL считаются минорными версиями HAL. Версии интерфейса HIDL имеют major . minor версии, например, 1.2 .

В процессе разработки, когда версия AIDL HAL обновляется с 2 до 3 при текущей версии FCM F , новая версия добавляется в запись HAL в compatibility_matrix.F.xml . Поле version записи 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 Version F , новая основная версия x.0 добавляется в файл compatibility_matrix.F.xml со следующими настройками:

  • Только версия x.0 , если устройства, поставляемые с V = F должны запускаться с версией x.0 .
  • Если в одном теге <hal> содержатся более старые основные версии, то устройства, поставляемые с V = F могут запускаться с более старой основной версией.

Например, в версии FCM F в качестве основного обновления HAL версии 1.0 вводится foo@2.0 , а HAL версии 1.0 объявляется устаревшим. Более старая версия, foo@1.0 , используется для устройств, ориентированных на предыдущие версии FCM. Устройства, ориентированные на версию FCM F должны предоставлять новую версию 2.0, если они поддерживают HAL. В этом примере предыдущие версии 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 и включает следующие шаги:

  1. Убедитесь, что файл compatibility_matrix.F.xml имеет атрибут level="F" .
  2. Убедитесь, что все устройства собраны и загружены.
  3. Обновите тесты VTS , чтобы убедиться, что устройства, запускаемые с использованием последней версии фреймворка (на основе уровня Shipping API), имеют целевую версию FCM V >= F
  4. Опубликовать файл в AOSP.

Например, тесты VTS гарантируют, что устройства, запускаемые с Android 9, имеют целевую версию FCM >= 3.

Кроме того, в файлах FCM для продукта и системного расширения могут также быть указаны требования для каждой версии FCM платформы. Выпуск версий FCM для разделов продукта и системного расширения осуществляется владельцем этих образов соответственно. Номера версий FCM в разделах продукта и системного расширения должны совпадать с номерами версий в системном разделе. Аналогично версиям FCM в системном разделе, матрица совместимости для версии FCM F в разделах продукта и системного расширения отражает требования к устройству с целевой версией FCM F.

устаревание версии HAL

Решение об устаревании версии HAL принимается разработчиками (например, для AOSP HAL это решение принимает Google). Это может произойти при выпуске более новой версии HAL (как дополнительной, так и основной).

Устаревший HAL-интерфейс устройства

Если HAL устройства foo@xy устарел в версии FCM F , это означает, что любое устройство, запускаемое с целевой версией FCM V = F или более поздней, не должно реализовывать foo в версии xy или любой версии старше xy . Устаревшая версия HAL по-прежнему поддерживается фреймворком для обновления устройств.

При выпуске версии FCM F версия HAL foo@xy считается устаревшей, если конкретная версия HAL не указана явно в последней версии FCM для целевой версии FCM V = F Для устройств, запускаемых с V = F , выполняется одно из следующих условий:

  • Для работы фреймворка требуется более высокая версия (основная или дополнительная);
  • Данная платформа больше не требует наличия HAL.

Например, в Android 9 в качестве основного обновления HAL версии 1.0 была представлена health@2.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@xy объявлен устаревшим в версии FCM F , это означает, что любое устройство, запускаемое с целевой версией FCM V = F или более поздней, не должно ожидать, что фреймворк предоставит foo версии xy или любой версии старше xy . Устаревшая версия HAL по-прежнему предоставляется фреймворком для устройств, обновляющихся до этой версии.

При выпуске версии FCM F версия HAL foo@xy считается устаревшей, если в манифесте платформы указан max-level=" F - 1 " для foo@xy . Для устройств, запускаемых с V = F , платформа не предоставляет HAL foo@xy . Матрица совместимости устройств, запускаемых с V = F не должна содержать HAL платформы с max-level < V

Например, в Android 12 schedulerservice@1.0 устарел. Его атрибут max-level установлен на 5 , версию FCM, представленную в Android 11. См. манифест фреймворка Android 12 .

Прекращение поддержки целевых версий FCM.

Мы используем процесс, основанный на графике, для определения целевой версии FCM, поддержания совместимости в течение необходимого периода времени и удовлетворения требований партнеров к устройствам с более длительным сроком службы.

При удалении целевой версии FCM из набора S F следующего релиза фреймворка мы выполняем оба следующих шага:

  1. Удалите файл compatibility_matrix.V.xml из правил сборки (чтобы он не устанавливался в образ системы) и удалите весь код, который реализовывал или зависел от удаленных возможностей.

  2. Удалите из манифеста фреймворка HAL-компоненты с max-level ниже или равным V , а также удалите весь код, реализующий удаленные HAL-компоненты фреймворка.

Поэтапное прекращение поддержки для конфигураций релизов

Стратегия ветвления Trunk Stable, при которой ежеквартальные релизы платформы (QPR) берутся непосредственно из git_main а не из отдельных веток release-dev, требует поэтапного процесса устаревания. Версия FCM может быть удалена для раннего оповещения в сборках trunk_staging , оставаясь при этом поддерживаемой в ветке release для устройств, получающих QPR в течение года.

Как правило, в одном релизе фреймворка поддерживаются шесть версий FCM: одна текущая, четыре предыдущие и одна дополнительная версия для поддержки QPR. Это число может увеличиться, если в определенных версиях FCM (например, в Android 15 версии 202404 ) предусмотрена расширенная поддержка для обеспечения более длительной работы устройства.

Устройства с целевой версией FCM, отличной от S F для данного выпуска фреймворка, не могут обновиться до этой версии.

Удаление полностью устаревших HAL-компонентов

При удалении версии FCM некоторые интерфейсы HAL или их версии перестают присутствовать в каких-либо FCM. Это означает, что Android больше не поддерживает их вообще, даже при обновлении устройств.

После прекращения поддержки HAL разработчики удаляют ссылки на этот интерфейс HAL из Android, в том числе из клиентского кода в рамках фреймворка, из реализации по умолчанию и из тестовых примеров VTS.

Если нет поддерживаемых HAL, наследующих свойства удаляемого HAL, то само определение HAL можно удалить, выполнив несколько дополнительных шагов.

  1. Удалите определение интерфейса HAL из исходного кода. Это включает файлы *.aidl и модуль Android.bp aidl_interface .
  2. Если используется HIDL, удалите хэш из hardware/interfaces/current.txt .
  3. Если используется AIDL, удалите каталог aidl_api с замороженными файлами AIDL.
  4. Удалите интерфейс из hardware/interfaces/compatibility_matrices/exclude/fcm_exclude.cpp .

статус версии HAL

В следующих разделах (в хронологическом порядке) описываются возможные состояния версии HAL.

Неопубликованный

Для HAL-интерфейсов устройств, если версия HAL отсутствует в общедоступных и замороженных матрицах совместимости, она считается невыпущенной и, возможно, находящейся в разработке. Это включает в себя версии HAL, которые указаны только в compatibility_matrix.F.xml . Примеры:

  • В процессе разработки Android 9 HAL health@2.0 считался невыпущенным HAL и присутствовал только в compatibility_matrix.3.xml .
  • HAL teleportation@1.0 не включен ни в одну из выпущенных матриц совместимости и считается невыпущенным HAL.

В случае с HAL-интерфейсами фреймворков, если версия 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-интерфейсов устройств версия HAL считается устаревшей только в том случае, если выполняются все следующие условия:

  • Оно выпущено.
  • В общедоступной и замороженной матрице совместимости отсутствует информация о том, что версия FCM имеет наивысший уровень.
  • Поддержка со стороны фреймворка по-прежнему осуществляется в рамках общедоступной и замороженной матрицы совместимости.

Примеры:

Таким образом, power@1.0 является актуальной, но НЕ устаревшей функцией в Android 9.

Для HAL-компонентов фреймворка, если версия HAL указана в манифесте фреймворка последней выпущенной ветки с атрибутом max-level ниже версии, выпущенной в FCM в этой ветке, она считается выпущенной, но устаревшей версией HAL. Например, HAL-компонент schedulerservice выпущен, но устарел в Android 12, как указано в манифесте фреймворка Android 12 .

Удаленный

Для HAL-интерфейсов устройств версия HAL удаляется только в том случае, если выполняются следующие условия:

  • Оно уже было выпущено ранее.
  • Данная платформа не поддерживает это ни в одной общедоступной и замороженной матрице совместимости.

Матрицы совместимости, которые являются общедоступными, замороженными, но не поддерживаются фреймворком, хранятся в кодовой базе для определения удаленных наборов версий HAL, чтобы можно было написать тесты VTS, гарантирующие, что удаленные HAL не будут установлены на новых устройствах.

Для HAL-интерфейсов фреймворков версия HAL удаляется только при выполнении следующих условий:

  • Оно уже было выпущено ранее.
  • Его нет ни в одном манифесте фреймворка последней выпущенной ветки.

Устаревшие FCM

Параметр Target FCM Version legacy является специальным значением для всех устройств, не поддерживающих Treble. В файле compatibility_matrix.legacy.xml , относящемся к устаревшему FCM, перечислены требования фреймворка для устаревших устройств (т.е. устройств, выпущенных до Android 8.0).

Если этот файл существует для FCM версии F , любое устройство, не поддерживающее Treble, может быть обновлено до F при условии, что его манифест устройства совместим с этим файлом. Удаление файла осуществляется по той же процедуре, что и для FCM других целевых версий FCM (удаляется после того, как количество активных устройств до версии 8.0 упадет ниже определенного порога).

Выпущенные версии FCM

Список выпущенных версий FCM можно найти в папке hardware/interfaces/compatibility_matrices .

Чтобы узнать версию FCM, выпущенную вместе с конкретным релизом Android, см. Level.h .