È possibile utilizzare lo strumento ota_from_target_files
fornito in build/make/tools/releasetools
per creare pacchetti OTA completi e incrementali per dispositivi che utilizzano aggiornamenti di sistema A/B o aggiornamenti di sistema non A/B . Lo strumento prende come input il file target-files.zip
prodotto dal sistema di build Android.
Per i dispositivi con Android 11 o versioni successive, puoi creare un pacchetto OTA per più dispositivi con SKU diversi. Ciò richiede la configurazione dei dispositivi di destinazione per l'utilizzo di impronte digitali dinamiche e l'aggiornamento dei metadati OTA per includere il nome del dispositivo e l'impronta digitale nelle voci pre e post-condizione.
Pacchetti OTA basati su file deprecati di Android 8.0 per dispositivi non A/B, che devono invece utilizzare pacchetti OTA basati su blocchi . Per generare pacchetti OTA basati su blocchi o dispositivi con Android 7.x o versioni precedenti, passa l'opzione --block
al parametro ota_from_target_files
.
Creazione di aggiornamenti completi
Un aggiornamento completo è un pacchetto OTA che contiene l'intero stato finale del dispositivo (partizioni di sistema, di avvio e di ripristino). Finché il dispositivo è in grado di ricevere e applicare il pacchetto, il pacchetto può installare la build indipendentemente dallo stato corrente del dispositivo. Ad esempio, i seguenti comandi utilizzano gli strumenti di rilascio per creare l'archivio target-files.zip
per il dispositivo tardis
.
. build/envsetup.sh && lunch tardis-eng
mkdir dist_output
make dist DIST_DIR=dist_output
make dist
compila un pacchetto OTA completo (in $OUT
). Il file .zip
risultante contiene tutto il necessario per costruire pacchetti OTA per il dispositivo tardis
. Puoi anche creare ota_from_target_files
come binario python e chiamarlo per creare pacchetti completi o incrementali.
ota_from_target_files dist_output/tardis-target_files.zip ota_update.zip
Il percorso ota_from_target_files
è impostato in $PATH
e il binario python risultante si trova nella directory out/
.
ota_update.zip
è ora pronto per essere inviato ai dispositivi di test (tutto è firmato con la chiave di test). Per i dispositivi degli utenti, genera e usa le tue chiavi private come descritto in dettaglio in Firma delle build per il rilascio .
Creazione di aggiornamenti incrementali
Un aggiornamento incrementale è un pacchetto OTA che contiene patch binari ai dati già presenti sul dispositivo. I pacchetti con aggiornamenti incrementali sono in genere più piccoli in quanto non devono includere file non modificati. Inoltre, poiché i file modificati sono spesso molto simili alle versioni precedenti, il pacchetto deve solo includere una codifica delle differenze tra i due file.
È possibile installare un pacchetto di aggiornamento incrementale solo sui dispositivi che dispongono della build di origine utilizzata nella creazione del pacchetto. Per creare un aggiornamento incrementale, è necessario il file target_files.zip
della build precedente (quella da cui si desidera aggiornare ) e il file target_files.zip
della nuova build. Ad esempio, i seguenti comandi utilizzano gli strumenti di rilascio per creare un aggiornamento incrementale per il dispositivo tardis
.
ota_from_target_files -i PREVIOUS-tardis-target_files.zip dist_output/tardis-target_files.zip incremental_ota_update.zip
Questa build è molto simile alla build precedente e il pacchetto di aggiornamento incrementale ( incremental_ota_update.zip
) è molto più piccolo dell'aggiornamento completo corrispondente (circa 1 MB invece di 60 MB).
Distribuisci un pacchetto incrementale solo ai dispositivi che eseguono esattamente la stessa build precedente utilizzata come punto di partenza del pacchetto incrementale. Devi eseguire il flash delle immagini in PREVIOUS-tardis-target_files.zip
o PREVIOUS-tardis-img.zip
(entrambi compilati con make dist
, da flashare con fastboot update
), invece di quelli nella directory PRODUCT_OUT
(realizzata con make
, che verrà eseguito con fastboot flashall
di avvio rapido). Il tentativo di installare il pacchetto incrementale su un dispositivo con qualche altra build provoca un errore di installazione. Quando l'installazione fallisce, il dispositivo rimane nello stesso stato di lavoro (eseguendo il vecchio sistema); il pacchetto verifica lo stato precedente di tutti i file che aggiorna prima di toccarli, quindi il dispositivo non è bloccato in uno stato di metà aggiornamento.
Per la migliore esperienza utente, offri un aggiornamento completo ogni 3-4 aggiornamenti incrementali. Ciò consente agli utenti di aggiornarsi sull'ultima versione ed evitare una lunga sequenza di installazione di aggiornamenti incrementali.
Creazione di pacchetti OTA per più SKU
Android 11 o versioni successive supporta l'utilizzo di un unico pacchetto OTA per più dispositivi con diverse SKU. Ciò richiede la configurazione dei dispositivi di destinazione per l'utilizzo di impronte digitali dinamiche e l'aggiornamento dei metadati OTA (tramite strumenti OTA) per includere il nome del dispositivo e l'impronta digitale nelle voci delle condizioni pre e post.
Informazioni sugli SKU
Il formato di una SKU è una variazione dei valori dei parametri build combinati ed è in genere un sottoinsieme non dichiarato dei parametri build_fingerprint
correnti. Gli OEM possono utilizzare qualsiasi combinazione di parametri di build approvati da CDD per uno SKU utilizzando anche una singola immagine per tali SKU. Ad esempio, il seguente SKU ha più varianti:
SKU = <product><device><modifierA><modifierB><modifierC>
-
modifierA
è il livello del dispositivo (come Pro, Premium o Plus) -
modifierB
è la variazione hardware (come la radio) -
modifierC
è la regione, che può essere generale (come NA, EMEA o CHN ) o specifica per paese o lingua (come JPN, ENG o CHN)
Molti OEM utilizzano una singola immagine per più SKU, quindi derivano il nome del prodotto finale e l'impronta digitale del dispositivo in fase di esecuzione dopo l'avvio del dispositivo. Questo processo semplifica il processo di sviluppo della piattaforma, consentendo ai dispositivi con personalizzazioni minori ma con nomi di prodotti diversi di condividere immagini comuni (come tardis
e tardispro
).
Utilizzo di impronte digitali dinamiche
Un'impronta digitale è una concatenazione definita di parametri di build come ro.product.brand
, ro.product.name
e ro.product.device
. L'impronta digitale di un dispositivo deriva dall'impronta digitale della partizione di sistema e viene utilizzata come identificatore univoco delle immagini (e byte) in esecuzione sul dispositivo. Per creare un'impronta digitale dinamica , utilizzare la logica dinamica nel file build.prop
del dispositivo per ottenere il valore delle variabili del bootloader all'avvio del dispositivo, quindi utilizzare quei dati per creare un'impronta digitale dinamica per quel dispositivo.
Ad esempio, per utilizzare le impronte digitali dinamiche per i dispositivi tardispro
tardis
aggiorna i seguenti file come mostrato di seguito.
Aggiorna il
odm/etc/build_std.prop
in modo che contenga la riga seguente.ro.odm.product.device=tardis
Aggiorna il
odm/etc/build_pro.prop
in modo che contenga la riga seguente.ro.odm.product.device=tardispro
Aggiorna il
odm/etc/build.prop
in modo che contenga le seguenti righe.ro.odm.product.device=tardis import /odm/etc/build_${ro.boot.product.hardware.sku}.prop
Queste righe impostano dinamicamente il nome del dispositivo, l'impronta digitale e i valori ro.build.fingerprint
in base al valore della proprietà del bootloader ro.boot.product.hardware.sku
(che è di sola lettura).
Aggiornamento dei metadati del pacchetto OTA
Un pacchetto OTA contiene un file di metadati ( META-INF/com/android/metadata
) che descrive il pacchetto, comprese le precondizioni e le postcondizioni del pacchetto OTA. Ad esempio, il codice seguente è il file di metadati per un pacchetto OTA destinato al dispositivo tardis
.
post-build=google/tardis/tardis:11/RP1A.200521.001/6516341:userdebug/dev-keys
post-build-incremental=6516341
post-sdk-level=30
post-security-patch-level=2020-07-05
post-timestamp=1590026334
pre-build=google/tardis/tardis:11/RP1A.200519.002.A1/6515794:userdebug/dev-keys
pre-build-incremental=6515794
pre-device=tardis
I valori pre-device
, pre-build-incremental
e pre-build
definiscono lo stato che un dispositivo deve avere prima che il pacchetto OTA possa essere installato. I valori post-build-incremental
e post-build
definiscono lo stato che dovrebbe avere un dispositivo dopo l'installazione del pacchetto OTA. I valori dei campi pre-
e post-
sono derivati dalle seguenti proprietà di build corrispondenti.
- Il valore
pre-device
è derivato dalla proprietà buildro.product.device
. - I valori incrementali
pre-build-incremental
epost-build-incremental
sono derivati dalla proprietà buildro.build.version.incremental
. - I valori
pre-build
epost-build
sono derivati dalla proprietà buildro.build.fingerprint
.
Sui dispositivi che eseguono Android 11 o versioni successive, puoi usare il flag --boot_variable_file
negli strumenti OTA per specificare un percorso a un file che contiene i valori delle variabili di runtime utilizzate per creare l'impronta digitale dinamica del dispositivo. I dati vengono quindi utilizzati per aggiornare i metadati OTA in modo da includere il nome del dispositivo e l'impronta digitale nelle condizioni pre-
e post-
(utilizzando il carattere pipe | come delimitatore). Il flag --boot_variable_file
ha la sintassi e la descrizione seguenti.
- Sintassi:
--boot_variable_file <path>
- Descrizione: specifica un percorso a un file che contiene i possibili valori delle proprietà
ro.boot.*
. Utilizzato per calcolare le possibili impronte digitali di runtime quando alcune proprietàro.product.*
vengono sovrascritte dall'istruzione import. Il file prevede una proprietà per riga in cui ogni riga ha il seguente formato:prop_name=value1,value2
.
Ad esempio, quando la proprietà è ro.boot.product.hardware.sku=std,pro
, i metadati OTA per i dispositivi tardispro
tardis
mostrati di seguito.
post-build=google/tardis/tardis:11/<suffix>|google/tardis/tardispro:11/<suffix>
pre-build=google/tardis/tardis:11/<suffix>|google/tardis/tardispro:11/<suffix>
pre-device=tardis|tardispro
Per supportare questa funzionalità sui dispositivi con Android 10, vedere l' implementazione di riferimento . Questo elenco di modifiche analizza in modo condizionale le istruzioni di import
nel file build.prop
, che consente di riconoscere e riflettere le sostituzioni delle proprietà nei metadati OTA finali.