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 criptato delle credenziali 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 silenzioso (tramite PowerManager o da una shell), init esegue i seguenti passaggi:
Riceve
sys.powerctl=reboot,userspace.Avvia 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 silenzioso. 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
DoUserspaceReboot, che esegue le seguenti azioni:- Invia
SIGTERMai processi avviati dopo il montaggio diuserdatae attende che si arrestino. - Una volta raggiunto il timeout, invia
SIGKILLper terminare qualsiasi processo 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 silenzioso,
userdata viene rimontato in modalità checkpointing durante l'azione
userspace-reboot-fs-remount (vedi la sezione seguente per i dettagli). Un riavvio silenzioso viene considerato dopo che sys.boot_completed property è impostato su 1. Al termine del riavvio silenzioso, il display rimane spento e
per riattivarlo è necessaria un'interazione utente esplicita.
Creazione di checkpoint del file system
Se è stato richiesto un checkpoint del file system prima del riavvio silenzioso,
userdata viene rimontato in modalità di checkpoint durante il riavvio silenzioso.
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 del codice utilizzato nell'avvio del checkpointing normale.
Se viene utilizzato un keyring a livello di file system per gestire le chiavi criptate con credenziali (CE) e criptate con 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 silenzioso 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 silenzioso (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 si avvia correttamente (ovvero
sys.boot_completed=1) entro un determinato timeout.
Configurazione per dispositivo
Alcuni aspetti del riavvio silenzioso possono essere ottimizzati modificando i valori delle seguenti proprietà:
init.userspace_reboot.is_supportedcontrolla quando un dispositivo può eseguire un riavvio silenzioso. 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 si arresta 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 (ovverosys.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 silenzioso
L'implementazione di riferimento di un riavvio silenzioso include la possibilità di personalizzare l'animazione mostrata durante il riavvio silenzioso.
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 silenzioso, bootanim mostra un'animazione android predefinita.
Test
Android 11 include un'implementazione di riferimento di un
riavvio soft. Inoltre, puoi verificare un riavvio silenzioso utilizzando i test CTS in UserspaceRebootHostTest.