Android 9 incluye los siguientes cambios en la especificación del motivo de inicio del bootloader.
Motivos de inicio
El bootloader usa recursos de hardware y memoria
disponibles de manera única para
determinar por qué se reinició un dispositivo y, luego, comunica esa determinación al
agregando androidboot.bootreason=<reason>
a Android
de la línea de comandos de kernel
para su lanzamiento. Luego, init
traduce esto
línea de comandos para propagarse a la propiedad de Android
bootloader_boot_reason_prop
(ro.boot.bootreason
)
En el caso de los dispositivos que se lanzan con Android 12 o versiones posteriores, haz lo siguiente:
con la versión de kernel 5.10 o superior, androidboot.bootreason=<reason>
se agrega a bootconfig en lugar de a la línea de comandos del kernel.
Especificaciones del motivo de inicio
En las versiones anteriores de Android, se especificaba un formato de motivo de inicio que no usaba
espaciosos, estaba todo en minúsculas, tenía pocos requisitos (como la generación de informes
kernel_panic
, watchdog
,
cold
/warm
/hard
), y que generaron
permisos por otros motivos únicos. Esta especificación baja dio como resultado la
la proliferación de cientos de motivos de inicio personalizados (y, a veces, sin sentido)
cadenas, lo que a su vez
conducía a una situación inmanejable. Hasta el momento
Lanzamiento de Android, el gran impulso del contenido casi no analizable o sin sentido
que archiva el bootloader creó problemas de cumplimiento
bootloader_boot_reason_prop
Con la versión de Android 9, el equipo de Android
reconoce que la bootloader_boot_reason_prop
heredada tiene
un impulso considerable y no se puede reescribir durante el tiempo de ejecución. Cualquier mejora en
por lo tanto, la especificación del motivo de inicio debe provenir de interacciones con
a los desarrolladores de bootloader
y los ajustes al sistema existente. Con ese fin, la
El equipo de Android:
- Interactúa con los desarrolladores de bootloader para alentarlos a hacer lo siguiente:
- Proporciona razones canónicas, analizables y reconocibles para
bootloader_boot_reason_prop
- Participa en el
system/core/bootstat/bootstat.cpp
ListakBootReasonMap
.
- Proporciona razones canónicas, analizables y reconocibles para
- Agregar una fuente controlada y con capacidad de reescritura en el entorno de ejecución del
system_boot_reason_prop
(sys.boot.reason
) R conjunto limitado de aplicaciones del sistema (comobootstat
yinit
) puedes reescribir esta propiedad, pero todas las apps pueden otorgamiento de derechos de sepolicy para leerla. - Informa a los usuarios sobre el motivo de inicio que deben esperar hasta que se activen los datos de usuario
antes de confiar en el contenido de la propiedad del motivo de inicio del sistema
system_boot_reason_prop
¿Por qué tan tarde? Si bien bootloader_boot_reason_prop
está disponible con anticipación
durante el inicio, la política de seguridad de Android la bloquea según sea necesario
porque representa información imprecisa, no analizable y no canónica.
En la mayoría de las situaciones, solo los desarrolladores con un conocimiento profundo del sistema de inicio
necesitar para acceder a esta información. Un enfoque refinado, analizable y canónico
La API por motivo de inicio con system_boot_reason_prop
puede ser confiable
y recopilarse con precisión solo después de que se activen los datos del usuario.
Más precisamente:
- Antes de que se activen los datos de usuario
system_boot_reason_prop
contendrá el valor debootloader_boot_reason_prop
- Después de que se activen los datos de usuario,
Es posible que
system_boot_reason_prop
se actualice para cumplir con los requisitos o para brindar información más precisa.
Por este motivo, Android 9 extiende el período de
tiempo antes de que el motivo de inicio se pueda adquirir oficialmente, lo que cambia de ser
precisa de inmediato en el inicio (con bootloader_boot_reason_prop
)
solo estén disponibles después de que se activen los datos del usuario (con
system_boot_reason_prop
).
La lógica de arranque depende de un sistema más informativo
bootloader_boot_reason_prop
Cuando esa propiedad usa un
más predecibles, mejora la precisión de todos los reinicios controlados y
situaciones de cierre, lo que a su vez refina y expande la precisión y el significado
de system_boot_reason_prop
.
Formato del motivo de inicio canónico
El formato del motivo de inicio canónico de bootloader_boot_reason_prop
En Android 9, usa la siguiente sintaxis:
<reason>,<subreason>,<detail>…
Reglas de formato:
- Minúscula
- Sin espacios en blanco (usar subrayado)
- Todos los caracteres imprimibles
reason
,subreason
y uno o más separados por comasdetail
instancias más.- Un objeto
reason
obligatorio que representa la prioridad más alta el motivo por el que el dispositivo tuvo que reiniciarse o apagarse. - Un objeto
subreason
opcional que representa un breve resumen de por qué se tuvo que reiniciar o apagar el dispositivo (o quién reinició o apagó el dispositivo dispositivo). - Uno o más valores
detail
opcionales. Undetail
pueden apuntar a un subsistema para ayudar a determinar qué sistema específico dio como resultado lasubreason
. Puedes especificar varias Valoresdetail
, que por lo general deben seguir una jerarquía de importancia. Sin embargo, también es aceptable informar variasdetail
valores de igual importancia.
- Un objeto
Se considera un valor vacío para bootloader_boot_reason_prop
ilegal (ya que esto permite que otros agentes incorporen un motivo de inicio después del hecho)
Requisitos del motivo
El valor asignado para reason
(primer intervalo, antes de la finalización o
coma) debe ser del siguiente conjunto dividido en kernel, strong y blunt.
motivos:
- kernel:
- "
watchdog"
"kernel_panic"
- "
- conjunto sólido:
"recovery"
"bootloader"
- conjunto blunt:
"cold"
Generalmente, indica un restablecimiento completo de todos los dispositivos. incluida la memoria."hard"
Generalmente indica que el hardware tiene su estado restablecer, yramoops
debería conservar el contenido persistente."warm"
Generalmente, indica la memoria y los dispositivos conserva algún estado, y elramoops
(consultapstore
de código fuente en el kernel) incluye contenido persistente."shutdown"
"reboot"
Por lo general, significa que el estadoramoops
es desconocido ni el estado del hardware. Este valor es genérico, ya que el valor Los valorescold
,hard
ywarm
proporcionan datos sobre la profundidad del restablecimiento del dispositivo.
Los bootloaders deben proporcionar un conjunto de kernels o un conjunto blunt reason
, y
te recomendamos que proporciones un subreason
si se puede
determinado. Por ejemplo, una tecla de encendido presionada
La copia de seguridad de ramoops
tendría el motivo del inicio
"reboot,longkey"
Ningún reason
del primer intervalo puede ser parte de cualquier subreason
o
detail
Sin embargo, debido a que los motivos del conjunto de kernel no pueden ser producidos por
espacio de usuario, es posible que se reutilice "watchdog"
después de un motivo por el que no hay llanto.
junto con un detalle de la fuente (por ejemplo,
"reboot,watchdog,service_manager_unresponsive"
o
"reboot,software,watchdog"
).
Los motivos de inicio no deben requerir conocimientos internos expertos para descifrarlos o
debe ser legible por humanos con un informe intuitivo. Ejemplos:
"shutdown,vbxd"
(mala), "shutdown,uv"
(mejor),
"shutdown,undervoltage"
(opción preferida).
Combinaciones de motivo y submotivo
Android reserva un conjunto de reason
a subreason
.
que no deben sobrecargarse en un uso normal, pero que pueden usarse
caso por caso si la combinación refleja de manera precisa los atributos
estado. Estos son algunos ejemplos de combinaciones reservadas:
"reboot,userrequested"
"shutdown,userrequested"
"shutdown,thermal"
(desdethermald
)"shutdown,battery"
"shutdown,battery,thermal"
(desdeBatteryStatsService
)"reboot,adb"
"reboot,shell"
"reboot,bootloader"
"reboot,recovery"
Para obtener más información, consulta kBootReasonMap
en
system/core/bootstat/bootstat.cpp
y el Git asociado
el historial de registros de cambios en el repositorio de código fuente de Android.
Informar motivos de inicio
Todos los motivos de inicio, ya sea desde el bootloader o registrado en el inicio canónico
debe registrarse en la sección kBootReasonMap
de
system/core/bootstat/bootstat.cpp
El
La lista kBootReasonMap
es una combinación de elementos compatibles y heredados
por motivos de incumplimiento. Los desarrolladores de bootloader deben registrar solo
de cumplimiento aquí (y no debe registrar los motivos de incumplimiento, a menos que
el producto ya se envió y no se puede cambiar).
Recomendamos usar entradas existentes que cumplan con los requisitos en
system/core/bootstat/bootstat.cpp
y ejerciendo moderación antes
con una cadena que no cumple con las políticas. A modo de lineamiento, debes cumplir con los siguientes requisitos:
- Aceptar para informar
"kernel_panic"
desde el bootloader, ya quebootstat
puede inspeccionarramoops
dekernel_panic signatures
para definir mejor la subrazones en lasystem_boot_reason_prop
canónica. - No es correcto informar una cadena que no cumple con las políticas en
kBootReasonMap
(como"panic")
del bootloader, ya que, en última instancia, esto romperá la capacidad de definir mejor lareason
Por ejemplo, si kBootReasonMap
contiene "wdog_bark"
,
un desarrollador de bootloader debe hacer lo siguiente:
- Cambia a
"watchdog,bark"
y agrégalo a la lista enkBootReasonMap
- Considera lo que significa
"bark"
para aquellos que no estén familiarizados con el tecnología y determinar si unasubreason
más significativa es disponibles.
Verifica el cumplimiento del motivo de inicio
En este momento, Android no proporciona una prueba activa del CTS que pueda activar o inspeccionar todas las posibles razones de inicio que podría proporcionar un bootloader los socios pueden intentar ejecutar una prueba pasiva para determinar la compatibilidad.
Como resultado, el cumplimiento del bootloader requiere que los desarrolladores de bootloader
cumplir voluntariamente con el espíritu de las reglas y los lineamientos descritos anteriormente.
Instamos a estos desarrolladores a contribuir al AOSP (específicamente, a
system/core/bootstat/bootstat.cpp
) y utilice esta oportunidad como
para debatir sobre problemas con el motivo de inicio.