In che modo le partizioni A/B e gli aggiornamenti continui influiscono sullo sviluppo personalizzato su XDA

Potresti aver già sentito parlare di Seamless Updates. Implica qualcosa chiamato "partizioni A/B". Che cos'è e in che modo influisce sullo sviluppo personalizzato su XDA?

Quando è stato rilasciato Android Nougat, abbiamo parlato di tutti i tipi di nuove funzionalità. Abbiamo ottenuto un'interfaccia utente appena aggiornata per i principianti insieme alle funzionalità multifinestra tanto attese e al supporto dell'API grafica Vulkan. Ma un'aggiunta nascosta è sfuggita alla maggior parte degli utenti. Android Nougat ha introdotto gli "Aggiornamenti continui" sui dispositivi che supportano le partizioni A/B. La stragrande maggioranza dei dispositivi Android esistenti (esclusi i nuovi Google Pixel e Google Pixel XL) all'epoca non disponeva di partizioni A/B e quindi non poteva sfruttare gli aggiornamenti continui. La premessa di base di questa funzionalità è che il dispositivo abbia un secondo set di partizioni di sistema, avvio, fornitore e altre partizioni importanti e quando si ottiene un OTA aggiornamento l'aggiornamento avviene in background mentre al secondo set di partizioni vengono applicate le patch, il che consente di riavviare il sistema in una build software aggiornata senza problemi. Se un aggiornamento fallisce, verrai riportato a una build funzionante, il che significa che le aziende avranno meno grattacapi da affrontare e i consumatori saranno più protetti.

Il supporto di aggiornamenti continui non è un requisito per nessun nuovo dispositivo Android, a differenza di Project Treble. Pertanto, la stragrande maggioranza dei nuovi dispositivi Android non supporta questa funzionalità. Finora abbiamo tenuto un elenco di tutti i dispositivi supportatied è chiaro che questa funzionalità non è ampiamente supportata. È un peccato perché le partizioni A/B apportano molti vantaggi sia agli utenti regolari che agli utenti esperti. Tuttavia, la funzionalità ha una cattiva reputazione nella comunità degli appassionati perché è percepita come se rendesse più difficile lo sviluppo di Android e il flashing delle modifiche personalizzate. In realtà non è così, quindi volevamo demistificare gli aggiornamenti continui e spiegare in che modo le partizioni A/B influenzano lo sviluppo personalizzato su XDA.

Mille grazie al membro senior di XDA npjohnson, UN collaboratore di LineageOS e manutentore del Motorola Moto Z2 Force, che ci ha aiutato a verificare questo articolo.


Partizioni su un dispositivo Android

Una partizione è semplicemente una sezione discreta della memoria interna del telefono in cui vengono conservati i dati. Il tipo di dati conservati su ciascuna partizione dipende dall'hardware, dal sistema operativo e da molti altri fattori. Il bootloader ne avrà uno, il sistema (sistema operativo Android) ne avrà uno, i dati utente ne avranno uno... E così via e così via. Quando vedi che le persone parlano di "/system" e "/cache", si riferiscono ai nomi dati per quelle partizioni. Il OnePlus 6, ad esempio, lo ha 72 partizioni. Sembra molto, ma OnePlus 6 è uno dei dispositivi che supporta aggiornamenti continui, il che significa che molte di queste partizioni sono semplicemente duplicate l'una dell'altra.

Output parziale delle partizioni su OnePlus 6. Alcune partizioni A/B sono sottolineate a scopo dimostrativo.

Ci sono molte partizioni su un dispositivo di cui non dovrai mai preoccuparti come utente. Molte di queste partizioni non vengono mai modificate durante il flashing di ROM personalizzate, kernel, ripristini o modifiche come Magisk o Xposed. Molte di queste partizioni saranno inutilizzate per i nostri scopi o saranno troppo pericolose da toccare a meno che tu non sappia cosa stai facendo (XLOADER e OEMINFO su Huawei/Honor mi vengono in mente i dispositivi.) Per la stragrande maggioranza degli utenti Android, le partizioni di cui ci occupiamo principalmente sono sistema, avvio, ripristino, dati utente e, più recentemente, fornitore e vbmeta. Ecco una breve spiegazione dello scopo di ciascuna partizione:

  • sistema: contiene il sistema operativo Android, le librerie di sistema, le app di sistema e altri supporti di sistema come animazioni di avvio, sfondi stock, suonerie, ecc.
  • boot - contiene il kernel, il ramdisk e, sui dispositivi A/B, anche il ripristino
  • ripristino: contiene il ripristino, dove TWRP viene più comunemente flashato su dispositivi solo A (i dispositivi A/B non hanno una partizione di ripristino dedicata)
  • userdata: contiene tutti i dati dell'app, del sistema e della memoria interna
  • fornitore: contiene HAL specifici della piattaforma e del dispositivo, i file necessari affinché il sistema operativo Android comunichi con l'hardware sottostante
  • vbmeta - la partizione per Android Verified Boot 2.0 che verifica l'integrità del processo di avvio

Gli OEM dei dispositivi possono modificare i propri schemi di partizione per utilizzare il layout che desiderano. Ad esempio, Huawei divide la partizione di avvio in ramdisk_recovery e kernel. Ci sono anche molte partizioni extra che possono contenere altre app di sistema come cust, product e oem, e mentre questi sono sicuri da modificare, generalmente non è consigliabile se si desidera rendere più semplice il ritorno in magazzino. Quindi dove giocano un ruolo le partizioni A/B?


Lo schema di partizione A/B

Come funzionano gli aggiornamenti sui dispositivi con aggiornamenti continui

L'immagine molto semplice che ho realizzato di seguito illustra come viene gestito un aggiornamento su un dispositivo con supporto per partizioni A/B. La partizione illustrata è la partizione di sistema, sebbene anche altre partizioni come avvio e fornitore possano essere aggiornate con qualsiasi aggiornamento OTA fornito da un OEM. Questo processo di aggiornamento avviene non solo con i principali aggiornamenti della versione Android ma anche con gli aggiornamenti delle patch di sicurezza.

  1. Iniziamo con due partizioni di sistema, system_a e system_b, entrambe sulla stessa versione di Android.
  2. Supponendo che system_a sia attivo, l'aggiornamento OTA patcherà system_b, la partizione inattiva, in background.
  3. system_a è impostato su inattivo e system_b diventa attivo una volta riavviato l'utente.
  4. La partizione ora inattiva, system_a, verrà aggiornata quando verrà lanciato il prossimo aggiornamento OTA.

Quali sono i vantaggi di questo processo di aggiornamento?

  1. Se un aggiornamento fallisce, il dispositivo tornerà alla build funzionante nell'altro slot.
  2. I tuoi dati vengono mantenuti perfettamente intatti, anche se l'aggiornamento viene interrotto, poiché esiste solo una partizione (dati utente) che ospita i tuoi dati.
  3. Streaming di aggiornamenti: se la partizione dati è piena, l'aggiornamento può essere scaricato e trasmesso in streaming allo slot inattivo. È una funzionalità piuttosto interessante e significa che non devi sprecare spazio di archiviazione temporaneo per i tuoi aggiornamenti. Ecco perché non esiste una partizione della cache sui dispositivi A/B poiché non sono più necessari.

Che impatto ha lo schema di partizionamento A/B sullo storage di un dispositivo?

Il fatto che gli aggiornamenti continui comportino una serie di partizioni duplicate significa che stai perdendo molto spazio di archiviazione? Affatto. Google afferma che i dispositivi con supporto di aggiornamento continuo dovrebbero avere solo poche centinaia di megabyte in meno grazie alla rimozione delle partizioni /cache e /recovery. La rimozione di entrambe bilancia il costo dell'aggiunta di un secondo set di partizioni. Secondo Google, l'immagine di sistema A/B del Pixel è grande la metà dell'immagine di sistema solo A. La maggior parte dell'utilizzo dello spazio di archiviazione aggiuntivo deriva in realtà dall'aggiunta di una partizione del secondo fornitore. Ciò ha senso poiché la partizione del fornitore ospita tutti i binari proprietari utilizzati dagli OEM (parte di Project Treble), quindi si prevede che occuperà un bel po' di spazio. Anche se Google sconsiglia di avere il partizionamento A/B su dispositivi con 4 GB di spazio di archiviazione (poiché rappresenta quasi il 10% dello spazio di archiviazione totale disponibile), lo consiglia su dispositivi con 8 GB e superiori.

Ecco una ripartizione dello spazio di archiviazione utilizzato su un Google Pixel con e senza partizioni A/B.

Dimensioni delle partizioni

A/B

Solo A

Boot loader

50MB*2

50 MB

Stivale

32MB*2

32 MB

Recupero

32 MB

Cache

100 MB

Radio

70MB*2

70 MB

Venditore

300MB*2

300 MB

Sistema

2048MB*2

4096 MB

Totale

5000 MB

4680 MB

Cosa è successo alla partizione di ripristino?

Il kernel Linux sottostante sui dispositivi Android è ciò che consente ad Android di riconoscere e utilizzare correttamente l'hardware su uno smartphone. Sui dispositivi Android solo A, generalmente hai due versioni del kernel: una è racchiusa nella partizione di ripristino mentre l'altra si trova nella partizione di avvio. Sui dispositivi A/B che supportano aggiornamenti continui, il ripristino è ora all'interno dell'immagine di avvio insieme al kernel. La funzione principale del ripristino era installare gli aggiornamenti, ma poiché ciò è gestito dal sistema stesso (aggiornamento_motore) mentre Android è avviato, la partizione di ripristino dedicata non è più necessaria.

Per installare una recovery personalizzata sui dispositivi A/B dobbiamo quindi modificare la partizione di boot e sostituire la recovery stock con la nostra. Questo è il motivo per cui per installare TWRP è necessario utilizzare prima un comando fastboot per avviare un'immagine di avvio personalizzata e Poi eseguire il flashing dello script di installazione TWRP, poiché l'avvio rapido non può applicare patch alle partizioni, ma solo eseguirne il flashing completo. Potresti tecnicamente pre-patch la tua immagine di avvio esistente con TWRP e poi eseguirne il flashing tramite fastboot, ma è più un problema che un valore. Lo script di installazione TWRP applica le patch ad entrambe le partizioni boot_a e boot_b per installare TWRP.

Fatto curioso: Android update_engine che gestisce gli aggiornamenti continui è sostanzialmente copiato direttamente da Chrome OS. Solo recentemente sono state rimosse stringhe contenenti "Chrome OS" dal registro di update_engine per evitare confusione per chiunque controlli logcat.

Il mio smartphone Android supporta le partizioni A/B per aggiornamenti senza interruzioni?

Mentre noi mantenere un elenco di tutti i dispositivi che lo supportano, puoi anche controllare facilmente tu stesso.


In che modo gli aggiornamenti continui influiscono sullo sviluppo personalizzato?

Percezione dell'utente delle partizioni A/B

Considerati da molti utenti un ostacolo allo sviluppo di software personalizzato, gli aggiornamenti continui sono in realtà un vantaggio per gli sviluppatori. Il motivo per cui si ritiene che i dispositivi A/B abbiano uno scarso supporto allo sviluppo dipende dal prezzo dei primi dispositivi A/B. Dopotutto i dispositivi Google Pixel sono stati tra i primi a supportare aggiornamenti continui e rispetto agli smartphone Nexus del passato erano relativamente costosi. Inoltre, grazie alla miriade di miglioramenti che Google ha apportato al sistema operativo Android che ha realizzato ROM personalizzate e modifiche meno popolari sui dispositivi Google, gli smartphone Google Pixel non hanno avuto successo sui nostri forum quanto i Nexus smartphone. Una combinazione di fattori esterni ha portato a una diminuzione dello sviluppo personalizzato sugli smartphone Google Pixel, anche se la maggior parte degli utenti ha scelto invece di dare la colpa al supporto della partizione A/B. Confronta la disponibilità dello sviluppo personalizzato su dispositivi come Google Pixel con dispositivi come Xiaomi Mi A1 sui nostri forum.

Inoltre, la mancanza di comprensione di come le partizioni A/B abbiano cambiato il modo in cui gli utenti devono installare ROM personalizzate, kernel, ripristini e modifiche ha reso impopolare il supporto delle partizioni A/B. Con il ripristino che ora risiede all'interno dell'immagine di avvio, eseguire il flashing delle modifiche nell'ordine sbagliato come Magisk o Xposed può causare conflitti e portare a un bootloop. L'ordine in cui esegui il flashing di queste mod può essere importante, anche se nel caso di ROM personalizzate non dovresti preoccuparti di quale slot stai flashando. Contrariamente alla credenza comune, lo script di installazione per la maggior parte delle ROM personalizzate non esegue il flashing su entrambi gli slot. Per lo più non devi preoccuparti di questo poiché non dovresti aver bisogno di scambiare gli slot manualmente.

Come gli sviluppatori visualizzano le partizioni A/B

Quando creano una ROM, gli sviluppatori possono utilizzare entrambe le partizioni per testare build separate. Se uno non funziona, può semplicemente tornare alla partizione funzionante e ricostruire la propria ROM. Gli sviluppatori possono anche verificare le regressioni semplicemente installando un aggiornamento, cambiando la partizione attiva e confrontando le due senza dover cancellare i dati. Ecco come il team LineageOS vede il supporto delle partizioni A/B:

"Molti nella comunità Android hanno criticato A/B definendolo 'difficile da supportare' e 'non adatto agli sviluppatori', quando in realtà, implementato correttamente, è più facile da sostenere e altrettanto facile da usare per gli sviluppatori." - jrizzoli, Registro delle modifiche LineageOS 19

La difficoltà iniziale con il supporto A/B per gli sviluppatori è derivata dalla modifica degli strumenti esistenti per supportare questi dispositivi. Lo sviluppatore di Magisk, topjohnwu, ha aggiunto il supporto ufficiale per Google Pixel un anno dopo rilasciato, non perché fosse difficile, ma piuttosto perché gli ci volle un anno per ottenere effettivamente il dispositivo lavorare su. Supporto TWRP è arrivato abbastanza rapidamente sui dispositivi A/B dopo che lo sviluppatore principale, Dees_Troy, ci ha provato. Lineage OS 15.1 ora supporta Dispositivi A/B dopo che i volontari hanno trovato il tempo per correggere il loro script addon.d.

Come aggiornare un dispositivo A/B dotato di ripristino personalizzato, kernel o altre modifiche

ROM personalizzate

Aggiornare gli aggiornamenti su un dispositivo con una ROM personalizzata significa che dovrai stare attento anche a quale slot stai aggiornando, giusto? Non proprio. TWRP gestirà effettivamente gran parte di questo per te e per impostazione predefinita è lo slot inattivo per il flashing di una ROM personalizzata. Se il tuo slot attivo è A e esegui il flashing di una ROM personalizzata, in realtà stai flashando sullo slot B. Al riavvio, lo slot attivo ora è B. Gli sviluppatori possono modificare lo script di installazione ed eseguire il flashing su entrambi gli slot per semplificare il compito dell'utente finale, sebbene la maggior parte degli script di installazione della ROM personalizzata attualmente flashno solo su un singolo slot. Infine, le ROM personalizzate possono implementare un aggiornamento A/B nella loro ROM in modo che gli utenti non debbano nemmeno scherzare aggiornamenti manuali: l'ultimo LineageOS 15.1 include uno strumento Lineage Updater e XDA Senior Member USA-RedDragon fatto un aggiornamento A/B generico che altri sviluppatori possono utilizzare.

ROM di serie

Ma non è problematico se sul tuo dispositivo è installata la ROM stock con varie modifiche e desideri installare un aggiornamento senza perdere tutte queste modifiche? Può essere se non conosci i passaggi giusti per installare un aggiornamento. Su OnePlus 6, ad esempio, non puoi eseguire il flashing di un OTA incrementale sul tuo dispositivo modificato perché l'OTA incrementale tenterà di applicare la patch all'immagine di avvio modificata. Pertanto, probabilmente ti ritroverai con un bootloop, ed è per questo che devi eseguire il flashing dell'aggiornamento ROM completo per sovrascrivere completamente l'immagine di avvio modificata. Ecco i passaggi generali che devi eseguire per installare un aggiornamento OxygenOS sul tuo OnePlus 6 mantenendo comunque TWRP, Magisk e, facoltativamente, un kernel personalizzato.

  1. Scaricato l'ultimo ROM completa cerniera lampo
  2. Flasha lo zip completo della ROM in recovery
  3. (Facoltativo) Flash kernel personalizzato
  4. Programma di installazione TWRP flash
  5. Riavvia direttamente in modalità di ripristino
  6. Flash Magisk

Sui dispositivi Google Pixel, puoi eseguire il flashing dell'immagine di fabbrica senza cancellare i dati, quindi avvia TWRP, installa TWRP tramite lo script di installazione, quindi installa Magisk.

Estrazione di un aggiornamento per eseguire il flashing di immagini di singole partizioni

I file di aggiornamento per molti dispositivi A/B sono leggermente diversi rispetto ai dispositivi solo A. Non sono più solo un file zip contenente molte immagini (escluse le immagini di fabbrica di Google e Razer), ma hanno la forma di un file payload.bin. Puoi estrarre questo file e flashare ogni parte manualmente, ma per farlo è necessario uno strumento speciale. Se sei interessato a sapere come farlo su OnePlus 6, Xiaomi Mi A1 e molti altri dispositivi A/B, continua a leggere.

Impostazione per estrarre payload.bin

  1. Assicurati di avere Python 3.6 installato.
  2. Scarica payload_dumper.py e update_metadata_pb2.py Qui.
  3. Estrai il tuo zip OTA e posiziona payload.bin nella stessa cartella di questi file.
  4. Apri PowerShell, Prompt dei comandi o Terminale a seconda del tuo sistema operativo.
  5. Immettere il seguente comando: python -m pip install protobuf
  6. Al termine, inserisci questo comando: python payload_dumper.py payload.bin
  7. Questo inizierà a estrarre le immagini all'interno del file payload.bin nella cartella corrente in cui ti trovi.

Puoi eseguire il flashing di ciascuna di queste immagini separatamente ora tramite fastboot, se lo desideri. La sezione successiva mostra come farlo.

Utilizzo dell'avvio rapido per eseguire il flashing delle immagini su un dispositivo che supporta aggiornamenti continui

Esistono numerosi comandi esclusivi dei dispositivi del sistema di partizione A/B. Puoi cambiare il tuo slot attivo e flashare su slot specifici. Se hai un Project Treble-dispositivo compatibile e voglio imparare a farlo flash immagini di sistema generiche, dovresti avere familiarità con questi comandi. Dai un'occhiata alla tabella qui sotto.

Comandi di avvio rapido

Comando

Ottieni lo slot attivo corrente

fastboot getvar tutto | grep "current-slot"Se utilizzi un PC Windows, il comando "grep" non funzionerà.

Imposta l'altro slot come attivo

fastboot set_active altro

Imposta lo slot specificato come attivo

fastboot set_active $ORfastboot --set-active=_$slotdove $ è a o b

Immagine flash nella partizione specificata nello slot corrente

partizione flash di avvio rapido partizione.img

Immagine flash nella partizione specificata nello slot specificato

partizione flash fastboot_a partizione.img partizione flash fastboot_b partizione.img

(Nota: sui dispositivi A/B, puoi specificare una partizione in un particolare slot su cui eseguire il flashing oppure puoi tralasciare il suffisso dello slot e lampeggerà sullo slot attivo corrente. Ad esempio, puoi sostituire "partition" nel comando Flash con "system", "system_a" o "system_b.")

Sui PC Windows non puoi usare grep, quindi rimuovi quella parte e cerca "current-slot".

Una parola su Project Treble e aggiornamenti continui

Un malinteso comune è che il supporto per Project Treble e il supporto per le partizioni A/B siano correlati tra loro, ma in realtà non è così. Avere l'uno non implica l'altro. Il Motorola Moto Z2 Force utilizza uno schema di partizionamento A/B ma non supporta Treble. D'altra parte, l'Honor 9 Lite supporta Project Treble, ma è un dispositivo A-only.

L'Honor 9 Lite supporta Project Treble ma non supporta gli aggiornamenti continui

Domande frequenti/Riepilogo

  • Quali sono i vantaggi del partizionamento A/B?
    • Il partizionamento A/B ti consente di aggiornare il tuo smartphone Android mentre lo usi, semplicemente riavviandolo quando sei pronto per avviare la nuova versione. Funziona anche come protezione contro i mattoni: se l'aggiornamento va storto, tornerai all'installazione funzionante.
  • Il partizionamento A/B ostacola lo sviluppo?
    • Anche se gli sviluppatori hanno impiegato un po' di tempo per adattarsi, la risposta è praticamente no. In effetti, può aiutare gli sviluppatori in quanto possono eseguire il dual boot della loro ROM personalizzata con la vecchia versione e una nuova versione di test per verificare le regressioni.
  • In che modo le partizioni A/B influiscono su mod come kernel personalizzati, Magisk o Xposed?
    • Devi stare attento quando li installi, ma al momento non ci sono problemi. Magisk supporta ufficialmente i dispositivi con aggiornamenti continui e finché esegui il flashing delle cose nell'ordine giusto non dovresti avere problemi. Assicurati di eseguire il flashing del kernel personalizzato prima di eseguire il flashing delle altre mod e dovresti essere a posto.
  • Posso eseguire il flashing di due ROM diverse su ciascuna partizione e dual boot?
    • In teoria sì. Tuttavia sorgono problemi a causa della partizione dei dati condivisi, quindi non è consigliabile.
  • Avere uno schema di partizione A/B significa avere meno spazio di archiviazione?
    • No! Google afferma che i dispositivi che supportano aggiornamenti continui sacrificano solo poche centinaia di megabyte di spazio di archiviazione per supportarlo. I benefici superano quel costo.
  • Il mio dispositivo supporta le partizioni A/B, significa che posso utilizzare un'immagine di sistema generica di Project Treble?
    • Non necessariamente. Project Treble e il supporto A/B non sono correlati. Il Motorola Moto Z2 Force non supporta Project Treble, ma supporta lo schema di partizione A/B.
  • Il mio dispositivo supporta Project Treble, significa che ho uno schema di partizione A/B?
    • Non è sempre così. L'Honor 9 Lite è un ottimo esempio in quanto supporta Project Treble ma non ha uno schema di partizione A/B.
  • Perché devo prima avviare TWRP con fastboot e poi flasharlo?
    • Ciò è dovuto al funzionamento dell'avvio rapido e al fatto che la partizione di ripristino non esiste più. Il ripristino viene posizionato all'interno della partizione di avvio, quindi dobbiamo modificare sia boot_a che boot_b. Non puoi patchare una partizione in fastboot, ma solo eseguirne il flashing. In teoria potresti creare un'immagine di avvio prepatchata e poi eseguirne il flashing.
  • Ci sono pericoli con le partizioni A/B? In che modo la protezione rollback influisce sulle cose?
    • Google ha fatto del suo meglio per rendere questo non un problema, ma nel caso del Motorola Moto Z2 Forza, sono noti casi in cui un dispositivo ha riattivato lo slot precedente dopo l'aggiornamento ad Android Oreo. Ciò significava che entrava in funzione la protezione rollback e i proprietari dei dispositivi potevano salvare il proprio smartphone solo con il ripristino EDL. Google afferma che la protezione dal rollback entra in azione solo dopo il primo avvio, quindi lo slot deve essere completamente funzionante dopo un aggiornamento prima che non sia più possibile effettuare il downgrade.