O Android 10 e superior oferecem suporte a partições redimensionáveis, realocando a implementação fastboot do carregador de inicialização para o espaço do usuário. Essa realocação permite mover o código de flash para um local comum que pode ser mantido e testado com apenas as partes específicas do fornecedor do fastboot implementadas por uma camada de abstração de hardware (HAL).
Unificando inicialização rápida e recuperação
Como o boot rápido e a recuperação do espaço de usuário são semelhantes, você pode mesclá-los em uma partição / binário. As vantagens incluem menos uso de espaço e menos partições em geral, bem como a capacidade de fastboot e recuperação para compartilhar seu kernel e bibliotecas.
Para suportar o fastbootd
, o bootloader deve implementar um novo comando boot control block (BCB) de boot-fastboot
. Para entrar fastbootd
modo fastbootd
, o bootloader deve escrever boot-fastboot
no campo de comando da mensagem do BCB e deixar o campo de recovery
do BCB inalterado (para permitir o reinício das tarefas de recuperação interrompidas). Os campos de status
, stage
e reserved
permanecem inalterados. Espera-se que o bootloader carregue e inicialize na imagem de recuperação ao ver boot-fastboot
no comando BCB. A recuperação analisa a mensagem BCB e alterna para fastbootd
modo fastbootd
.
Comandos ADB
Esta seção descreve o comando adb
para integrar o fastbootd
. O comando tem comportamento diferente dependendo se o sistema ou a recuperação executa o comando.
Comando | Descrição |
---|---|
reboot fastboot |
|
Comandos Fastboot
Esta seção descreve os comandos fastboot para integrar fastbootd
, incluindo novos comandos para atualizar e gerenciar partições lógicas. Alguns comandos têm comportamentos diferentes dependendo se o bootloader ou o fastbootd
executa o comando.
Comando | Descrição |
---|---|
reboot recovery |
|
reboot fastboot | Reinicia em fastbootd . |
getvar is-userspace |
|
getvar is-logical:<partition> | Retorna yes se a partição fornecida for uma partição lógica, no caso contrário. As partições lógicas suportam todos os comandos listados abaixo. |
getvar super-partition-name | Retorna o nome da superpartição. O nome inclui o sufixo do slot atual se a superpartição for uma partição A / B (geralmente não é). |
create-logical-partition <partition> <size> | Cria uma partição lógica com o nome e tamanho fornecidos. O nome ainda não deve existir como partição lógica. |
delete-logical-partition <partition> | Exclui a partição lógica fornecida (limpando efetivamente a partição). |
resize-logical-partition <partition> <size> | Redimensiona a partição lógica para o novo tamanho sem alterar seu conteúdo. Falha se não houver espaço suficiente disponível para realizar o redimensionamento. |
update-super <partition> | Mescla as alterações nos metadados da superpartição. Se uma mesclagem não for possível (por exemplo, o formato no dispositivo é uma versão não suportada), este comando falhará. Um parâmetro de wipe opcional substitui os metadados do dispositivo em vez de realizar uma mesclagem. |
flash <partition> [ <filename> ] | Grava um arquivo em uma partição flash. O dispositivo deve estar desbloqueado. |
erase <partition> | Apaga uma partição (não é necessário para apagar com segurança). O dispositivo deve estar desbloqueado. |
getvar <variable> | all | Exibe uma variável do carregador de inicialização ou todas as variáveis. Se a variável não existir, retorna um erro. |
set_active <slot> | Define o slot de inicialização A / B fornecido como Para suporte A / B, os slots são conjuntos duplicados de partições que podem ser inicializados independentemente. Slots são nomeados |
reboot | Reinicia o dispositivo normalmente. |
reboot-bootloader (ou reboot bootloader ) | Reinicializa o dispositivo no bootloader. |
Fastboot e bootloader
O bootloader atualiza o bootloader
, o radio
e as partições de boot/recovery
, após o que o dispositivo inicializa em fastboot (espaço do usuário) e atualiza todas as outras partições. O bootloader deve suportar os seguintes comandos.
Comando | Descrição |
---|---|
download | Baixa a imagem para o flash. |
flash recovery <image>/ flash boot <image>/ flash bootloader <image>/ | recovery/boot flashes recovery/boot partição de recovery/boot e carregador de inicialização. |
reboot | Reinicializa o dispositivo. |
reboot fastboot | Reinicia para fastboot. |
reboot recovery | Reinicia para recuperação. |
getvar | Obtém uma variável do carregador de inicialização que é necessária para a current-slot imagem de recuperação / inicialização (por exemplo, current-slot e max-download-size ). |
oem <command> | Comando definido pelo OEM. |
Partições dinâmicas
O carregador de inicialização não deve permitir o flash ou apagamento de partições dinâmicas e deve retornar um erro se essas operações forem tentadas. Para dispositivos de partição dinâmica adaptados, a ferramenta fastboot (e bootloader) oferece suporte a um modo de força para atualizar diretamente uma partição dinâmica durante o modo bootloader. Por exemplo, se o system
for uma partição dinâmica no dispositivo adaptado, usar fastboot --force flash system
permite que o bootloader atualize a partição em vez de fastbootd
.
Carregamento em modo desligado
Se um dispositivo suportar carregamento no modo desligado ou de outra forma autoboots em um modo especial quando a energia é aplicada, o comando fastboot oem off-mode-charge 0
deve ignorar esses modos especiais e o dispositivo deve inicializar como se o usuário tivesse pressionado o botão fastboot oem off-mode-charge 0
.
Fastboot OEM HAL
Para substituir completamente o bootloader fastboot, fastboot deve lidar com todos os comandos fastboot existentes. Muitos desses comandos são de OEMs e estão documentados, mas exigem uma implementação personalizada (muitos comandos também são específicos do OEM e não estão documentados). Para lidar com esses comandos, o fastboot HAL especifica os comandos OEM necessários e permite que os OEMs implementem seus próprios comandos.
A definição de fastboot HAL é a seguinte:
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 oemCmdArgs 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 o fastbootd
Para habilitar o fastbootd
em um dispositivo:
Adicione
fastbootd
aPRODUCT_PACKAGES
emdevice.mk
:PRODUCT_PACKAGES += fastbootd
.Certifique-se de que o HAL fastboot, o HAL de controle de inicialização e o HAL de integridade estejam empacotados como parte da imagem de recuperação.
Adicione quaisquer permissões SEPolicy específicas do dispositivo exigidas pelo
fastbootd
. Por exemplo,fastbootd
requer acesso de gravação a uma partição específica do dispositivo para atualizar essa partição. Além disso, a implementação de fastboot HAL também pode exigir permissões específicas do dispositivo.
Para validar o fastboot do espaço de usuário, execute o Vendor Test Suite (VTS) .