Android 9 include le seguenti modifiche alla specifica del motivo dell'avvio del bootloader.
Motivi dell'avvio
Un bootloader utilizza risorse hardware e di memoria disponibili in modo univoco per
determinare perché un dispositivo si è riavviato, quindi comunica tale determinazione
aggiunta di androidboot.bootreason=<reason>
ad Android
della riga di comando del kernel per il suo lancio. init
traduce quindi questo testo
riga di comando per propagarsi alla proprietà Android
bootloader_boot_reason_prop
(ro.boot.bootreason
).
Per i dispositivi che verranno lanciati con Android 12 o versioni successive:
usando la versione del kernel 5.10 o successiva, androidboot.bootreason=<reason>
in bootconfig al posto della riga di comando del kernel.
Specifiche del motivo dell'avvio
Le versioni precedenti di Android specificavano un formato motivo di avvio che non prevedeva l'utilizzo
spazi, era tutto minuscolo, includeva pochi requisiti (come per la generazione di report
kernel_panic
, watchdog
,
cold
/warm
/hard
) e quali hanno generato
per altri motivi unici. Questa specifica poco chiara ha generato
proliferazione di centinaia di motivi di avvio personalizzati (e a volte privi di significato)
e questo ha causato una situazione ingestibile. Alla data
Release di Android, il grande slancio di contenuti quasi non analizzabili o privi di significato
segnalato dal bootloader ha creato problemi di conformità
bootloader_boot_reason_prop
.
Con il rilascio di Android 9, il team di Android
riconosce che la versione precedente di bootloader_boot_reason_prop
ha
slancio significativo e non può essere riscritto in fase di runtime. Eventuali miglioramenti a
la specifica del motivo di avvio deve quindi provenire dalle interazioni
di bootloader e modifiche al sistema esistente. A questo scopo,
Il team Android è:
- Coinvolgimento degli sviluppatori di bootloader per incoraggiarli a:
- Fornisci motivi canonici, analizzabili e riconoscibili per
bootloader_boot_reason_prop
. - Partecipa al
system/core/bootstat/bootstat.cpp
ElencokBootReasonMap
.
- Fornisci motivi canonici, analizzabili e riconoscibili per
- L'aggiunta di un'origine controllata e riscrivibile del runtime
system_boot_reason_prop
(sys.boot.reason
). R un gruppo limitato di app di sistema (ad esempiobootstat
einit
) può riscrivere questa proprietà, ma tutte le app possono essere autorizzati a leggerla. - Informare gli utenti sul motivo dell'avvio di attendere fino al montaggio dei dati utente
prima di considerare attendibili i contenuti nella proprietà
Motivo avvio del sistema
system_boot_reason_prop
.
Perché così tardi? Sebbene bootloader_boot_reason_prop
sia disponibile in anteprima
all'avvio, viene bloccato dal criterio di sicurezza di Android in base alle necessità.
perché rappresenta informazioni imprecise, non analizzabili e non canoniche.
Nella maggior parte dei casi, solo gli sviluppatori con una conoscenza approfondita del sistema di avvio
devono accedere a queste informazioni. Un URL raffinato, analizzabile e canonico
L'API per il motivo dell'avvio con system_boot_reason_prop
può essere affidabile
e raccolti in modo accurato solo dopo il montaggio dei dati utente.
Nello specifico:
- Prima di montare i dati utente,
system_boot_reason_prop
conterrà il valore dabootloader_boot_reason_prop
. - Dopo aver montato i dati utente,
system_boot_reason_prop
può essere aggiornato per essere conforme o per segnalare informazioni più accurate.
Per questo motivo, Android 9 estende il periodo
prima che il motivo dell'avvio possa essere acquisito ufficialmente,
subito accurato all'avvio (con bootloader_boot_reason_prop
)
disponibili solo dopo il montaggio dei dati utente (con
system_boot_reason_prop
).
La logica di bootstat dipende da una logica più informativa e conforme
bootloader_boot_reason_prop
. Quando la proprietà utilizza una proprietà
più prevedibile, migliora la precisione di tutti i riavvii controllati
scenari di chiusura, che a loro volta perfezionano e ampliano la precisione e il significato
di system_boot_reason_prop
.
Formato motivo avvio canonico
Il formato canonico del motivo dell'avvio per bootloader_boot_reason_prop
in Android 9 utilizza la seguente sintassi:
<reason>,<subreason>,<detail>…
Regole di formattazione:
- Minuscolo
- Nessuno spazio vuoto (utilizza il sottolineato)
- Tutti i caratteri stampabili
reason
,subreason
e uno o uno o più separati da virgole altredetail
istanze.- Un valore
reason
obbligatorio che rappresenta la priorità più alta il motivo per cui il dispositivo ha dovuto riavviarsi o spegnersi. - Un elemento
subreason
facoltativo che rappresenta un breve riepilogo di il motivo per cui il dispositivo ha dovuto riavviarsi o spegnersi (oppure chi ha riavviato o arrestato il dispositivo). - Uno o più valori facoltativi di
detail
.detail
possono puntare a un sottosistema per aiutare a determinare quale specifico sistema ha generatosubreason
. Puoi specificare piùdetail
, che in genere devono seguire una gerarchia di l'importanza. Tuttavia, è accettabile anche segnalaredetail
valori di uguale importanza.
- Un valore
Viene considerato un valore vuoto per bootloader_boot_reason_prop
illegale (perché ciò consente ad altri agenti di inserire un motivo di avvio a posteriori).
Requisiti per i motivi
Il valore specificato per reason
(primo intervallo, prima della risoluzione
virgola) deve essere del seguente set, suddiviso in kernel, forte e smussato
motivi:
- set di kernel:
- "
watchdog"
"kernel_panic"
- "
- set forte:
"recovery"
"bootloader"
- insieme smussato:
"cold"
. Indica in genere un ripristino completo di tutti i dispositivi, inclusa la memoria."hard"
. Indica in genere che l'hardware ha il suo stato reimpostata eramoops
deve conservare i contenuti persistenti."warm"
. In genere indica la memoria e i dispositivi mantengono uno stato eramoops
(vedipstore
(driver nel kernel) che contiene contenuti permanenti."shutdown"
"reboot"
. In genere significa che lo statoramoops
è sconosciuto e lo stato dell'hardware è sconosciuto. Questo valore è un catchall come I valoricold
,hard
ewarm
forniscono indizi sulla profondità del ripristino del dispositivo.
I bootloader devono fornire un set di kernel o un set smussato reason
; e
ti consigliamo vivamente di fornire un subreason
, se possibile
determinato. Ad esempio, una pressione prolungata del tasto di accensione potrebbe o meno avere
Il backup di ramoops
potrebbe essere il motivo dell'avvio
"reboot,longkey"
.
Nessun reason
primo intervallo può far parte di subreason
o
detail
. Tuttavia, poiché i motivi del set del kernel non possono essere generati
spazio utente, "watchdog"
può essere riutilizzato per un motivo non definito,
insieme a un dettaglio della fonte (ad esempio,
"reboot,watchdog,service_manager_unresponsive"
, oppure
"reboot,software,watchdog"
).
I motivi dell'avvio non devono richiedere conoscenze interne di esperti per decifrare e/o
devono essere leggibili da una persona con un report intuitivo. Esempi:
"shutdown,vbxd"
(pessima), "shutdown,uv"
(migliore),
"shutdown,undervoltage"
(preferito).
Combinazioni motivo-sottomotivo
Android prenota un insieme di reason
-subreason
combinazioni che non devono essere sovraccaricate durante il normale utilizzo ma che possono essere utilizzate
caso per caso se la combinazione riflette accuratamente i
. Ecco alcuni esempi di combinazioni riservate:
"reboot,userrequested"
"shutdown,userrequested"
"shutdown,thermal"
(dathermald
)"shutdown,battery"
"shutdown,battery,thermal"
(daBatteryStatsService
)"reboot,adb"
"reboot,shell"
"reboot,bootloader"
"reboot,recovery"
Per maggiori dettagli, consulta kBootReasonMap
in
system/core/bootstat/bootstat.cpp
e il Git associato
della cronologia delle modifiche
nel repository di codice sorgente Android.
Segnala motivi di avvio
Tutti i motivi di avvio, dal bootloader o registrati nell'avvio canonico
deve essere registrato nella sezione kBootReasonMap
di
system/core/bootstat/bootstat.cpp
. La
L'elenco kBootReasonMap
è un mix di versioni conformi e legacy
non conformi. Gli sviluppatori del bootloader devono registrare soltanto nuovi
motivi di conformità qui (e non dovrebbero registrare motivi non conformi a meno che
il prodotto è già stato spedito e non può essere modificato).
Consigliamo vivamente di utilizzare voci esistenti e conformi in
system/core/bootstat/bootstat.cpp
e contenimento dell'allenamento prima del giorno
utilizzando una stringa non conforme. Come regola generale, si tratta di:
- OK per segnalare
"kernel_panic"
dal bootloader, in quantobootstat
potrebbe essere in grado diramoops
perkernel_panic signatures
per perfezionare nella versione canonicasystem_boot_reason_prop
. - Non è possibile segnalare una stringa non conforme in
kBootReasonMap
(ad esempio"panic")
del bootloader, poiché ciò comprometterà la possibilità di perfezionarereason
.
Ad esempio, se kBootReasonMap
contiene "wdog_bark"
,
uno sviluppatore di bootloader deve:
- Passa a
"watchdog,bark"
e aggiungilo all'elenco inkBootReasonMap
. - Valuta cosa significa
"bark"
per chi non ha familiarità con il tecnologia e determinare se unsubreason
più significativo è disponibili.
Verifica la conformità del motivo dell'avvio
Al momento Android non fornisce un test CTS attivo in grado di fornire con precisione attivare o controllare tutti i possibili motivi di avvio forniti da un bootloader; i partner possono comunque tentare di eseguire un test passivo per determinare la compatibilità.
Di conseguenza, la conformità del bootloader richiede agli sviluppatori
aderiscono volontariamente allo spirito delle regole e delle linee guida sopra descritte.
Invitiamo tali sviluppatori a contribuire ad AOSP (in particolare per
system/core/bootstat/bootstat.cpp
) e usa questa opportunità come
per discussioni sui problemi che causano l'avvio.