Android 11 supporta i riavvii soft, ovvero
i riavvii in fase di runtime dei processi nello spazio utente utilizzati per applicare gli aggiornamenti che
richiedono un riavvio (ad esempio, gli aggiornamenti ai pacchetti APEX). Al momento, il riavvio
soft è limitato ai processi avviati dopo il montaggio di userdata.
Un riavvio soft viene richiesto nei seguenti modi:
A partire dal giorno
PowerManager, chiamando il numeroPowerManager.reboot(PowerManager.REBOOT_USERSPACE)Dalla shell, utilizzando
adb shell svc power reboot userspaceoadb reboot userspace
Dopo un riavvio soft, l'archivio delle credenziali criptato rimane sbloccato.
Se un dispositivo supporta i riavvii soft, il
metodo dell'API PowerManager.isRebootingUserspace() restituisce true e il valore
della proprietà di sistema init.userspace_reboot.is_supported è uguale a 1.
Se il dispositivo non supporta i riavvii soft, le chiamate a
PowerManager.reboot(PowerManager.REBOOT_USERSPACE), adb reboot
userspace e adb shell svc power reboot userspace non vanno a buon fine.
Esecuzione del riavvio silenzioso
Dopo aver richiesto un riavvio soft (tramite PowerManager o da una shell),
init esegue i seguenti passaggi:
Riceve
sys.powerctl=reboot,userspace.Forca un processo
UserspaceRebootWatchdogThread()separato per monitorare il riavvio soft.Attiva un'azione
userspace-reboot-requested, che reimposta tutte le proprietà di sistema che potrebbero influire sul riavvio soft. Proprietà interessate:sys.usb.configsys.usb.statesys.boot_completeddev.bootcompletesys.init.updatable_crashingsys.init.updatable_crashing_process_nameapexd.statussys.user.0.ce_availablesys.shutdown.requestedservice.bootanim.exit
Le proprietà precedenti devono essere impostate di nuovo durante la sequenza di avvio. Se necessario, puoi reimpostare le proprietà aggiuntive. Per alcuni esempi, consulta l'azione
on userspace-reboot-requestedinrootdir/init.rc.Esegue la funzione
DoUserspaceRebootche esegue le seguenti azioni:- Invia
SIGTERMai processi avviati dopo il montaggio diuserdatae attende che si arrestino. - Una volta raggiunto il timeout, invia
SIGKILLper terminare tutti i processi in esecuzione. - Chiamate
/system/bin/vdc volume reset. - Smonta il dispositivo di supporto zRAM.
- Smonta i pacchetti APEX attivi.
- Torna allo spazio dei nomi di montaggio del bootstrap.
- Attiva l'azione
userspace-reboot-resume.
- Invia
Se è stato richiesto il checkpointing del file system prima del riavvio soft,
userdata viene rimontato in modalità checkpointing durante l'azione
userspace-reboot-fs-remount (vedi la sezione seguente per i dettagli). Un
riavvio soft viene considerato dopo che sys.boot_completed property è impostato
su 1. Al termine del riavvio soft, il display rimane spento e
per riattivarlo è necessaria un'interazione esplicita dell'utente.
Checkpointing del file system
Se è stato richiesto un checkpoint del file system prima del riavvio soft,
userdata viene rimontato in modalità di checkpoint durante il riavvio soft.
La logica di rimontaggio è implementata nella funzione
fs_mgr_remount_userdata_into_checkpointing e varia a seconda dei metodi di checkpointing. Nello specifico, quando
userdata supporta:
Checkpointing a livello di file system (ad esempio,
f2fs),userdataviene rimontato con l'opzionecheckpoint=disable.Checkpointing a livello di blocco (ad esempio
ext4), quindi/dataviene smontato e tutti i dispositivi mapper del dispositivo principale su cui era montato vengono distrutti. Successivamente,userdataviene montato utilizzando lo stesso percorso di codice utilizzato nell'avvio del normale checkpoint.
Se viene utilizzato un keyring a livello di file system per gestire le chiavi criptate con le credenziali (CE) e
criptate con il dispositivo (DE), le chiavi vengono perse dopo lo smontaggio di userdata. Per
consentire il ripristino della chiave, quando installi una chiave in un keyring del file system, vold
viene installata anche la stessa chiave di tipo fscrypt-provisioning nel keyring a livello di sessione. Quando viene chiamato init_user0, vold reinstalla le chiavi nel keyring del file
system.
Ripristino del riavvio forzato
Per garantire che un riavvio soft non lasci un dispositivo in uno stato inutilizzabile, Android 11 include un fallback al riavvio forzato che viene attivato quando si verifica una delle seguenti condizioni:
- Un dispositivo non riesce ad avviare il riavvio soft (ovvero,
sys.init.userspace_reboot.in_progress=1) entro un determinato timeout. - Un processo non viene interrotto entro un determinato timeout.
- L'operazione
/system/bin/vdc volume resetnon riesce. - Lo smontaggio del dispositivo zRAM non riesce.
- Un pacchetto APEX attivo viene smontato in modo errato.
- Un tentativo di rimontaggio di
userdatain modalità di checkpointing non va a buon fine. - Un dispositivo non riesce ad avviarsi correttamente (ovvero
sys.boot_completed=1) entro un determinato timeout.
Configurazione per dispositivo
Alcuni aspetti del riavvio soft possono essere ottimizzati modificando i valori delle seguenti proprietà:
init.userspace_reboot.is_supportedcontrolla quando un dispositivo può eseguire un riavvio soft. Se il valore di questa proprietà èfalse,0o non specificato, i tentativi di riavvio vengono rifiutati.init.userspace_reboot.sigkill.timeoutmilliscontrolla il timeout in millisecondi per i processi che hanno ricevuto un segnaleSIGKILLper l'interruzione. Se uno dei processi non viene interrotto nel timeout specificato, viene attivato un fallback al riavvio forzato.init.userspace_reboot.sigterm.timeoutmilliscontrolla il timeout in millisecondi per i processi che hanno ricevuto un segnaleSIGTERMper terminare. Tutti i processi che non sono stati terminati nel timeout specificato ricevono un segnaleSIGKILL.init.userspace_reboot.started.timeoutmilliscontrolla il timeout in millisecondi per l'avvio del riavvio silenzioso (ovvero,sys.init.userspace_reboot.in_progress=1). Se un dispositivo non riesce ad avviare il riavvio silenzioso entro il timeout specificato, viene attivato un fallback al riavvio forzato.init.userspace_reboot.userdata_remount.timeoutmilliscontrolla il timeout in millisecondi per smontareuserdata. Se un dispositivo non viene smontatouserdataentro il timeout specificato, viene attivato un riavvio forzato.init.userspace_reboot.watchdog.timeoutmilliscontrolla il timeout per l'avvio corretto di un dispositivo (ovverosys.boot_completed=1). Se un dispositivo non si avvia entro il timeout specificato, viene attivato un fallback al riavvio forzato.
Personalizzare l'animazione durante il riavvio soft
L'implementazione di riferimento di un riavvio soft include la possibilità di personalizzare l'animazione mostrata durante il riavvio soft.
Al termine dell'azione userspace-reboot-fs-remount, init avvia il
servizio bootanim. Questo servizio cerca l'esistenza dei seguenti file di animazione, nell'ordine elencato, e riproduce il primo che trova:
/product/media/userspace-reboot.zip/oem/media/userspace-reboot.zip/system/media/userspace-reboot.zip
Se non vengono specificati file di animazione specifici per il riavvio soft, bootanim mostra un'animazione android predefinita.
Test
Android 11 include un'implementazione di riferimento di un
riavvio soft. Inoltre, puoi verificare un riavvio soft utilizzando i test CTS in UserspaceRebootHostTest.