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

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

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

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

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

Разработка в новой версии FCM

Android увеличивает версию FCM для каждого выпуска платформы (например, Android 8, 8.1 и т. д.). Во время разработки создается новый compatibility_matrix.current.xml ( F ), а существующий compatibility_matrix.f.xml (где f < F ) больше не изменяется.

Чтобы начать разработку в новой версии FCM F :

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

Представляем новый HAL

Во время разработки при внедрении нового HAL (Wi-Fi, NFC и т. д.) для Android в текущей версии FCM F добавьте HAL в compatibility_matrix.current.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.current.xml (переименованный в compatibility_matrix.2.xml после выпуска Android 8.1):

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

Например, в Android 8.1 broadcastradio@1.1 @ 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.current.xml (переименованный в compatibility_matrix.2.xml после выпуска Android 8.1) и изменена следующим образом:

<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.current.xml со следующими optional параметрами:

  • option 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.current.xml (переименованный в compatibility_matrix.3.xml в выпуске Android 9) и изменяется следующим образом:

<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.current.xml в compatibility_matrix.F.xml .
  2. Убедитесь, что файл имеет атрибут level="F" .
  3. Отредактируйте соответствующие правила сборки, чтобы отразить изменение имени файла.
  4. Убедитесь, что все устройства собраны и загружены.
  5. Обновите тесты VTS, чтобы гарантировать, что устройства, запускаемые с последней платформой (на основе уровня API доставки), имеют целевую версию FCM V >= F .
  6. Опубликовать файл в AOSP.

Этот файл нельзя изменить после переименования и публикации. Например, при разработке Android 9 создаются следующие файлы для hardware/interfaces/compatibility_matrices/ :

  • compatibility_matrix.legacy.xml
  • compatibility_matrix.1.xml
  • compatibility_matrix.2.xml
  • compatibility_matrix.current.xml

При выпуске Android 9 файл compatibility_matrix.current.xml переименовывается в compatibility_matrix.3.xml , и создаются следующие файлы для hardware/interfaces/compatibility_matrices/ :

  • compatibility_matrix.legacy.xml
  • compatibility_matrix.1.xml
  • compatibility_matrix.2.xml
  • compatibility_matrix.3.xml

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

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

Прекращение поддержки версии HAL

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

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

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

Когда версия 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 и 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 V падают ниже определенного порога, целевая версия FCM удаляется из набора S F следующего выпуска платформы. Это делается двумя следующими шагами:

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

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

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

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

Неизданный

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

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

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

Выпущено и актуально

Для HAL устройств, если версия HAL находится в какой-либо общедоступной и замороженной матрице совместимости, она выпускается. Например, после того, как версия 3 FCM заморожена (когда compatibiility_matrix.current.xml переименован в compatibility_matrix.3.xml ) и опубликована в AOSP, HAL health@2.0 считается выпущенной и текущей версией HAL.

Если версия HAL находится в общедоступной и замороженной матрице совместимости с самой высокой версией FCM (за исключением compatibility_matrix.current.xml ), версия 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 12framework manifest .

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

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

  • Он выпущен.
  • Это не общедоступная и замороженная матрица совместимости, которая имеет самую высокую версию FCM.
  • Он находится в общедоступной и замороженной матрице совместимости, которую фреймворк все еще поддерживает.

Примеры:

Следовательно, power@1.0 , но НЕ устарел в Android 9.

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

Удаленный

Для 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 .