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

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

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

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

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

Разработка новой версии 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.<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 , xw-(z+1) compatibility_matrix.current.xml должен копировать xy-z и optionality из 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.current.xml (после выпуска Android 8.1 переименована в compatibility_matrix.2.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.current.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 как обновление основной версии 1.0 HAL и не health@2.0 1.0 HAL. Более старая версия, health@1.0 , не является обязательной для устройств, запускаемых с Android 8.0 и Android 8.1. Устройства, запускаемые с Android 9, не должны предоставлять устаревшую версию 1.0 HAL, а должны предоставлять новую версию 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 (в версии Android 9 переименован в compatibility_matrix.3.xml ) и изменяется следующим образом:

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

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

  • Поскольку 2.0 HAL находится в compatibility_matrix.3.xml с optional="false" , устройства, запускаемые с Android 9, должны поставляться с 2.0 HAL.
  • Поскольку 1.0 HAL отсутствует в compatibility_matrix.3.xml , устройства, запускаемые с Android 9, не должны предоставлять 1.0 HAL (поскольку этот HAL считается устаревшим).
  • Поскольку 1.0 HAL присутствует в legacy / 1 / 2.xml (более старые версии FCM, с которыми может работать Android 9) в качестве дополнительного HAL, платформа Android 9 может по-прежнему работать с 1.0 HAL (который не считается удаленной версией 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, имеют Target FCM Version> = 3.

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

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

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

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

  • Для фреймворка требуется более высокая версия (основная или дополнительная);
  • Фреймворк больше не требует 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 считается устаревшим.

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

Когда активные устройства определенной целевой версии FCM V опускаются ниже определенного порога, целевая версия FCM удаляется из набора S F следующего выпуска платформы. Это делается путем удаления файла compatibility_matrix.V.xml из правил сборки (чтобы он больше не устанавливался в образе системы), а также путем удаления любого кода, который реализовал удаленную функциональность или зависел от нее. Устройства с целевой версией FCM за пределами S F для данного выпуска платформы не могут обновиться до этого выпуска.

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

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

Неизданный

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

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

Выпущено и текущее

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

Если версия HAL находится в общедоступной и замороженной матрице совместимости, которая имеет наивысшую версию FCM (за исключением compatibility_matrix.current.xml ), версия HAL является текущей (т. Е. Не является устаревшей). Например, существующие версии HAL (такие как nfc@1.0 представленные в compatibility_matrix.legacy.xml ), которые продолжают существовать в compatibility_matrix.3.xml , также считаются выпущенными и текущими версиями HAL.

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

Версия HAL считается устаревшей тогда и только тогда, когда:

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

Примеры:

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

Удаленный

Версия HAL удаляется тогда и только тогда, когда:

  • Ранее он был выпущен;
  • Фреймворк не поддерживает никаких публичных и замороженных матриц совместимости.

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

Устаревшие FCM

Устаревшая целевая версия FCM - это особое значение для всех устройств, не поддерживающих высокие частоты. Устаревший 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 .