Unter Android 9 wurden die folgenden Änderungen an der Spezifikation des Bootloader-Bootgrunds vorgenommen.
Startgründe
Ein Bootloader verwendet eindeutig verfügbare Hardware- und Speicherressourcen, um zu ermitteln, warum ein Gerät neu gestartet wurde, und teilt diese Entscheidung mit, indem er androidboot.bootreason=<reason>
zur Android-Kernel-Befehlszeile für den Start hinzufügt. init
übersetzt diese Befehlszeile dann, um sie an die Android-Eigenschaft bootloader_boot_reason_prop
(ro.boot.bootreason
) weiterzuleiten. Bei Geräten, die mit Android 12 oder höher und der Kernelversion 5.10 oder höher gestartet werden, wird androidboot.bootreason=<reason>
anstelle der Kernel-Befehlszeile der Boot-Konfiguration hinzugefügt.
Spezifikationen für Bootgründe
In früheren Releases von Android wurde ein Format für Bootgründe angegeben, bei dem keine Leerzeichen verwendet wurden und alle Kleinbuchstaben enthielten. Außerdem gab es wenige Anforderungen (z. B. für die Berichterstellung kernel_panic
, watchdog
, cold
/warm
/hard
) und es wurden andere besondere Gründe berücksichtigt. Diese lockere Spezifikation führte zur Verbreitung von Hunderten von benutzerdefinierten (und manchmal sinnlosen) Boot-Grundzeichenfolgen, was wiederum zu einer unübersichtlichen Situation führte. Bei der aktuellen Android-Version hat die schiere Menge an nahezu nicht parsbaren oder bedeutungslosen Inhalten, die vom Bootloader eingereicht wurden, zu Compliance-Problemen für bootloader_boot_reason_prop
geführt.
Mit der Veröffentlichung von Android 9 erkennt das Android-Team, dass die alte bootloader_boot_reason_prop
einen erheblichen Schwung hat und nicht zur Laufzeit neu geschrieben werden kann. Verbesserungen an der Bootgrundspezifikation müssen daher durch Interaktionen mit Bootloader-Entwicklern und Anpassungen am vorhandenen System erfolgen. Das Android-Team setzt sich dafür ein,
- Wir setzen uns mit Bootloader-Entwicklern in Verbindung, um sie zu folgenden Maßnahmen anzuregen:
- Gib für
bootloader_boot_reason_prop
kanonische, analysierbare und erkennbare Gründe an. - Sie sind in der Liste
system/core/bootstat/bootstat.cpp
kBootReasonMap
enthalten.
- Gib für
- Hinzufügen einer kontrollierten und zur Laufzeit überschreibbaren Quelle für
system_boot_reason_prop
(sys.boot.reason
). Diese Eigenschaft kann von einer begrenzten Anzahl von System-Apps (z. B.bootstat
undinit
) überschrieben werden, aber allen Apps können Sepolicy-Rechte zum Lesen zugewiesen werden. - Nutzer werden über den Grund für das Starten informiert, dass sie warten müssen, bis die Nutzerdaten bereitgestellt wurden, bevor sie den Inhalt der Eigenschaft „Systemstartgrund“
system_boot_reason_prop
vertrauen können.
Warum so spät? bootloader_boot_reason_prop
ist zwar schon früh nach dem Start verfügbar, wird aber bei Bedarf von der Android-Sicherheitsrichtlinie blockiert, da es fehlerhafte, nicht parsbare und nicht kanonische Informationen enthält.
In den meisten Fällen sollten nur Entwickler mit fundierten Kenntnissen des Boot-Systems auf diese Informationen zugreifen müssen. Eine optimierte, parsbare und kanonische API für den Start mit system_boot_reason_prop
kann erst nach der Bereitstellung der Nutzerdaten zuverlässig und genau erfasst werden.
Im Detail:
- Bevor Nutzerdaten bereitgestellt werden, enthält
system_boot_reason_prop
den Wert vonbootloader_boot_reason_prop
. - Nach dem Bereitstellen von userdata kann
system_boot_reason_prop
aktualisiert werden, um die Compliance-Anforderungen zu erfüllen oder genauere Informationen zu erfassen.
Aus diesem Grund wird in Android 9 der Zeitraum verlängert, bevor der Startgrund offiziell abgerufen werden kann. Er ist nicht mehr sofort beim Start korrekt (mit bootloader_boot_reason_prop
), sondern erst verfügbar, nachdem das Nutzerdatenverzeichnis bereitgestellt wurde (mit system_boot_reason_prop
).
Die Bootstat-Logik hängt von einer informativeren und konformen bootloader_boot_reason_prop
ab. Wenn für diese Eigenschaft ein vorhersehbares Format verwendet wird, wird die Genauigkeit aller kontrollierten Neustart- und Herunterfahrszenarien verbessert. Dadurch werden die Genauigkeit und Bedeutung von system_boot_reason_prop
verfeinert und erweitert.
Format des kanonischen Startgrunds
Das kanonische Format für den Startgrund von bootloader_boot_reason_prop
unter Android 9 hat folgende Syntax:
<reason>,<subreason>,<detail>…
Formatierungsregeln:
- Kleinschreibung
- Keine Lücken (unterstreichen Sie die Felder)
- Alle druckbaren Zeichen
- Durch Kommas getrennte
reason
-,subreason
- und eine oder mehreredetail
-Instanzen.- Ein erforderlicher
reason
, der den Grund mit der höchsten Priorität angibt, warum das Gerät neu gestartet oder heruntergefahren werden musste. - Ein optionaler
subreason
, der eine kurze Zusammenfassung der Gründe darstellt, aus denen das Gerät neu gestartet oder heruntergefahren werden musste (oder wer es neu gestartet oder heruntergefahren hat). - Ein oder mehrere optionale
detail
-Werte. Eindetail
kann auf ein Untersystem verweisen, um zu ermitteln, welches System zu demsubreason
geführt hat. Sie können mehreredetail
-Werte angeben, die im Allgemeinen einer Wichtigkeitshierarchie folgen sollten. Es ist jedoch auch zulässig, mehreredetail
-Werte mit gleicher Wichtigkeit anzugeben.
- Ein erforderlicher
Ein leerer Wert für bootloader_boot_reason_prop
gilt als illegal, da dadurch andere Agenten nachträglich einen Startgrund einfügen können.
Anforderungen an den Grund
Der für reason
angegebene Wert (erste Spanne vor Beendigung oder Komma) muss aus den folgenden Gründen in Kern-, starke und unmissverständliche Gründe unterteilt sein:
- kernel set:
- "
watchdog"
"kernel_panic"
- "
- Starker Satz:
"recovery"
"bootloader"
- stumpfes Set:
"cold"
: Gibt in der Regel einen vollständigen Neustart aller Geräte an, einschließlich des Arbeitsspeichers."hard"
: Gibt in der Regel an, dass der Zustand der Hardware zurückgesetzt wurde undramoops
dauerhafte Inhalte beibehalten sollte."warm"
: Gibt in der Regel an, dass der Arbeitsspeicher und die Geräte einen bestimmten Status beibehalten und derramoops
-Speicher (siehepstore
-Treiber im Kernel) nichtflüchtige Inhalte enthält."shutdown"
"reboot"
. Bedeutet in der Regel, dass derramoops
-Status und der Hardwarestatus unbekannt sind. Dieser Wert ist ein universeller Wert, da die Wertecold
,hard
undwarm
Hinweise auf die Tiefe der Zurücksetzung für das Gerät geben.
Bootloader müssen ein Kernel-Set oder ein Blunt-Set reason
angeben. Es wird dringend empfohlen, eine subreason
anzugeben, sofern diese ermittelt werden kann. Wenn Sie beispielsweise die Ein‑/Aus-Taste lange gedrückt haben und dabei möglicherweise ein ramoops
-Back-up durchgeführt wurde, lautet der Startgrund "reboot,longkey"
.
Keine erste Spanne reason
darf Teil eines subreason
oder detail
sein. Da Gründe für vom Kernel festgelegte Zeitüberschreitungen jedoch nicht vom Nutzerbereich stammen können, kann "watchdog"
nach einem solchen Grund zusammen mit einem Detail zur Quelle (z. B. "reboot,watchdog,service_manager_unresponsive"
oder "reboot,software,watchdog"
) wiederverwendet werden.
Bootgründe sollten kein internes Expertenwissen erfordern und/oder für Menschen lesbar sein und einen intuitiven Bericht erstellen. Beispiele:
"shutdown,vbxd"
(schlecht), "shutdown,uv"
(besser),
"shutdown,undervoltage"
(bevorzugt).
Kombinationen aus Grund und untergeordnetem Grund
Android reserviert eine Reihe von reason
-subreason
-Kombinationen, die bei normaler Nutzung nicht überlastet werden sollten, aber von Fall zu Fall verwendet werden können, wenn die Kombination die zugehörige Bedingung genau widerspiegelt. Beispiele für reservierte Kombinationen:
"reboot,userrequested"
"shutdown,userrequested"
"shutdown,thermal"
(vonthermald
)"shutdown,battery"
"shutdown,battery,thermal"
(vonBatteryStatsService
)"reboot,adb"
"reboot,shell"
"reboot,bootloader"
"reboot,recovery"
Weitere Informationen finden Sie unter kBootReasonMap
in system/core/bootstat/bootstat.cpp
und im zugehörigen Git-Änderungsverlauf im Android-Quell-Repository.
Startgründe melden
Alle Boot-Gründe, die entweder vom Bootloader stammen oder im kanonischen Boot-Grund aufgezeichnet wurden, müssen im Abschnitt kBootReasonMap
von system/core/bootstat/bootstat.cpp
aufgezeichnet werden. Die Liste kBootReasonMap
enthält sowohl konforme als auch nicht konforme Gründe. Bootloader-Entwickler sollten hier nur neue konforme Gründe registrieren. Nicht konforme Gründe sollten nur registriert werden, wenn das Produkt bereits ausgeliefert wurde und nicht mehr geändert werden kann.
Wir empfehlen dringend, vorhandene, konforme Einträge in system/core/bootstat/bootstat.cpp
zu verwenden und mit der Verwendung eines nicht konformen Strings zurückhaltend zu sein. Als Richtlinie gilt:
- OK,
"kernel_panic"
über den Bootloader melden, dabootstat
ramoops
aufkernel_panic signatures
prüfen kann, um die untergeordneten Gründe in der kanonischensystem_boot_reason_prop
zu verfeinern. - Nicht zulässig: Melden Sie keinen nicht konformen String in
kBootReasonMap
, z. B."panic")
aus dem Bootloader, da dies die Möglichkeit zur Optimierung vonreason
beeinträchtigt.
Wenn kBootReasonMap
beispielsweise "wdog_bark"
enthält, sollte ein Bootloader-Entwickler:
- Ändern Sie die Einstellung in
"watchdog,bark"
und fügen Sie sie der Liste inkBootReasonMap
hinzu. - Überlegen Sie, was
"bark"
für Personen bedeutet, die mit der Technologie nicht vertraut sind, und prüfen Sie, ob eine aussagekräftigeresubreason
verfügbar ist.
Einhaltung des Bootgrunds prüfen
Derzeit bietet Android keinen aktiven CTS-Test, mit dem alle möglichen Boot-Gründe eines Bootloaders korrekt ausgelöst oder geprüft werden können. Partner können jedoch versuchen, einen passiven Test auszuführen, um die Kompatibilität zu bestimmen.
Daher müssen Bootloader-Entwickler freiwillig den oben beschriebenen Regeln und Richtlinien entsprechen, um die Anforderungen an die Bootloader-Compliance zu erfüllen.
Wir empfehlen diesen Entwicklern, zum AOSP beizutragen (insbesondere zu system/core/bootstat/bootstat.cpp
) und diese Gelegenheit als Forum für Diskussionen zu Problemen mit dem Bootgrund zu nutzen.