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

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

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

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

Матрица совместимости фреймворков (FCM)
XML-файл, в котором указаны требования к платформе для соответствующих реализаций поставщика. Матрица совместимости имеет версии, и новая версия замораживается для каждого выпуска платформы. Каждый выпуск платформы содержит несколько FCM.
Версии платформы FCM (S F )
Набор всех версий FCM в выпуске платформы. Платформа может работать с реализацией любого поставщика, которая удовлетворяет одному из этих FCM.
Версия FCM (F)
Самая высокая версия среди всех FCM в выпуске платформы.
Целевая версия FCM (V)
Целевая версия FCM (из SF ), явно объявленная в манифесте устройства, которой соответствует реализация поставщика. Реализация поставщика должна быть создана на основе опубликованного 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 предоставляет сторона интерфейса поставщика, включая system, system_ext и образы продуктов. HAL в манифесте платформы динамически отключаются в соответствии с целевой версией FCM устройства.
Платформа HAL
HAL, которые указаны в манифесте платформы и указаны как обязательные или необязательные в матрице совместимости устройств (DCM).

Жизненный цикл FCM в базе кода

В этом документе абстрактно описан жизненный цикл FCM. Чтобы просмотреть поддерживаемые в настоящее время манифесты, обратитесь к hardware/interfaces/compatibility_matrix.<FCM>.xml , где FCM можно найти в system/libvintf/include/vintf/Level.h .

Начиная с Android 14, поддерживаются следующие уровни:

ФКМ Версия Android
4 Андроид 10/Q
5 Андроид 11/Р
6 Андроид 12/С
7 Андроид 13/Т
8 Андроид 14/U

Разработка в новой версии 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 со следующими optional настройками:

  • optional="false" , если устройства, поставляемые с V = F должны запускаться с этим HAL,
  • optional="true" , если устройства, поставляемые с V = F , могут запускаться без этого HAL.

Например, в Android 8.1 cas@1.0 представлен в качестве дополнительного HAL. Устройствам, запускаемым под управлением Android 8.1, не требуется реализация этого HAL, поэтому в файл compatibility_matrix.F.xml (который во время разработки этой версии временно назывался compatibility_matrix.current.xml ) была добавлена ​​следующая запись:

<hal format="hidl" optional="true">
    <name>android.hardware.cas</name>
    <version>1.0</version>
    <interface>
        <name>IMediaCasService</name>
        <instance>default</instance>
    </interface>
</hal>

Обновление HAL (второстепенное)

Во время разработки, когда HAL имеет второстепенную версию обновления с xz до x.(z+1) текущей версии FCM F , если эта версия:

  • Требуется на устройствах, запускаемых с V = F compatibility_matrix.F.xml должна содержать x.(z+1) и optional="false" .
  • Не требуется на устройствах, запускаемых с V = F , compatibility_matrix.F.xml должен скопировать xy-z и опциональность из compatibility_matrix.<F-1>.xml и изменить версию на xw-(z+1) (где w >= y ).

Например, в Android 8.1 broadcastradio@1.1 появился как небольшое обновление версии 1.0 HAL. Старая версия, broadcastradio@1.0 , является необязательной для устройств, запускаемых с Android 8.0, а более новая версия, broadcastradio@1.1 , является необязательной для устройств, запускаемых с Android 8.1. В compatibility_matrix.1.xml :

<hal format="hidl" optional="true">
    <name>android.hardware.broadcastradio</name>
    <version>1.0</version>
    <interface>
        <name>IBroadcastRadioFactory</name>
        <instance>default</instance>
    </interface>
</hal>

Эта запись была скопирована в compatibility_matrix.F.xml и изменена следующим образом:

<hal format="hidl" optional="true">
    <name>android.hardware.broadcastradio</name>
    <version>1.0-1</version>
    <interface>
        <name>IBroadcastRadioFactory</name>
        <instance>default</instance>
    </interface>
</hal>

Обновление HAL (основное)

Во время разработки, когда HAL имеет обновление основной версии до текущей версии FCM F , новая основная версия x.0 добавляется в compatibility_matrix.F.xml со следующими optional настройками:

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

Например, в Android 9 health@2.0 представляет собой обновление основной версии HAL 1.0 и объявляет устаревшей HAL 1.0. Старая версия health@1.0 является необязательной для устройств, запускаемых под управлением Android 8.0 и Android 8.1. Устройства, запускаемые с Android 9, не должны предоставлять устаревшую версию HAL 1.0 и вместо этого должны предоставлять новую версию 2.0. compatibility_matrix.legacy.xml , compatibility_matrix.1.xml и compatibility_matrix.2.xml :

<hal format="hidl" optional="true">
    <name>android.hardware.health</name>
    <version>1.0</version>;
    <interface>
        <name>IHealth</name>
        <instance>default</instance>
    </interface>
</hal>

Эта запись копируется в compatibility_matrix.F.xml и изменяется следующим образом:

<hal format="hidl" optional="false">
    <name>android.hardware.health</name>
    <version>2.0</version>
    <interface>
        <name>IHealth</name>
        <instance>default</instance>
    </interface>
</hal>

Ограничения:

  • Поскольку HAL 2.0 указан в compatibility_matrix.3.xml с optional="false" , устройства, запускаемые с Android 9, должны поставляться с HAL 2.0.`
  • Поскольку HAL 1.0 отсутствует в compatibility_matrix.3.xml , устройства, запускаемые с Android 9, не должны предоставлять HAL 1.0 (поскольку этот HAL считается устаревшим).
  • Поскольку HAL 1.0 присутствует в файле Legacy/1/2.xml (более старые версии FCM, с которыми может работать Android 9) в качестве дополнительного HAL, платформа Android 9 по-прежнему может работать с HAL 1.0 (который не считается удаленной версией HAL). ).

Новые версии FCM

Процесс выпуска версии FCM в системном разделе выполняется исключительно Google как часть выпуска AOSP и включает следующие шаги:

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

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

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

Устаревшая версия HAL

Отказ от версии HAL является решением разработчика (т. е. для версий AOSP решение принимает 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 health@2.0 представлен как основное обновление версии 1.0 HAL. health@1.0 удален из compatibility_matrix.3.xml , но присутствует в compatibility_matrix.legacy.xml , compatibility_matrix.1.xml и совместимости_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 V падают ниже определенного порога, целевая версия FCM удаляется из набора SF следующего выпуска платформы. Это делается с помощью обоих следующих шагов:

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

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

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

Статус версии 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 находится в какой-либо общедоступной и замороженной матрице совместимости, она выпускается. Например, после того, как версия 3 FCM заморожена и опубликована в 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. Например, displayservice HAL выпущен и актуален в Android 12, как указано в манифесте платформы Android 12 .

Выпущен, но устарел

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

  • Он выпущен.
  • В общедоступной и замороженной матрице совместимости нет самой высокой версии FCM.
  • Фреймворк все еще поддерживает общедоступную и замороженную матрицу совместимости.

Примеры:

Следовательно, power@1.0 является текущим, но НЕ устаревшим в Android 9.

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

Удаленный

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

  • Ранее оно было выпущено.
  • Платформа не поддерживает ни одну общедоступную и замороженную матрицу совместимости.

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

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

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

Устаревшие FCM

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

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

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

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

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