Android 10 supporta le partizioni dinamiche, un sistema di partizionamento dello spazio utente che può creare, ridimensionare ed eliminare le partizioni durante gli aggiornamenti over-the-air (OTA).
Questa pagina descrive come i client OTA ridimensionano le partizioni dinamiche durante un aggiornamento per i dispositivi A/B che sono stati lanciati senza il supporto delle partizioni dinamiche e come i client OTA eseguono l'upgrade ad Android 10.
Sfondo
Durante l'aggiornamento di un dispositivo A/B per supportare le partizioni dinamiche, la
tabella delle partizioni GUID (GPT) sul dispositivo viene mantenuta, quindi non è presente
la partizione super
sul dispositivo. I metadati vengono archiviati in
system_a
e system_b
, ma questo può essere
personalizzato modificando BOARD_SUPER_PARTITION_METADATA_DEVICE
.
In ciascuno dei dispositivi a blocchi sono presenti due slot per i metadati. Viene utilizzato un solo
slot di metadati in ogni dispositivo a blocchi. Ad esempio, i metadati 0 in
system_a
e i metadati 1 in system_b
corrispondono alle partizioni negli slot A e B, rispettivamente. In fase di
runtime, non importa quale slot viene aggiornato.
In questa pagina, gli slot dei metadati sono chiamati Metadati S
(origine) e Metadati T (destinazione). Allo stesso modo, le partizioni sono denominate
system_s
, vendor_t
e così via.
Per ulteriori informazioni sulle configurazioni del sistema di compilazione, consulta Upgrade dei dispositivi.
Per saperne di più su come le partizioni appartengono ai gruppi di aggiornamento, vedi Modifiche alla configurazione della scheda per i nuovi dispositivi.
Un esempio di metadati su un dispositivo è:
- Dispositivo di blocco fisico
system_a
- Metadati 0
- Gruppo
foo_a
- Partizione logica (dinamica)
system_a
- Partizione logica (dinamica)
product_services_a
- Altre partizioni aggiornate da Foo
- Partizione logica (dinamica)
- Gruppo
bar_a
- Partizione logica (dinamica)
vendor_a
- Partizione logica (dinamica)
product_a
- Altre partizioni aggiornate da Bar
- Partizione logica (dinamica)
- Gruppo
- Metadati 1 (non utilizzato)
- Metadati 0
- Dispositivo di blocco fisico
system_b
- Metadati 0 (non utilizzati)
- Metadati 1
- Group foo_b
- Partizione logica (dinamica)
system_b
- Partizione logica (dinamica)
product_services_b
- Altre partizioni aggiornate da Foo
- Partizione logica (dinamica)
- Barra del gruppo_b
- Partizione logica (dinamica)
vendor_b
- Partizione logica (dinamica)
product_b
- Altre partizioni aggiornate da Bar
- Partizione logica (dinamica)
- Group foo_b
Puoi utilizzare lo strumento lpdump
in
system/extras/partition_tools
per scaricare i metadati sul
tuo dispositivo. Ad esempio:
lpdump --slot 0 /dev/block/by-name/system_a
lpdump --slot 1 /dev/block/by-name/system_b
Retrofit di un aggiornamento
Sui dispositivi con Android 9 e versioni precedenti, il client OTA sul dispositivo non supporta la mappatura delle partizioni dinamiche prima dell'aggiornamento. Viene creato un ulteriore set di patch in modo che il mapping possa essere applicato direttamente alle partizioni fisiche esistenti.
Il generatore OTA crea il file super.img
finale che
contiene i contenuti di tutte le partizioni dinamiche, quindi suddivide l'immagine
in più immagini corrispondenti alle dimensioni dei dispositivi a blocchi fisici
corrispondenti a sistema, fornitore e così via. Queste immagini sono denominate
super_system.img
, super_vendor.img
e così via.
Il client OTA applica queste immagini alle partizioni fisiche, anziché
applicarle alle partizioni logiche (dinamiche).
Poiché il client OTA non sa come mappare le partizioni dinamiche, tutti i passaggi post-installazione vengono disattivati automaticamente per queste partizioni quando viene generato il pacchetto di aggiornamento. Per maggiori dettagli, vedi Configurazione post-installazione.
Il flusso di aggiornamento è lo stesso di Android 9.
Prima dell'aggiornamento:
ro.boot.dynamic_partitions= ro.boot.dynamic_partitions_retrofit=
Dopo l'aggiornamento:
ro.boot.dynamic_partitions=true ro.boot.dynamic_partitions_retrofit=true
Aggiornamenti futuri dopo il retrofit
Dopo l'aggiornamento di retrofit, il client OTA viene aggiornato per funzionare con le partizioni dinamiche. Le estensioni delle partizioni di origine non si estendono mai alle partizioni fisiche di destinazione.
Flusso di aggiornamento che utilizza un pacchetto di aggiornamento normale
- Inizializza i metadati della partizione
super
.-
Costruisci nuovi metadati M a partire dai metadati S (metadati di origine).
Ad esempio, se i metadati S utilizzano [
system_s
,vendor_s
,product_s
] come dispositivi di blocco, i nuovi metadati M utilizzano [system_t
,vendor_t
,product_t
] come dispositivi di blocco. Tutti i gruppi e le partizioni vengono eliminati in M. -
Aggiungi gruppi di destinazione e partizioni in base al campo
dynamic_partition_metadata
nel manifest di aggiornamento. Le dimensioni di ogni partizione sono disponibili innew_partition_info
. - Scrivi M in Metadati T.
- Mappa le partizioni aggiunte sul mapper del dispositivo come scrivibili.
-
Costruisci nuovi metadati M a partire dai metadati S (metadati di origine).
Ad esempio, se i metadati S utilizzano [
- Applica l'aggiornamento sui dispositivi bloccati.
- Se necessario, mappa le partizioni di origine sul mapper dei dispositivi come di sola lettura. Questo è necessario per il sideload perché le partizioni di origine non vengono mappate prima dell'aggiornamento.
- Applica un aggiornamento completo o delta a tutti i dispositivi a blocchi nello slot di destinazione.
- Monta le partizioni per eseguire lo script post-installazione, quindi smontale.
- Annulla la mappatura delle partizioni di destinazione.
Flusso di aggiornamento utilizzando un pacchetto di aggiornamento retrofit
Se il pacchetto di aggiornamento retrofit viene applicato su un dispositivo che
abilita già le partizioni dinamiche, il client OTA applica il file
super.img
sui dispositivi a blocchi direttamente. Il flusso di aggiornamento
è simile a un aggiornamento retrofit. Per maggiori dettagli, vedi
Retrofitting di un aggiornamento.
Ad esempio, supponiamo quanto segue:
- Lo slot A è lo slot attivo.
-
system_a
contiene i metadati attivi nello slot 0. -
system_a
,vendor_a
eproduct_a
vengono utilizzati come dispositivi di blocco.
Quando il client OTA riceve un pacchetto di aggiornamento retrofit, applica
super_system.img
su system_b
fisico,
super_vendor.img
su vendor_b
fisico e
super_product.img
su product_b
fisico.
Il dispositivo a blocchi fisico system_b
contiene i metadati corretti per mappare system_b
, vendor_b
e product_b
logici al momento dell'avvio.
Genera pacchetti di aggiornamento
OTA incrementale
Quando vengono generati aggiornamenti OTA incrementali per i dispositivi di retrofit, gli aggiornamenti
dipendono dal fatto che la build di base definisca o meno
PRODUCT_USE_DYNAMIC_PARTITIONS
e
PRODUCT_RETROFIT_DYNAMIC_PARTITIONS
.
-
Se la build di base non definisce le variabili, si tratta di un aggiornamento di
adeguamento. Il pacchetto di aggiornamento contiene il file
super.img
suddiviso e disattiva il passaggio post-installazione. - Se la build di base definisce le variabili, questa operazione equivale a un aggiornamento tipico con partizioni dinamiche. Il pacchetto di aggiornamento contiene le immagini per le partizioni logiche (dinamiche). Il passaggio post-installazione può essere attivato.
OTA completo
Per i dispositivi di retrofit vengono generati due pacchetti OTA completi.
-
$(PRODUCT)-ota-retrofit-$(TAG).zip
contiene sempre la suddivisionesuper.img
e disattiva il passaggio post-installazione per l'aggiornamento di retrofit.-
Viene generato con un argomento aggiuntivo
--retrofit_dynamic_partitions
allo scriptota_from_target_files
. - Può essere applicato a tutte le build.
-
Viene generato con un argomento aggiuntivo
-
$(PRODUCT)-ota-$(TAG).zip
contiene immagini logiche per aggiornamenti futuri.- Applica questa opzione solo alle build con partizioni dinamiche attivate. Consulta i dettagli di seguito sull'applicazione di questa norma.
Rifiuta l'aggiornamento non retrofittato sulle build precedenti
Applica il pacchetto OTA completo standard solo alle build con partizioni dinamiche attive. Se il server OTA è configurato in modo errato e invia questi pacchetti ai dispositivi con Android 9 o versioni precedenti, i dispositivi non si avviano. Il client OTA su Android 9 e versioni precedenti non è in grado di distinguere tra un pacchetto OTA di retrofit e un normale pacchetto OTA completo, pertanto non rifiuterà il pacchetto completo.
Per impedire al dispositivo di accettare l'intero pacchetto OTA, puoi richiedere un passaggio post-installazione per controllare la configurazione esistente del dispositivo. Ad esempio:
device/device_name/dynamic_partitions/check_dynamic_partitions
#!/system/bin/sh DP_PROPERTY_NAME="ro.boot.dynamic_partitions" DP_RETROFIT_PROPERTY_NAME="ro.boot.dynamic_partitions_retrofit" DP_PROPERTY=$(getprop ${DP_PROPERTY_NAME}) DP_RETROFIT_PROPERTY=$(getprop ${DP_RETROFIT_PROPERTY_NAME}) if [ "${DP_PROPERTY}" != "true" ] || [ "${DP_RETROFIT_PROPERTY}" != "true" ] ; then echo "Error: applied non-retrofit update on build without dynamic" \ "partitions." echo "${DP_PROPERTY_NAME}=${DP_PROPERTY}" echo "${DP_RETROFIT_PROPERTY_NAME}=${DP_RETROFIT_PROPERTY}" exit 1 fi
device/device_name/dynamic_partitions/Android.mk
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE:= check_dynamic_partitions LOCAL_MODULE_TAGS := optional LOCAL_MODULE_CLASS := EXECUTABLES LOCAL_SRC_FILES := check_dynamic_partitions LOCAL_PRODUCT_MODULE := true include $(BUILD_PREBUILT)
device/device_name/device.mk
PRODUCT_PACKAGES += check_dynamic_partitions # OPTIONAL=false so that the error in check_dynamic_partitions will be # propagated to OTA client. AB_OTA_POSTINSTALL_CONFIG += \ RUN_POSTINSTALL_product=true \ POSTINSTALL_PATH_product=bin/check_dynamic_partitions \ FILESYSTEM_TYPE_product=ext4 \ POSTINSTALL_OPTIONAL_product=false \
Quando il pacchetto OTA normale viene applicato su un dispositivo senza partizioni dinamiche attive, il client OTA esegue check_dynamic_partitions
come passaggio post-installazione e rifiuta l'aggiornamento.