Google se compromete a impulsar la igualdad racial para las comunidades afrodescendientes. Obtén información al respecto.

Mover Fastboot al espacio de usuario

Android 10 y superior admite particiones de tamaño variable al reubicar la implementación de fastboot del cargador de arranque al espacio de usuario. Esta reubicación permite mover el código de actualización a una ubicación común comprobable y mantenible 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 actualización de discos RAM mediante un comando fastboot agregado.

Unificando el arranque rápido y la recuperación

Debido a que el inicio rápido 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 el apoyo fastbootd , el gestor de arranque debe implementar un comando nuevo bloque de control de arranque (BCB) de boot-fastboot . Para entrar fastbootd modo, cargador de arranque escribe boot-fastboot en el campo de comandos del mensaje BCB y deja la recovery campo de la autoridad monetaria sin cambios (para permitir reiniciar las tareas de recuperación interrumpidas). El status , stage , y reserved campos no han cambiado también. Las cargas del gestor de arranque y botas de la imagen de recuperación en al ver a boot-fastboot en el campo de comandos BCB. Recuperación luego analiza el mensaje BCB y cambia a fastbootd modo.

Comandos ADB

En esta sección se describe el adb comando para integrar fastbootd . El comando tiene resultados diferentes, dependiendo de si se ejecuta por sistema o por recuperación.

Mando Descripción
reboot fastboot
  • Reinicia en fastbootd (sistema).
  • Entra fastbootd directamente sin un reinicio (recuperación).

Comandos de Fastboot

En esta sección se describen los comandos de fastboot para integrar fastbootd , incluyendo nuevos comandos para parpadear y la gestión de particiones lógicas. Algunos comandos tienen diferentes resultados, dependiendo de si han sido ejecutadas por el gestor de arranque o por fastbootd .

Mando Descripción
reboot recovery
  • Reinicia en recuperación (gestor de arranque).
  • Entra recuperación directamente sin un reinicio ( fastbootd ).
reboot fastboot Se reinicia en fastbootd .
getvar is-userspace
  • Devoluciones yes ( fastbootd ).
  • Devuelve no (gestor de arranque).
getvar is-logical: <partition> Devoluciones yes si la partición dada es una partición lógica, no otra cosa. 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 dados. El nombre no debe existir como partición lógica.
delete-logical-partition <partition> Elimina la partición lógica dada (limpia 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 una combinación (por ejemplo, el formato del dispositivo es una versión no compatible), este comando falla. Un opcional wipe sobrescribe los parámetros de 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 en estado desbloqueado.
erase <partition> Borra una partición (no es necesario para borrar de forma segura). 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 dado como active . En el siguiente intento de arranque, el sistema arranca desde la ranura especificada.

Para la compatibilidad con A / B, las ranuras son conjuntos duplicados de particiones que se pueden iniciar de forma independiente. Las ranuras se nombran a , b , y así sucesivamente, y diferenciarse mediante la adición de los sufijos _a , _b , y así sucesivamente hasta el nombre de la partición.

reboot Reinicia el dispositivo normalmente.
reboot-bootloader (o reboot bootloader ) Reinicia el dispositivo en el cargador de arranque.
fastboot fetch vendor_boot <out.img>

El uso en Android 12 y superior para apoyar intermitentes discos ram proveedores.

Obtiene el tamaño completo de la partición y el tamaño del fragmento. Obtiene datos para cada trozo, entonces puntadas de los datos junto a <out.img>

Para más detalles, véase fastboot fetch vendor_boot <out.img> .

fastboot flash vendor_boot:default <vendor-ramdisk.img>

El uso en Android 12 y superior para apoyar intermitentes discos ram proveedores.

Esta es una variante especial del comando flash. Se lleva a cabo una fetch vendor_boot función de la imagen, como si fastboot fetch fue llamado. El nuevo vendor_boot imagen parpadea depende de si la versión de cabecera de arranque es la versión 3 o versión 4.

Para más detalles, véase el fastboot flash vendor_boot:default <vendor-ramdisk.img> .

fastboot flash vendor_boot: <foo> <vendor-ramdisk.img> El uso en Android 12 y superior para apoyar intermitentes discos ram proveedores.

Obtiene la vendor_boot imagen. Devuelve un error si el encabezado de arranque del proveedor es la versión 3. Si es la versión 4, encuentra el fragmento de disco RAM del proveedor correcto (si está disponible). Sustituye a que con la imagen dada, vuelve a calcular los tamaños y las compensaciones, y destella la nueva vendor_boot image .

Para más detalles, véase fastboot flash vendor_boot: <foo> <vendor-ramdisk.img>

Fastboot y gestor de arranque

El gestor de arranque parpadea el bootloader , radio y boot/recovery particiones, después de lo cual se inicia el dispositivo en fastboot (espacio de usuario) y parpadea todas las demás particiones. El cargador de arranque debe admitir los siguientes comandos.

Mando Descripción
download Descarga la imagen a flash.
flash recovery <image> / flash boot <image> / flash bootloader <image> / Parpadea en recovery/boot de particiones y gestor de arranque.
reboot Reinicia el dispositivo.
reboot fastboot Reinicia para fastboot.
reboot recovery Reinicia para recuperarse.
getvar Obtiene una variable cargador de arranque que se requiere para parpadear imagen de recuperación / boot de (por ejemplo, current-slot y max-download-size ).
oem <command> Comando definido por OEM.

Particiones dinámicas

El gestor de arranque no debe permitir que el parpadeo o el borrado de particiones dinámicas y debe devolver un error si se intenta realizar estas operaciones. Para los 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 está en el modo de cargador de arranque. Por ejemplo, si system es una partición dinámica en el dispositivo instalado posteriormente, utilizando el fastboot --force flash system comando permite que el cargador de arranque (en lugar de fastbootd ) de flash para la partición.

Carga en modo apagado

Si un dispositivo admite fuera del modo de carga o de otra manera autoboots en un modo especial cuando se aplica energía, una implementación del fastboot oem off-mode-charge 0 comando debe derivación de estos modos especiales, por lo que se inicia el dispositivo como si el usuario hubiera pulsado el botón de encendido.

Fastboot OEM HAL

Para reemplazar completamente el fastboot del cargador de arranque, fastboot debe manejar todos los comandos fastboot existentes. Muchos de estos comandos son de fabricantes de equipos originales y están documentados, pero requieren una implementación personalizada. Muchos comandos OEM-específicos no están documentadas. 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 fastbootd

Para habilitar fastbootd en un dispositivo:

  1. Añadir fastbootd a PRODUCT_PACKAGES en device.mk : PRODUCT_PACKAGES += fastbootd .

  2. Asegúrese de que fastboot HAL, boot control HAL y health HAL estén empaquetados como parte de la imagen de recuperación.

  3. Añadir los permisos SEPolicy específicos del dispositivo requeridos por fastbootd . Por ejemplo, fastbootd requiere acceso de escritura a un dispositivo de partición específica a parpadear esa partición. Además, la implementación de fastboot HAL también puede requerir permisos específicos del dispositivo.

Para validar fastboot espacio de usuario, ejecutar el conjunto de pruebas de proveedor (VTS) .

Ramdisks de proveedor parpadeantes

Android 12 y posterior sirve de soporte para discos ram intermitente con un comando fastboot añadido que tira el pleno vendor_boot imagen 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 una imagen y actualice la nueva imagen.

Para tirar de la plena vendor_boot imagen, el comando fetch:vendor_boot fue introducido en el protocolo fastboot, y la implementación del protocolo fastbootd en Android 12. Tenga en cuenta que no fastbootd implementar esto, pero el gestor de arranque en sí misma no podría. OEM pueden agregar la fetch:vendor_boot comando para su aplicación gestor de arranque del protocolo. Sin embargo, si el comando no se reconoce en el modo de cargador de arranque, la actualización de los discos RAM de proveedores individuales en el modo de cargador de arranque no es una opción admitida por el proveedor.

Cambios en el cargador de arranque

Los comandos getvar:max-fetch-size y fetch:name se implementan en fastbootd . Para admitir la actualización de los discos RAM del proveedor en el gestor de arranque, debe 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 DATOS. El controlador no debe obtener un tamaño superior a este valor.

fetch:name[:offset[:size]] realiza una serie de controles sobre el dispositivo. Si todos los siguientes son verdaderas, la fetch:name[:offset[:size]] devuelve los datos de comando:

  • El dispositivo está ejecutando una compilación depurable.
  • El dispositivo está desbloqueado (estado de inicio naranja).
  • El nombre de la partición es inverosímil vendor_boot .
  • El size valor cae dentro de 0 < size <= max-fetch-size .

Cuando éstos se verifican, fetch:name[:offset[:size]] devuelve el tamaño de la partición y offset. Tenga en cuenta lo siguiente:

  • fetch:name es equivalente a fetch:name:0 , que es equivalente a fetch:name:0:partition_size .
  • fetch:name:offset es equivalente a fetch:name:offset:(partition_size - offset)

Por lo tanto fetch:name[:offset[:size]] = fetch:name:offset:(partition_size - offset)

Cuando offset o partition_size (o ambos) no están especificados, se utilizan los valores por defecto, que para offset es 0, y por size es el valor calculado de partition_size - offset .

  • Desplazamiento especificado, el tamaño no especificado: size = partition_size - offset
  • Ni especificado: valores predeterminados utilizados para ambos, size = partition_size - 0.

Por ejemplo, fetch:foo obtiene toda la foo partición en la posición 0.

Cambios de controlador

Se agregaron comandos a la herramienta fastboot para implementar cambios en el controlador. Cada uno está vinculada a su definición completa en la tabla de comandos FastBoot .

  • fastboot fetch vendor_boot out.img

    • Llamadas getvar max-fetch-size para determinar el tamaño del fragmento.
    • Pide getvar partition-size:vendor_boot[_a] para determinar el tamaño de toda la partición.
    • Llamadas fastboot fetch vendor_boot[_a]:offset:size de cada fragmento. (El tamaño del trozo es mayor que la vendor_boot tamaño, por lo que hay normalmente un único trozo.)
    • Puntadas los datos juntos, a out.img .
  • fastboot flash vendor_boot:default vendor-ramdisk.img

    Esta es una variante especial del comando flash. Se obtiene el vendor_boot imagen, como si fastboot fetch fue llamado.

    • Si el arranque vendedor es cabecera de la versión 3 , se hace lo siguiente:
      • Reemplaza el disco RAM del proveedor con la imagen dada.
      • Parpadea en la nueva vendor_boot imagen.
    • Si la cabecera proveedor de arranque es la versión 4 , se hace lo siguiente:
      • Reemplaza todo el disco RAM proveedor con la imagen que se da de manera que la imagen dada se convierte en el único proveedor fragmento de disco de memoria en la vendor_boot imagen.
      • Vuelve a calcular el tamaño y el desplazamiento en la tabla de disco RAM del proveedor.
      • Parpadea en la nueva vendor_boot imagen.
  • fastboot flash vendor_boot:foo vendor-ramdisk.img

    Obtiene vendor_boot image , como si fastboot fetch fue llamado.

    • Si el encabezado de inicio del proveedor es la versión 3, devuelve un error.
    • Si el encabezado de arranque del proveedor es la versión 4, hace lo siguiente:

      • Busca el fragmento de disco RAM proveedor con nombre foo . Si no se encuentra, o si hay varias coincidencias, devuelve un error.
      • Reemplaza el fragmento de disco RAM del proveedor con la imagen dada.
      • Vuelve a calcular cada tamaño y compensación en la tabla de disco RAM del proveedor.
      • Parpadea en la nueva vendor_boot imagen.

mkbootimg

El nombre default está reservado para nombrar fragmentos proveedor del disco ram Android 12 y superior. Mientras que el fastboot flash vendor_boot:default semántica siguen siendo los mismos, no se debe nombrar sus fragmentos del disco ram como default .

Cambios de SELinux

Se realizó un cambio en fastbootd.te para apoyar intermitentes discos ram proveedores.