Fastboot es el nombre del módulo y modo del bootloader. Android 10 y versiones posteriores admite particiones redimensionables reubicando la implementación de fastboot de bootloader al espacio del usuario. Esta reubicación permite mover el código de actualización a una ubicación común mantenible y probada con solo las partes específicas del proveedor de fastboot implementadas por una capa de abstracción de hardware (HAL). Además, Android 12 y versiones posteriores admiten la escritura en la memoria flash de ramdisks a través de un comando fastboot agregado.
Unifica Fastboot y la recuperación
Debido a que el inicio rápido y la recuperación del espacio del usuario son similares, puedes combinarlos en una un objeto binario o partición de partición. Esto proporciona ventajas, como usar menos espacio, tener menos particiones en general y que Fastboot y Recovery compartan su kernel y bibliotecas.
Fastbootd es el nombre de un daemon de espacio de usuario y modo.
Para admitir fastbootd
, el bootloader debe implementar un nuevo bloque de control de inicio.
(BCB) de boot-fastboot
. Para ingresar al modo fastbootd
, el bootloader escribe boot-fastboot
en el campo de comandos 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 se modifican.
El bootloader se carga y se inicia en la imagen de recuperación luego de ver
boot-fastboot
en el campo de comando de BCB. Luego, la recuperación analiza el mensaje BCB y cambia al modo fastbootd
.
Comandos de ADB
En esta sección, se describe el comando adb
para integrar fastbootd
. El comando tiene diferentes resultados, según si se ejecuta por el sistema o por la recuperación.
Comando | Descripción |
---|---|
reboot fastboot |
|
Comandos de fastboot
En esta sección, se describen los comandos de fastboot para integrar fastbootd
, incluidos los comandos nuevos para actualizar y administrar particiones lógicas. Algunos
comandos tienen resultados diferentes, dependiendo de si fueron ejecutados por
por el bootloader o por fastbootd
.
Comando | Descripción |
---|---|
reboot recovery |
|
reboot fastboot |
Se reinicia en fastbootd . |
getvar is-userspace |
|
getvar is-logical:<partition> |
Muestra yes si la partición determinada es una partición lógica, y no en caso contrario.
Las particiones lógicas admiten todos los comandos que se indican a continuación. |
getvar super-partition-name |
Muestra el nombre de la superpartición. El nombre incluye el sufijo del zócalo actual si la superpartición es una partición A/B (por lo general, no lo es). |
create-logical-partition <partition> <size> |
Crea una partición lógica con el nombre y el tamaño especificados. El nombre no debe ya existen como una partición lógica. |
delete-logical-partition <partition> |
Borra la partición lógica especificada (la borra de forma efectiva). |
resize-logical-partition <partition> <size> |
Cambia el tamaño de la partición lógica al nuevo sin cambiar su contenido. Falla si no hay suficiente espacio disponible para cambiar el tamaño. |
update-super <partition> |
Combina los cambios en los metadatos de la superpartición. Si no es posible realizar una combinación
(por ejemplo, si el formato del dispositivo es no compatible), este
falla. Un parámetro wipe opcional reemplaza los metadatos del dispositivo, en lugar de realizar una combinación. |
flash <partition> [ <filename> ] |
Escribe un archivo en una partición flash. El dispositivo debe estar 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 de bootloader o todas las variables. Si la variable no existe, se muestra un error. |
set_active <slot> |
Establece la ranura de inicio A/B determinada como Para la 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 bootloader. |
fastboot fetch vendor_boot <out.img> |
Úsalo en Android 12 y versiones posteriores para lo siguiente: admiten la escritura en la memoria flash de ramdisks del proveedor.
Obtiene el tamaño total de la partición y el tamaño del fragmento. Obtiene datos para cada fragmento,
luego, une los datos en
Para obtener más información, consulta |
fastboot flash vendor_boot:default <vendor-ramdisk.img> |
Úsalo en Android 12 y versiones posteriores para admitir la escritura en la memoria flash de ramdisks del proveedor. Esta es una variante especial del comando flash. Realiza una función de imagen
Para obtener más información, consulta |
fastboot flash vendor_boot:<foo> <vendor-ramdisk.img> |
Se usa en Android 12 y versiones posteriores para admitir la escritura en la memoria flash de ramdisks del proveedor. Recupera la imagen Para obtener más información, consulta
|
Fastboot y bootloader
El bootloader escribe en la memoria flash las particiones bootloader
, radio
y boot/recovery
, después de lo cual el dispositivo se inicia en fastboot (espacio del usuario) y escribe en la memoria flash todas las demás particiones. El bootloader debe admitir los siguientes comandos.
Comando | Descripción |
---|---|
download |
Descarga la imagen para escribirla en la memoria flash. |
flash recovery <image>/ flash boot <image>/ flash
bootloader <image>/ |
Escribe en la memoria flash la partición recovery/boot y el bootloader. |
reboot |
Reinicia el dispositivo. |
reboot fastboot |
Reinicia en fastboot. |
reboot recovery |
Reinicios a la recuperación. |
getvar |
Obtiene una variable del bootloader que es necesaria para la escritura en la memoria flash de la recuperación o el inicio.
imagen (por ejemplo, current-slot y
max-download-size ). |
oem <command> |
Comando definido por el OEM. |
Particiones dinámicas
El bootloader no debe permitir la actualización ni el borrado de particiones dinámicas, y debe mostrar un error si se intentan estas operaciones. Para reacondicionados
dispositivos de partición dinámica, la herramienta fastboot (y el bootloader) admite una configuración de
para escribir directamente una partición dinámica en la memoria flash mientras se usa el modo bootloader. Para
Por ejemplo, si system
es una partición dinámica en el dispositivo actualizado,
con el comando fastboot --force flash system
habilita el bootloader
(en lugar de fastbootd
) para escribir la partición en la memoria flash.
Carga fuera del modo
Si un dispositivo admite la carga en modo de apagado o, de lo contrario, 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 para que el dispositivo se inicie como si el usuario hubiera presionado el botón de encendido.
HAL de OEM de Fastboot
Para reemplazar por completo el fastboot del bootloader, fastboot debe controlar todos los comandos existentes de fastboot. Muchos de estos comandos son de OEMs y están documentados, pero requieren una implementación personalizada. Muchos comandos específicos del OEM no están documentados. Para controlar esos comandos, el HAL de fastboot especifica los comandos OEM necesarios. Los OEMs también pueden implementar sus propios comandos.
La definición de HAL de fastboot 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);
};
Habilitar fastbootd
Para habilitar fastbootd
en un dispositivo, haz lo siguiente:
Agrega
fastbootd
aPRODUCT_PACKAGES
endevice.mk
:PRODUCT_PACKAGES += fastbootd
.Asegúrate de que el HAL de fastboot, el HAL de control de inicio y el HAL de estado se empaqueten como parte de la imagen de recuperación.
Agrega los permisos de SEPolicy específicos del dispositivo que requiera
fastbootd
. Para Por ejemplo,fastbootd
requiere acceso de escritura a una partición específica del dispositivo para escribe esa partición en la memoria flash. Además, la implementación de HAL de fastboot también puede requerir permisos específicos del dispositivo.
Para validar el inicio rápido del espacio de usuario, ejecuta el Paquete de pruebas de proveedores (VTS).
Escritura en la memoria flash de discos RAM del proveedor
Android 12 y las versiones posteriores admiten lo siguiente:
escribir ramdisks en la memoria flash con un comando fastboot agregado que extrae la
Imagen vendor_boot
de un dispositivo. El comando solicita el fastboot del host
para leer el encabezado de inicio del proveedor, cambiar la imagen y escribir en la memoria flash la nueva imagen.
Para extraer la imagen vendor_boot
completa, se agregó el comando fetch:vendor_boot
.
al protocolo fastboot y a la implementación fastbootd del protocolo
en Android 12. Ten en cuenta que fastbootd sí
pero es posible que el bootloader no. Los OEMs pueden agregar el comando fetch:vendor_boot
a su implementación del bootloader del protocolo. Sin embargo, si el comando no se reconoce en el modo bootloader,
El proveedor no admite la escritura en la memoria flash de ramdisks del proveedor individuales en el modo de bootloader.
de 12 a 1 con la nueva opción de compresión.
Cambios en el bootloader
Los comandos getvar:max-fetch-size
y fetch:name
se implementan en
fastbootd
Para admitir la actualización de las ramdisks del proveedor en el bootloader, debes implementar estos dos comandos.
Cambios de fastbootd
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 DATA. El controlador no debe recuperar un tamaño mayor que este valor.
fetch:name[:offset[:size]]
realiza una serie de verificaciones en el dispositivo. Si se cumple todo lo siguiente, el comando fetch:name[:offset[:size]]
muestra datos:
- El dispositivo está ejecutando una compilación depurable.
- El dispositivo está desbloqueado (estado de inicio en naranja).
- El nombre de la partición recuperada es
vendor_boot
. - El valor de
size
se encuentra dentro de 0 <size
<=max-fetch-size
.
Cuando se verifican, fetch:name[:offset[:size]]
muestra el tamaño de la partición
y desplazamiento.
Ten en cuenta lo siguiente:
fetch:name
es equivalente afetch:name:0
, que es equivalente afetch:name:0:partition_size
.fetch:name:offset
equivale afetch:name:offset:(partition_size - offset)
Por lo tanto, fetch:name[:offset[:size]]
= fetch:name:offset:(partition_size - offset)
.
Cuando no se especifica offset
o partition_size
(o ambos), el
se usan valores predeterminados, que para offset
es 0 y para size
es el valor
valor calculado de partition_size - offset
.
- Se especificó el desplazamiento, pero no el tamaño:
size = partition_size - offset
- Sin especificar: Valores predeterminados usados para ambos,
size = partition_size
- 0.
Por ejemplo, fetch:foo
recupera toda la partición foo
con el desplazamiento 0.
Cambios en el controlador
Se agregaron comandos a la herramienta fastboot para implementar cambios en el controlador. Cada vinculado a su definición completa en la tabla de Fastboot comandos.
fastboot fetch vendor_boot out.img
- Llama a
getvar max-fetch-size
para determinar el tamaño del fragmento. - Llama a
getvar partition-size:vendor_boot[_a]
para determinar la tamaño de toda la partición. - Llama a
fastboot fetch vendor_boot[_a]:offset:size
para cada fragmento. (el tamaño del fragmento es mayor que el tamaño devendor_boot
, por lo que, por lo general, solo hay un fragmento). - Une los datos a
out.img
.
- Llama a
fastboot flash vendor_boot:default vendor-ramdisk.img
Esta es una variante especial del comando flash. Recupera la Imagen
vendor_boot
, como si se llamara afastboot fetch
.- Si el inicio del proveedor tiene el encabezado de la versión 3, hace lo siguiente:
- Reemplaza el ramdisk del proveedor por la imagen determinada.
- Muestra la nueva imagen
vendor_boot
.
- Si el encabezado de inicio del proveedor es version
4,
hace lo siguiente:
- Reemplaza todo el ramdisk del proveedor por la imagen determinada para que esta se convierta en el único fragmento de ramdisk del proveedor en la imagen
vendor_boot
. - Vuelve a calcular el tamaño y el desplazamiento en la tabla del ramdisk del proveedor.
- Muestra la nueva imagen
vendor_boot
.
- Reemplaza todo el ramdisk del proveedor por la imagen determinada para que esta se convierta en el único fragmento de ramdisk del proveedor en la imagen
- Si el inicio del proveedor tiene el encabezado de la versión 3, 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, muestra un error.
Si el encabezado de inicio del proveedor es la versión 4, hará lo siguiente:
- Busca el fragmento de ramdisk del proveedor con el nombre
ramdisk_<var><foo></var>
. Si no se encuentra o si hay varias coincidencias, muestra un error. - Reemplaza el fragmento de ramdisk del proveedor por la imagen determinada.
- Vuelve a calcular cada tamaño y desplazamiento en la tabla de ramdisk del proveedor.
- Muestra la nueva imagen
vendor_boot
.
- Busca el fragmento de ramdisk del proveedor con el nombre
Si no se especifica <foo>, se intenta encontrar
ramdisk_
.
mkbootimg
El nombre default
está reservado para nombrar fragmentos de ramdisk del proveedor en
Android 12 y versiones posteriores Si bien la semántica de flash vendor_boot:default
de fastboot sigue siendo la misma, no debes nombrar tus fragmentos de ramdisk como default
.
Cambios de SELinux
Se realizó un cambio en fastbootd.te
para admitir la actualización de las ramdisks del proveedor.