Ciclo di vita dell'FCM

Una versione del framework Android dispone di più matrici di compatibilità del framework (FCM), una per ciascuna versione FCM target aggiornabile, che definiscono cosa può utilizzare il framework e i requisiti della versione FCM target. Nell'ambito del ciclo di vita di FCM, Android depreca e rimuove gli HAL HIDL, quindi modifica i file FCM per riflettere lo stato della versione dell'HAL .

Per abilitare OTA solo framework nei propri ecosistemi, i partner che estendono le interfacce dei fornitori dovrebbero anche deprecare e rimuovere gli HAL HIDL utilizzando gli stessi metodi.

Terminologia

Matrice di compatibilità del framework (FCM)
Un file XML che specifica i requisiti del framework sulle implementazioni conformi del fornitore. La matrice di compatibilità è dotata di versione e una nuova versione viene bloccata per ogni versione del framework. Ogni versione del framework contiene più FCM.
Versioni piattaforma FCM (S F )
L'insieme di tutte le versioni di FCM in una versione del framework. Il framework può funzionare con qualsiasi implementazione del fornitore che soddisfi uno di questi FCM.
Versione FCM (F)
La versione più alta tra tutti gli FCM in una versione framework.
Versione FCM target (V)
La versione FCM di destinazione (da S F ), dichiarata esplicitamente nel manifest del dispositivo, che l'implementazione del fornitore soddisfa. Un'implementazione del fornitore deve essere generata rispetto a un FCM pubblicato, sebbene possa dichiarare versioni HAL più recenti nel relativo manifest del dispositivo.
Versione HAL
Una versione HAL ha il formato foo@xy , dove foo è il nome HAL e xy è la versione specifica; ad esempio nfc@1.0 , keymaster@3.0 (il prefisso root, ad esempio android.hardware , è omesso in questo documento.)
Manifesto del dispositivo
File XML che specificano quali versioni HAL fornisce il lato dispositivo dell'interfaccia del fornitore, incluse le immagini del fornitore e dell'ODM. Il contenuto di un manifest del dispositivo è vincolato dalla versione FCM di destinazione del dispositivo ma può elencare HAL strettamente più recenti rispetto all'FC corrispondente a V.
HAL del dispositivo
HAL elencati (forniti) nel manifesto del dispositivo ed elencati (richiesti o facoltativi) nella matrice di compatibilità del framework (FCM).
Matrice di compatibilità dei dispositivi (DCM)
Un file XML che specifica i requisiti del fornitore sulle implementazioni conformi del framework. Ogni dispositivo contiene un DCM.
Manifesto quadro
Un file XML che specifica quali versioni HAL fornisce il lato framework dell'interfaccia del fornitore, inclusi system, system_ext e immagini del prodotto. Gli HAL nel manifesto del framework vengono disabilitati dinamicamente in base alla versione FCM di destinazione del dispositivo.
HAL quadro
HAL elencati come forniti nel manifesto del framework ed elencati come obbligatori o facoltativi nella matrice di compatibilità del dispositivo (DCM).

Ciclo di vita FCM nella codebase

Questo documento descrive in astratto il ciclo di vita di FCM. Per vedere i manifest attualmente supportati, fare riferimento a hardware/interfaces/compatibility_matrix.<FCM>.xml dove FCM può essere trovato in system/libvintf/include/vintf/Level.h .

A partire da Android 14, i livelli supportati sono:

FCM Versione Android
4 Android 10/Q
5 Androide 11/R
6 Android 12/S
7 Androide 13/T
8 Android 14/U

Sviluppo in una nuova versione di FCM

Android incrementa la versione FCM per ogni versione del framework (come Android 8, 8.1, ecc.). Durante lo sviluppo, viene creata la nuova compatibility_matrix.F.xml e la compatibility_matrix.f.xml esistente (dove f < F ) non viene più modificata.

Per iniziare a sviluppare in una nuova versione F di FCM:

  1. Copia l'ultima compatibility_matrix.<F-1>.xml in compatibility_matrix.F.xml .
  2. Aggiorna l'attributo level nel file su F .
  3. Aggiungi le regole di build corrispondenti per installare questa matrice di compatibilità sul dispositivo.

Presentazione di un nuovo HAL

Durante lo sviluppo, quando si introduce un nuovo HAL (Wi-Fi, NFC, ecc.) su Android sull'attuale versione FCM F , aggiungere l'HAL a compatibility_matrix.F.xml con le seguenti impostazioni optional :

  • optional="false" se i dispositivi forniti con V = F devono essere avviati con questo HAL,
  • optional="true" se i dispositivi forniti con V = F possono essere avviati senza questo HAL.

Ad esempio, Android 8.1 ha introdotto cas@1.0 come HAL opzionale. I dispositivi avviati con Android 8.1 non sono tenuti a implementare questo HAL, quindi la seguente voce è stata aggiunta a compatibility_matrix.F.xml (che veniva chiamato temporaneamente compatibility_matrix.current.xml durante lo sviluppo di quella versione):

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

Aggiorna un HAL (minore)

Durante lo sviluppo, quando un HAL ha un aggiornamento della versione minore da xz a x.(z+1) all'attuale versione FCM F , se tale versione è:

  • Obbligatorio sui dispositivi che vengono avviati con V = F , compatibility_matrix.F.xml deve indicare x.(z+1) e optional="false" .
  • Non richiesto sui dispositivi che si avviano con V = F , compatibility_matrix.F.xml deve copiare xy-z e opzionalità da compatibility_matrix.<F-1>.xml e modificare la versione in xw-(z+1) (dove w >= y ).

Ad esempio, Android 8.1 ha introdotto broadcastradio@1.1 come aggiornamento della versione minore di 1.0 HAL. La versione precedente, broadcastradio@1.0 , è facoltativa per i dispositivi avviati con Android 8.0 mentre la versione più recente, broadcastradio@1.1 , è facoltativa per i dispositivi avviati con Android 8.1. In 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>

Questa voce è stata copiata in compatibility_matrix.F.xml e modificata come segue:

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

Aggiorna un HAL (maggiore)

Durante lo sviluppo, quando un HAL dispone di un aggiornamento della versione principale all'attuale versione FCM F , la nuova versione principale x.0 viene aggiunta a compatibility_matrix.F.xml con le seguenti impostazioni optional :

  • optional="false" solo con la versione x.0 , se i dispositivi forniti con V = F devono essere avviati con x.0 .
  • optional="false" ma insieme alle versioni principali precedenti nello stesso tag <hal> , se i dispositivi forniti con V = F devono essere avviati con questo HAL, ma possono essere avviati con una versione principale precedente.
  • optional="true" se i dispositivi forniti con V = F non devono avviare l'HAL.

Ad esempio, Android 9 introduce health@2.0 come aggiornamento della versione principale dell'HAL 1.0 e depreca l'HAL 1.0. La versione precedente, health@1.0 , è facoltativa per i dispositivi avviati con Android 8.0 e Android 8.1. I dispositivi avviati con Android 9 non devono fornire l'HAL 1.0 deprecato ma devono invece fornire la nuova versione 2.0. I compatibility_matrix.legacy.xml , compatibility_matrix.1.xml e 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>

Questa voce viene copiata in compatibility_matrix.F.xml e modificata come segue:

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

Restrizioni:

  • Poiché l'HAL 2.0 è in compatibility_matrix.3.xml con optional="false" , i dispositivi avviati con Android 9 devono essere forniti con l'HAL 2.0.`
  • Poiché l'HAL 1.0 non è in compatibility_matrix.3.xml , i dispositivi avviati con Android 9 non devono fornire l'HAL 1.0 (poiché questo HAL è considerato deprecato).
  • Poiché l'HAL 1.0 è presente in legacy/1/2.xml (versioni FCM precedenti con cui può funzionare Android 9) come HAL opzionale, il framework Android 9 può ancora funzionare con l'HAL 1.0 (che non è considerato una versione HAL rimossa ).

Nuove versioni FCM

Il processo di rilascio di una versione FCM sulla partizione di sistema viene eseguito esclusivamente da Google come parte di un rilascio AOSP e include i seguenti passaggi:

  1. Assicurati che compatibility_matrix.F.xml abbia l'attributo level="F" .
  2. Assicurati che tutti i dispositivi vengano creati e avviati.
  3. Aggiorna i test VTS per garantire che i dispositivi lanciati con il framework più recente (in base al livello dell'API di spedizione) abbiano Target FCM Version V >= F .
  4. Pubblica il file su AOSP.

Ad esempio, i test VTS garantiscono che i dispositivi avviati con Android 9 abbiano una versione FCM target >= 3.

Inoltre, gli FCM del prodotto e del system_ext possono anche elencare i requisiti per le versioni FCM di ciascuna piattaforma. Il rilascio delle versioni FCM sulle partizioni product e system_ext viene effettuato rispettivamente dal proprietario di queste immagini. I numeri di versione FCM sulle partizioni product e system_ext devono essere allineati con quelli sulla partizione di sistema. Analogamente alle versioni FCM sulla partizione di sistema, la matrice di compatibilità della versione FCM F nelle partizioni product e system_ext riflette i requisiti su un dispositivo con versione FCM di destinazione F.

Deprecazione della versione HAL

La deprecazione di una versione HAL è una decisione dello sviluppatore (ad esempio, per gli HAL AOSP, la decisione è di Google). Potrebbe accadere quando viene rilasciata una versione HAL superiore (minore o maggiore).

Deprecare un HAL del dispositivo

Quando un determinato dispositivo HAL foo@xy è deprecato nella versione FCM F , significa che qualsiasi dispositivo avviato con la versione FCM target V = F o successiva non deve implementare foo nella versione xy o qualsiasi versione precedente a xy . Una versione HAL deprecata è ancora supportata dal framework per l'aggiornamento dei dispositivi.

Quando viene rilasciata la versione F di FCM, una versione HAL foo@xy è considerata deprecata se la versione HAL specifica non è esplicitamente indicata nell'FCM più recente per la versione FCM di destinazione V = F . Per i dispositivi che si avviano con V = F , è vera una delle seguenti condizioni:

  • Il framework richiede una versione superiore (maggiore o minore);
  • Il framework non richiede più l'HAL.

Ad esempio, in Android 9, health@2.0 viene introdotto come aggiornamento della versione principale di 1.0 HAL. health@1.0 viene rimosso da compatibility_matrix.3.xml ma è presente in compatibility_matrix.legacy.xml , compatibility_matrix.1.xml e compatibilità_matrix.2.xml . Pertanto, health@1.0 è considerato deprecato.

Deprecare un HAL framework

Quando un dato framework HAL foo@xy è deprecato nella versione FCM F , significa che qualsiasi dispositivo avviato con Target FCM versione V = F o successiva non deve aspettarsi che il framework fornisca foo nella versione xy o in qualsiasi versione precedente a xy . Una versione HAL deprecata viene ancora fornita dal framework per l'aggiornamento dei dispositivi.

Quando viene rilasciata la versione F di FCM, una versione HAL foo@xy è considerata deprecata se il manifest del framework specifica max-level=" F - 1 " per foo@xy . Per i dispositivi avviati con V = F , il framework non fornisce l'HAL foo@xy . La matrice di compatibilità dei dispositivi sui dispositivi avviati con V = F non deve elencare gli HAL del framework con max-level < V .

Ad esempio, in Android 12, schedulerservice@1.0 è deprecato. Il suo attributo max-level è impostato su 5 , la versione FCM introdotta in Android 11. Consulta il manifesto del framework Android 12 .

Rimozione del supporto per le versioni FCM di destinazione

Quando i dispositivi attivi di una determinata Versione V di Target FCM scendono al di sotto di una determinata soglia, la Versione Target FCM viene rimossa dal set S F della successiva versione del framework. Questa operazione viene eseguita mediante entrambi i seguenti passaggi:

  1. Rimozione compatibility_matrix.V.xml dalle regole di compilazione (in modo che non sia installato sull'immagine di sistema) ed eliminazione di qualsiasi codice che implementasse o dipendesse dalla funzionalità rimossa.

  2. Rimozione degli HAL del framework con max-level inferiore o uguale a V dal manifesto del framework ed eliminazione di qualsiasi codice che implementa gli HAL del framework rimossi.

I dispositivi con una versione FCM di destinazione esterna a S F per una determinata versione del framework non possono eseguire l'aggiornamento a quella versione.

Stato della versione HAL

Le sezioni seguenti descrivono (in ordine cronologico) i possibili stati di una versione HAL.

Inedito

Per gli HAL dei dispositivi, se una versione HAL non è presente in nessuna delle matrici di compatibilità pubbliche e bloccate, è considerata non rilasciata e possibilmente in fase di sviluppo. Sono incluse le versioni HAL che si trovano solo in compatibility_matrix.F.xml . Esempi:

  • Durante lo sviluppo di Android 9 l'HAL health@2.0 era considerato un HAL inedito ed era presente solo in compatibility_matrix.3.xml .
  • L'HAL teleportation@1.0 non è presente in nessuna matrice di compatibilità rilasciata ed è anche considerato un HAL non rilasciato.

Per gli HAL del framework, se una versione dell'HAL è presente solo nel manifest del framework di un ramo di sviluppo non correlato, è considerata non rilasciata.

Rilasciato e attuale

Per gli HAL dei dispositivi, se una versione HAL si trova in una matrice di compatibilità pubblica e bloccata, viene rilasciata. Ad esempio, dopo che la versione 3 di FCM è stata bloccata e pubblicata su AOSP, l'HAL health@2.0 è considerato una versione HAL rilasciata e corrente.

Se una versione HAL si trova in una matrice di compatibilità pubblica e bloccata che ha la versione FCM più alta, la versione HAL è quella corrente (ovvero non deprecata). Ad esempio, anche le versioni HAL esistenti (come nfc@1.0 introdotta in compatibility_matrix.legacy.xml che continuano a esistere in compatibility_matrix.3.xml ) sono considerate versioni HAL rilasciate e attuali.

Per gli HAL framework, se una versione HAL è nel manifest framework dell'ultimo ramo rilasciato senza l'attributo max-level o (insolitamente) un max-level uguale o superiore alla versione FCM rilasciata in questo ramo, è considerata una versione HAL rilasciata e la versione corrente di HAL. Ad esempio, l'HAL displayservice è rilasciato ed è aggiornato in Android 12, come specificato dal manifest del framework Android 12 .

Rilasciato ma deprecato

Per gli HAL dei dispositivi, una versione HAL è deprecata se e solo se sono soddisfatte tutte le seguenti condizioni:

  • Viene rilasciato.
  • Non è nella matrice di compatibilità pubblica e bloccata che ha la versione FCM più alta.
  • È in una matrice di compatibilità pubblica e congelata che il framework supporta ancora.

Esempi:

Pertanto power@1.0 è attuale, ma NON deprecato, in Android 9.

Per gli HAL framework, se una versione HAL è nel manifest framework dell'ultimo ramo rilasciato con un attributo max-level inferiore al rilascio della versione FCM in questo ramo, è considerata una versione HAL rilasciata ma deprecata. Ad esempio, l'HAL schedulerservice viene rilasciato ma deprecato in Android 12, come specificato dal manifest del framework Android 12 .

RIMOSSO

Per gli HAL del dispositivo, una versione HAL viene rimossa se e solo se si verificano le seguenti condizioni:

  • È stato rilasciato in precedenza.
  • Non è in alcuna matrice di compatibilità pubblica e congelata supportata dal framework.

Le matrici di compatibilità pubbliche, bloccate, ma non supportate dal framework vengono mantenute nella codebase per definire il set di versioni HAL rimosse in modo che i test VTS possano essere scritti per garantire che gli HAL rimossi non si trovino su nuovi dispositivi.

Per gli HAL framework, una versione HAL viene rimossa se e solo se vengono soddisfatte le seguenti condizioni:

  • È stato rilasciato in precedenza.
  • Non è presente in nessun framework manifest dell'ultimo ramo rilasciato.

FCM preesistenti

La versione legacy di FCM di destinazione è un valore speciale per tutti i dispositivi non Treble. L'FCM legacy, compatibility_matrix.legacy.xml , elenca i requisiti del framework sui dispositivi legacy (ovvero dispositivi lanciati prima di Android 8.0).

Se questo file esiste per un FCM con versione F , qualsiasi dispositivo non Treble può essere aggiornato a F purché il manifest del dispositivo sia compatibile con questo file. La sua rimozione segue la stessa procedura degli FCM per altre versioni FCM target (rimozione dopo che il numero di dispositivi pre-8.0 attivi scende al di sotto di una determinata soglia).

Versioni FCM rilasciate

L'elenco delle versioni FCM rilasciate può essere trovato in hardware/interfaces/compatibility_matrices .

Per trovare la versione FCM rilasciata con una specifica versione Android, vedere Level.h .