Android 10 y versiones posteriores admiten particiones redimensionables al reubicar la implementación fastboot del gestor de arranque al espacio de usuario. Esta reubicación permite mover el código intermitente a una ubicación común que se pueda mantener y probar, con solo las partes de fastboot específicas del proveedor implementadas mediante una capa de abstracción de hardware (HAL). Además, Android 12 y versiones posteriores admiten la actualización de discos ram mediante un comando fastboot agregado.
Unificando fastboot y recovery
Debido a que el fastboot y la recuperación del espacio de usuario son similares, puede fusionarlos en una partición o binario. Esto proporciona ventajas como usar menos espacio, tener menos particiones en general y hacer que fastboot y recovery compartan su kernel y bibliotecas.
Para admitir fastbootd
, el gestor de arranque debe implementar un nuevo comando de bloque de control de arranque (BCB) de boot-fastboot
. Para ingresar al modo fastbootd
, el gestor de arranque escribe boot-fastboot
en el campo de comando del mensaje BCB y deja el campo recovery
de BCB sin cambios (para permitir reiniciar cualquier tarea de recuperación interrumpida). Los campos status
, stage
y reserved
tampoco cambian. El gestor de arranque carga y arranca en la imagen de recuperación al ver boot-fastboot
en el campo de comando BCB. Luego, la recuperación analiza el mensaje BCB y cambia al modo fastbootd
.
Comandos BAD
Esta sección describe el comando adb
para integrar fastbootd
. El comando tiene diferentes resultados, dependiendo de si se ejecuta por sistema o por recuperación.
Dominio | Descripción |
---|---|
reboot fastboot |
|
Comandos de arranque rápido
Esta sección describe los comandos fastboot para integrar fastbootd
, incluidos nuevos comandos para flashear y administrar particiones lógicas. Algunos comandos tienen resultados diferentes, dependiendo de si han sido ejecutados por el gestor de arranque o por fastbootd
.
Dominio | Descripción |
---|---|
reboot recovery |
|
reboot fastboot | Se reinicia en fastbootd . |
getvar is-userspace |
|
getvar is-logical: <partition> | Devuelve yes si la partición dada es una partición lógica, no en caso contrario. Las particiones lógicas admiten todos los comandos que se enumeran a continuación. |
getvar super-partition-name | Devuelve el nombre de la superpartición. El nombre incluye el sufijo de la ranura actual si la superpartición es una partición A/B (normalmente no lo es). |
create-logical-partition <partition> <size> | Crea una partición lógica con el nombre y tamaño indicados. El nombre no debe existir ya como partición lógica. |
delete-logical-partition <partition> | Elimina la partición lógica dada (borra efectivamente la partición). |
resize-logical-partition <partition> <size> | Cambia el tamaño de la partición lógica al nuevo tamaño sin cambiar su contenido. Falla si no hay suficiente espacio disponible para realizar el cambio de tamaño. |
update-super <partition> | Fusiona cambios en los metadatos de la superpartición. Si no es posible realizar una combinación (por ejemplo, el formato del dispositivo es una versión no compatible), este comando falla. Un parámetro wipe opcional sobrescribe los metadatos del dispositivo, en lugar de realizar una fusión. |
flash <partition> [ <filename> ] | Escribe un archivo en una partición flash. El dispositivo debe estar en estado desbloqueado. |
erase <partition> | Borra una partición (no es necesario que sea un borrado seguro). El dispositivo debe estar en estado desbloqueado. |
getvar <variable> | all | Muestra una variable del cargador de arranque o todas las variables. Si la variable no existe, devuelve un error. |
set_active <slot> | Establece la ranura de arranque A/B dada como Para compatibilidad con A/B, las ranuras son conjuntos duplicados de particiones que se pueden iniciar de forma independiente. Las ranuras se denominan |
reboot | Reinicia el dispositivo normalmente. |
reboot-bootloader (o reboot bootloader ) | Reinicia el dispositivo en el gestor de arranque. |
fastboot fetch vendor_boot <out.img> | Úselo en Android 12 y versiones posteriores para admitir discos ram de proveedores flasheados. Obtiene el tamaño completo de la partición y el tamaño del fragmento. Obtiene datos para cada fragmento y luego une los datos en Para obtener más información, consulte |
fastboot flash vendor_boot:default <vendor-ramdisk.img> | Úselo en Android 12 y versiones posteriores para admitir discos ram de proveedores flasheados. Esta es una variante especial del comando flash. Realiza una función de búsqueda de imagen Para obtener más información, consulte |
fastboot flash vendor_boot: <foo> <vendor-ramdisk.img> | Úselo en Android 12 y versiones posteriores para admitir discos ram de proveedores flasheados. Obtiene la imagen Para obtener más información, consulte |
Arranque rápido y gestor de arranque
El gestor de arranque muestra las particiones del bootloader
, radio
y boot/recovery
, después de lo cual el dispositivo arranca en fastboot (espacio de usuario) y muestra todas las demás particiones. El gestor de arranque debe admitir los siguientes comandos.
Dominio | Descripción |
---|---|
download | Descarga la imagen para flashear. |
flash recovery <image> / flash boot <image> / flash bootloader <image> / | Parpadea la partición recovery/boot y el gestor de arranque. |
reboot | Reinicia el dispositivo. |
reboot fastboot | Se reinicia en fastboot. |
reboot recovery | Se reinicia para recuperarse. |
getvar | Obtiene una variable del cargador de arranque que se requiere para actualizar la imagen de recuperación/arranque (por ejemplo, current-slot y max-download-size ). |
oem <command> | Comando definido por OEM. |
particiones dinámicas
El gestor de arranque no debe permitir la actualización o el borrado de particiones dinámicas y debe devolver un error si se intentan estas operaciones. Para dispositivos de partición dinámica modernizados, la herramienta fastboot (y el cargador de arranque) admite un modo forzado para actualizar directamente una partición dinámica mientras se encuentra en el modo de cargador de arranque. Por ejemplo, si system
es una partición dinámica en el dispositivo modernizado, el uso del comando fastboot --force flash system
permite que el gestor de arranque (en lugar de fastbootd
) actualice la partición.
Carga en modo apagado
Si un dispositivo admite carga en modo apagado o se inicia automáticamente en un modo especial cuando se aplica energía, una implementación del comando fastboot oem off-mode-charge 0
debe omitir estos modos especiales, de modo que el dispositivo se inicie como si el usuario hubiera presionado el botón de encendido.
Arranque rápido OEM HAL
Para reemplazar completamente el fastboot del gestor de arranque, fastboot debe manejar todos los comandos fastboot existentes. Muchos de estos comandos provienen de fabricantes de equipos originales y están documentados, pero requieren una implementación personalizada. Muchos comandos específicos de OEM no están documentados. Para manejar dichos comandos, fastboot HAL especifica los comandos OEM requeridos. Los OEM también pueden implementar sus propios comandos.
La definición de fastboot HAL es la siguiente:
import IFastbootLogger;
/**
* IFastboot interface implements vendor specific fastboot commands.
*/
interface IFastboot {
/**
* Returns a bool indicating whether the bootloader is enforcing verified
* boot.
*
* @return verifiedBootState True if the bootloader is enforcing verified
* boot and False otherwise.
*/
isVerifiedBootEnabled() generates (bool verifiedBootState);
/**
* Returns a bool indicating the off-mode-charge setting. If off-mode
* charging is enabled, the device autoboots into a special mode when
* power is applied.
*
* @return offModeChargeState True if the setting is enabled and False if
* not.
*/
isOffModeChargeEnabled() generates (bool offModeChargeState);
/**
* Returns the minimum battery voltage required for flashing in mV.
*
* @return batteryVoltage Minimum battery voltage (in mV) required for
* flashing to be successful.
*/
getBatteryVoltageFlashingThreshold() generates (int32_t batteryVoltage);
/**
* Returns the file system type of the partition. This is only required for
* physical partitions that need to be wiped and reformatted.
*
* @return type Can be ext4, f2fs or raw.
* @return result SUCCESS if the operation is successful,
* FAILURE_UNKNOWN if the partition is invalid or does not require
* reformatting.
*/
getPartitionType(string partitionName) generates (FileSystemType type, Result result);
/**
* Executes a fastboot OEM command.
*
* @param oemCmd The oem command that is passed to the fastboot HAL.
* @response result Returns the status SUCCESS if the operation is
* successful,
* INVALID_ARGUMENT for bad arguments,
* FAILURE_UNKNOWN for an invalid/unsupported command.
*/
doOemCommand(string oemCmd) generates (Result result);
};
Habilitando el arranque rápido
Para habilitar fastbootd
en un dispositivo:
Agregue
fastbootd
aPRODUCT_PACKAGES
endevice.mk
:PRODUCT_PACKAGES += fastbootd
.Asegúrese de que HAL de arranque rápido, HAL de control de arranque y HAL de estado estén empaquetados como parte de la imagen de recuperación.
Agregue los permisos SEPolicy específicos del dispositivo requeridos por
fastbootd
. Por ejemplo,fastbootd
requiere acceso de escritura a una partición específica del dispositivo para actualizar esa partición. Además, la implementación fastboot HAL también puede requerir permisos específicos del dispositivo.
Para validar el fastboot del espacio de usuario, ejecute Vendor Test Suite (VTS) .
Discos ram de proveedor intermitentes
Android 12 y versiones posteriores brindan soporte para flashear discos RAM con un comando fastboot agregado que extrae la imagen completa vendor_boot
de un dispositivo. El comando solicita a la herramienta fastboot del lado del host que lea el encabezado de inicio del proveedor, vuelva a crear la imagen y muestre la nueva imagen.
Para obtener la imagen completa vendor_boot
, se agregó el comando fetch:vendor_boot
tanto al protocolo fastboot como a la implementación fastbootd del protocolo en Android 12. Tenga en cuenta que fastbootd implementa esto, pero es posible que el gestor de arranque no lo haga. Los OEM pueden agregar el comando fetch:vendor_boot
a la implementación del protocolo en su gestor de arranque. Sin embargo, si el comando no se reconoce en el modo de cargador de arranque, la actualización de discos RAM de proveedores individuales en modo de cargador de arranque no es una opción admitida por el proveedor.
Cambios en el gestor de arranque
Los comandos getvar:max-fetch-size
y fetch:name
se implementan en fastbootd
. Para admitir la actualización de discos ram de proveedores en el gestor de arranque, debe implementar estos dos comandos.
Cambios de arranque rápido
getvar:max-fetch-size
es similar a max-download-size
. Especifica el tamaño máximo que el dispositivo puede enviar en una respuesta de DATOS. El conductor no debe buscar un tamaño mayor que este valor.
fetch:name[:offset[:size]]
realiza una serie de comprobaciones en el dispositivo. Si todo lo siguiente es verdadero, el comando fetch:name[:offset[:size]]
devuelve datos:
- El dispositivo ejecuta una compilación depurable.
- El dispositivo está desbloqueado (estado de inicio naranja).
- El nombre de la partición recuperada es
vendor_boot
. - El valor
size
está dentro de 0 <size
<=max-fetch-size
.
Cuando se verifican, fetch:name[:offset[:size]]
devuelve el tamaño y el desplazamiento de la partición. Tenga en cuenta lo siguiente:
-
fetch:name
es equivalente afetch:name:0
, que es equivalente afetch:name:0:partition_size
. -
fetch:name:offset
es equivalente afetch:name:offset:(partition_size - offset)
Por lo tanto fetch:name[:offset[:size]]
= fetch:name:offset:(partition_size - offset)
Cuando no se especifican offset
o partition_size
(o ambos), se utilizan los valores predeterminados, que para offset
es 0 y para size
es el valor calculado de partition_size - offset
.
- Desplazamiento especificado, tamaño no especificado:
size = partition_size - offset
- Ninguno especificado: valores predeterminados utilizados para ambos,
size = partition_size
- 0.
Por ejemplo, fetch:foo
recupera toda la partición foo
en el desplazamiento 0.
Cambios de conductor
Se agregaron comandos a la herramienta fastboot para implementar cambios de controladores. Cada uno está vinculado a su definición completa en la tabla de comandos Fastboot .
fastboot fetch vendor_boot out.img
- Llama
getvar max-fetch-size
para determinar el tamaño del fragmento. - Llama a
getvar partition-size:vendor_boot[_a]
para determinar el tamaño de toda la partición. - Llama
fastboot fetch vendor_boot[_a]:offset:size
para cada fragmento. (El tamaño del fragmento es mayor que el tamañovendor_boot
, por lo que normalmente solo hay un fragmento). - Une los datos para
out.img
.
- Llama
fastboot flash vendor_boot:default vendor-ramdisk.img
Esta es una variante especial del comando flash. Recupera la imagen
vendor_boot
, como si se hubiera llamadofastboot fetch
.- Si el arranque del proveedor es la versión 3 del encabezado, hace lo siguiente:
- Reemplaza el disco RAM del proveedor con la imagen proporcionada.
- Muestra la nueva imagen
vendor_boot
.
- Si el encabezado de inicio del proveedor es la versión 4 , hace lo siguiente:
- Reemplaza todo el disco ram del proveedor con la imagen proporcionada para que la imagen dada se convierta en el único fragmento del disco ram del proveedor en la imagen
vendor_boot
. - Vuelve a calcular el tamaño y el desplazamiento en la tabla del disco RAM del proveedor.
- Muestra la nueva imagen
vendor_boot
.
- Reemplaza todo el disco ram del proveedor con la imagen proporcionada para que la imagen dada se convierta en el único fragmento del disco ram del proveedor en la imagen
- Si el arranque del proveedor es la versión 3 del encabezado, hace lo siguiente:
fastboot flash vendor_boot:foo vendor-ramdisk.img
Recupera
vendor_boot image
, como si se llamara afastboot fetch
.- Si el encabezado de inicio del proveedor es la versión 3, devuelve un error.
Si el encabezado de inicio del proveedor es la versión 4, hace lo siguiente:
- Encuentra el fragmento de disco ram del proveedor con nombre
foo
. Si no se encuentra, o si hay varias coincidencias, devuelve un error. - Reemplaza el fragmento del disco ram del proveedor con la imagen proporcionada.
- Vuelve a calcular cada tamaño y desplazamiento en la tabla de disco ram del proveedor.
- Muestra la nueva imagen
vendor_boot
.
- Encuentra el fragmento de disco ram del proveedor con nombre
mkbootimg
El nombre default
está reservado para nombrar fragmentos de disco RAM del proveedor en Android 12 y versiones posteriores. Si bien la semántica fastboot flash vendor_boot:default
sigue siendo la misma, no debes nombrar tus fragmentos de disco RAM como default
.
Cambios en SELinux
Se realizó un cambio en fastbootd.te
para admitir la actualización de discos ram de proveedores.