OTA per dispositivi A/B con partizioni dinamiche

Android 10 supporta le partizioni dinamiche , un sistema di partizionamento dello spazio utente in grado di creare, ridimensionare e distruggere le partizioni durante gli aggiornamenti over-the-air (OTA).

Questa pagina descrive come ridimensionare le partizioni dinamiche durante un aggiornamento per i dispositivi A/B avviati con il supporto delle partizioni dinamiche, per i dispositivi con Android 9 e versioni precedenti .

Sfondo

C'è una super partizione sul dispositivo. Questa partizione non ha il suffisso slot. Il dispositivo a blocchi deve esistere insieme alla voce blk_device per /misc in fstab . Ad esempio, se il file fstab elenca:

/dev/block/bootdevice/by-name/misc    /misc    # Other fields

Quindi il dispositivo a blocchi per super deve esistere in /dev/block/bootdevice/by-name/super , ma non è necessario che la partizione super sia elencata nel file fstab .

Nella super partizione sono presenti due slot di metadati , numerati 0 e 1, corrispondenti agli slot A/B per le partizioni. In questa pagina, gli slot dei metadati sono chiamati Metadata S (sorgente) e Metadata T (destinazione). Allo stesso modo, le partizioni vengono chiamate system_s , vendor_t e così via.

Prima dell'aggiornamento, Metadata S contiene le informazioni per le partizioni dinamiche utilizzate (in genere, system_s , vendor_s , product_s e così via). Il sistema legge le estensioni di queste partizioni durante l'aggiornamento, quindi non possono essere eliminate.

Le partizioni appartengono ai gruppi di aggiornamento . Per i dettagli vedere Implementazione delle partizioni dinamiche .

Un esempio di metadati su un dispositivo è il seguente.

  • Metadati 0
    • Gruppo foo_a
      • system_a di partizione_a
      • Partizione product_services_a
      • Altre partizioni aggiornate da Foo
    • Gruppo bar_a
      • vendor_a della partizione_a
      • product_a partizione_a
      • Altre partizioni aggiornate da Bar
    • Gruppo foo_b (rimanente dell'aggiornamento precedente)
    • Gruppo bar_b (rimanente dall'aggiornamento precedente)
  • Metadati 1
    • Gruppo foo_a (rimanente dell'aggiornamento precedente)
    • Gruppo bar_a (rimanente dall'aggiornamento precedente)
    • Gruppo foo_b
      • system_b di partizione_b
      • Partizione product_services_b
      • Altre partizioni aggiornate da Foo
    • bar_b del gruppo_b
      • vendor_b della partizione_b
      • product_b partizione_b
      • Altre partizioni aggiornate da Bar

Puoi utilizzare lo strumento lpdump (codice sorgente in system/extras/partition_tools ) per scaricare i metadati sul tuo dispositivo. Per esempio:

lpdump --slot 0 /dev/block/bootdevice/by-name/super
lpdump --slot 1 /dev/block/bootdevice/by-name/super

Flusso di aggiornamento

  1. Inizializza i metadati della super partizione.
    1. Caricare le estensioni per le partizioni dinamiche di origine da Metadata S. Sia M i metadati caricati.
    2. Rimuovere i gruppi e le partizioni di destinazione (ad esempio, foo_t , bar_t ) da M in modo che M contenga solo partizioni e gruppi con il suffisso _s .
    3. Aggiungi gruppi di destinazione e partizioni in base al campo dynamic_partition_metadata nel manifest dell'aggiornamento.
      La dimensione di ciascuna partizione può essere trovata in new_partition_info .
    4. Scrivi M nei metadati T.
    5. Mappare le partizioni aggiunte sul mappatore del dispositivo come scrivibili.
  2. Applicare l'aggiornamento sui dispositivi a blocchi.
    1. Se necessario, mappare le partizioni di origine sul mappatore del dispositivo come di sola lettura. Ciò è necessario per il sideload perché le partizioni di origine non vengono mappate prima dell'aggiornamento.
    2. Applica un aggiornamento completo o delta a tutti i dispositivi a blocchi nello slot di destinazione.
    3. Montare le partizioni per eseguire lo script post-installazione, quindi smontare le partizioni.
  3. Annulla la mappatura delle partizioni di destinazione.

Prima e dopo l'aggiornamento, le seguenti proprietà di sistema dovrebbero avere i rispettivi valori:

ro.boot.dynamic_partitions=true
ro.boot.dynamic_partitions_retrofit=true

Aggiungi gruppi e partizioni al manifesto dell'aggiornamento

Quando si esegue un aggiornamento OTA su un dispositivo A/B con partizioni dinamiche o su un dispositivo A/B che aggiunge il supporto per le partizioni dinamiche, è necessario aggiungere gruppi e partizioni al manifesto dell'aggiornamento. Lo snippet seguente mostra informazioni aggiuntive sul manifesto dell'aggiornamento per supportare le partizioni dinamiche. Vedi update_metadata.proto per la documentazione dettagliata su ciascun campo.

message DeltaArchiveManifest {
    optional DynamicPartitionMetadata dynamic_partition_metadata;
}

message DynamicPartitionMetadata {
    repeated DynamicPartitionGroup groups;
}

message DynamicPartitionGroup {
    required string name;
    optional uint64 size; // maximum size of group
    repeated string partition_names;
}