Fastboot é o nome de um módulo e um modo do carregador de inicialização. O Android 10 e versões mais recentes são compatíveis com partições redimensionáveis ao realocar a implementação do fastboot do carregador de inicialização para o espaço do usuário. Essa relocação permite mover o código de atualização para um local comum manutenível e testável com apenas as partes específicas do fornecedor do fastboot implementadas por uma camada de abstração de hardware (HAL). Além disso, o Android 12 e versões mais recentes oferecem suporte à atualização de ramdisks usando um comando fastboot adicionado.
Unificar fastboot e recuperação
Como o fastboot e a recuperação do espaço do usuário são semelhantes, é possível mesclá-los em uma partição ou um binário. Isso oferece vantagens como usar menos espaço, ter menos partições no geral e fazer com que o fastboot e a recuperação compartilhem o kernel e as bibliotecas.
Fastbootd é o nome de um modo e daemon do espaço do usuário.
Para oferecer suporte ao fastbootd, o carregador de inicialização precisa implementar um novo comando de bloco de controle de inicialização (BCB) de boot-fastboot. Para entrar no modo fastbootd, o carregador de inicialização
grava boot-fastboot no campo de comando da mensagem BCB e deixa o campo
recovery do BCB inalterado (para permitir a reinicialização de qualquer tarefa de recuperação
interrompida). Os campos status, stage e reserved também permanecem inalterados.
O carregador de inicialização carrega e inicializa a imagem de recuperação ao ver
boot-fastboot no campo de comando BCB. Em seguida, a recuperação analisa a mensagem do BCB
e muda para o modo fastbootd.
Comandos do ADB
Esta seção descreve o comando adb para integrar o fastbootd. O
comando tem resultados diferentes, dependendo se é executado pelo sistema ou
pela recuperação.
| Comando | Descrição | 
|---|---|
| reboot fastboot | 
 | 
Comandos do fastboot
Esta seção descreve os comandos do fastboot para integrar o fastbootd,
incluindo novos comandos para atualizar e gerenciar partições lógicas. Alguns
comandos têm resultados diferentes, dependendo se foram executados pelo
bootloader ou pelo fastbootd.
| Comando | Descrição | 
|---|---|
| reboot recovery | 
 | 
| reboot fastboot | Reinicializa em fastbootd. | 
| getvar is-userspace | 
 | 
| getvar is-logical:<partition> | Retorna yesse a partição especificada for lógica. Caso contrário, retornano.
As partições lógicas são compatíveis com 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 A/B (o que geralmente não acontece). | 
| create-logical-partition <partition> <size> | Cria uma partição lógica com o nome e o tamanho especificados. O nome não pode existir como uma partição lógica. | 
| delete-logical-partition <partition> | Exclui a partição lógica especificada (limpa a partição). | 
| resize-logical-partition <partition> <size> | Redimensiona a partição lógica para o novo tamanho sem mudar o conteúdo. Falha se não houver espaço suficiente disponível para realizar o redimensionamento. | 
| flash <partition> [ <filename> ] | Grava um arquivo em uma partição flash. O dispositivo precisa estar desbloqueado. | 
| erase <partition> | Apaga uma partição (não é necessário fazer uma exclusão segura). O dispositivo precisa estar desbloqueado. | 
| getvar <variable> | all | Mostra 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 especificado como  Para oferecer suporte a A/B, os slots são conjuntos duplicados de partições que podem ser inicializadas
de forma independente. Os intervalos são chamados de  | 
| reboot | Reinicia o dispositivo normalmente. | 
| reboot-bootloader(oureboot bootloader) | Reinicializa o dispositivo no carregador de inicialização. | 
| fastboot fetch vendor_boot <out.img> | Use no Android 12 e versões mais recentes para oferecer suporte a atualização de ramdisks do fornecedor. 
    Recebe o tamanho total da partição e o tamanho do bloco. Recebe dados de cada bloco e os une para  
    Para mais detalhes, consulte  | 
| fastboot flash vendor_boot:default <vendor-ramdisk.img> | Use no Android 12 e versões mais recentes para oferecer suporte à atualização de ramdisks do fornecedor. Esta é uma variante especial do comando flash. Ela executa uma função de imagem  
    Para detalhes, consulte
     | 
| fastboot flash vendor_boot:<foo> <vendor-ramdisk.img> | Use no Android 12 e em versões mais recentes para
    oferecer suporte à atualização de ramdisks do fornecedor. Busca a imagem  Para mais detalhes, consulte
       | 
Fastboot e carregador de inicialização
O carregador de inicialização atualiza as partições bootloader, radio e boot/recovery. Depois disso, o dispositivo inicializa o fastboot (espaço do usuário) e atualiza todas as outras partições. O carregador de inicialização precisa ser compatível com os seguintes comandos.
| Comando | Descrição | 
|---|---|
| download | Faz o download da imagem para transferir. | 
| flash recovery <image>/ flash boot <image>/ flash
bootloader <image>/ | Faz o flash da partição recovery/boote do carregador de inicialização. | 
| reboot | Reinicializa o dispositivo. | 
| reboot fastboot | Reinicia para o fastboot. | 
| reboot recovery | Reinicializa para a recuperação. | 
| getvar | Recebe uma variável do carregador de inicialização necessária para a atualização flash da imagem de recuperação/inicialização (por exemplo, current-slotemax-download-size). | 
| oem <command> | Comando definido pelo OEM. | 
Partições dinâmicas
O carregador de inicialização não pode permitir a atualização ou exclusão de partições dinâmicas
e precisa retornar um erro se essas operações forem tentadas. Para dispositivos com
partição dinâmica adaptada, a ferramenta fastboot (e o carregador de inicialização) oferece suporte a um modo
forçado para atualizar diretamente uma partição dinâmica no modo carregador de inicialização. Por exemplo, se system for uma partição dinâmica no dispositivo adaptado, usar o comando fastboot --force flash system permitirá que o carregador de inicialização (em vez de fastbootd) faça o flash da partição.
Carregamento no modo desligado
Se um dispositivo tiver suporte ao carregamento no modo desligado ou inicializar automaticamente em um modo especial quando a energia for aplicada, uma implementação do comando fastboot oem off-mode-charge 0 precisará ignorar esses modos especiais para que o dispositivo seja inicializado como se o usuário tivesse pressionado o botão liga/desliga.
HAL OEM do Fastboot
Para substituir completamente o fastboot do carregador de inicialização, ele precisa processar todos os comandos fastboot atuais. Muitos desses comandos são de OEMs e estão documentados, mas exigem uma implementação personalizada. Muitos comandos específicos do OEM não são documentados. Para processar esses comandos, o HAL do fastboot especifica os comandos OEM necessários. Os OEMs também podem implementar os próprios comandos.
A definição de HAL do fastboot é 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 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);
};
Ativar o fastbootd
Para ativar o fastbootd em um dispositivo:
- Adicione - fastbootda- PRODUCT_PACKAGESem- device.mk:- PRODUCT_PACKAGES += fastbootd.
- Verifique se o HAL do fastboot, o HAL de controle de inicialização e o HAL de integridade estão incluídos na imagem de recuperação. 
- Adicione as permissões da SEPolicy específicas do dispositivo necessárias para - fastbootd. Por exemplo,- fastbootdexige acesso de gravação a uma partição específica do dispositivo para atualizar essa partição. Além disso, a implementação do HAL do fastboot também pode exigir permissões específicas do dispositivo.
Para validar o fastboot do espaço do usuário, execute o Vendor Test Suite (VTS).
Atualizar ramdisks do fornecedor
O Android 12 e versões mais recentes oferecem suporte à
atualização de ramdisks com um comando fastboot adicional que extrai a imagem
vendor_boot completa de um dispositivo. O comando solicita que a ferramenta fastboot
no lado do host leia o cabeçalho de inicialização do fornecedor, recrie a imagem e a atualize.
Para extrair a imagem vendor_boot completa, o comando fetch:vendor_boot foi adicionado
ao protocolo fastboot e à implementação fastbootd do protocolo
no Android 12. O fastbootd implementa
isso, mas o carregador de inicialização talvez não. Os OEMs podem adicionar
o comando fetch:vendor_boot à implementação do carregador de inicialização do
protocolo. No entanto, se o comando não for reconhecido no modo bootloader, o
flashing de ramdisks individuais do fornecedor no modo bootloader não será uma opção
compatível com o fornecedor.
Mudanças no carregador de inicialização
Os comandos getvar:max-fetch-size e fetch:name são implementados em
fastbootd. Para oferecer suporte ao flash de ramdisks do fornecedor no carregador de inicialização, você precisa
implementar estes dois comandos.
Mudanças no fastbootd
getvar:max-fetch-size é semelhante a max-download-size. Ele especifica o
tamanho máximo que o dispositivo pode enviar em uma resposta DATA. O driver não pode
buscar um tamanho maior que esse valor.
fetch:name[:offset[:size]] realiza uma série de verificações no dispositivo. Se todas as condições a seguir forem verdadeiras, o comando fetch:name[:offset[:size]] vai retornar dados:
- O dispositivo está executando um build depurável.
- O dispositivo está desbloqueado (estado de inicialização laranja).
- O nome da partição buscada é vendor_boot.
- O valor sizeestá entre 0 <size<=max-fetch-size.
Quando eles são verificados, fetch:name[:offset[:size]] retorna o tamanho e o deslocamento da partição.
Observe o seguinte:
- fetch:nameé equivalente a- fetch:name:0, que é equivalente a- fetch:name:0:partition_size.
- fetch:name:offseté equivalente a- fetch:name:offset:(partition_size - offset)
Portanto, fetch:name[:offset[:size]] = fetch:name:offset:(partition_size - offset).
Quando offset ou partition_size (ou ambos) não são especificados, os valores padrão são usados. Para offset, o valor é 0, e para size, é o valor calculado de partition_size - offset.
- Deslocamento especificado, tamanho não especificado: size = partition_size - offset
- Nenhum especificado: valores padrão usados para ambos, size = partition_size= 0.
Por exemplo, fetch:foo busca toda a partição foo no deslocamento 0.
Mudanças de motorista
Comandos foram adicionados à ferramenta fastboot para implementar mudanças no driver. Cada um está vinculado à definição completa na tabela de comandos Fastboot.
- fastboot fetch vendor_boot out.img- Chama getvar max-fetch-sizepara determinar o tamanho do bloco.
- Chama getvar partition-size:vendor_boot[_a]para determinar o tamanho de toda a partição.
- Chama fastboot fetch vendor_boot[_a]:offset:sizepara cada pedaço. O tamanho do bloco é maior que o tamanho devendor_boot, então normalmente há apenas um bloco.
- Junta os dados para out.img.
 
- Chama 
- fastboot flash vendor_boot:default vendor-ramdisk.img- Esta é uma variante especial do comando flash. Ele busca a imagem - vendor_boot, como se- fastboot fetchtivesse sido chamado.- Se a inicialização do fornecedor for o cabeçalho versão
3,
ela fará o seguinte:
- Substitui o ramdisk do fornecedor pela imagem especificada.
- Pisca a nova imagem do vendor_boot.
 
- Se o cabeçalho de inicialização do fornecedor for versão
4,
ele fará o seguinte:
- Substitui todo o ramdisk do fornecedor pela imagem especificada para que ela se torne o único fragmento de ramdisk do fornecedor na imagem vendor_boot.
- Recalcula o tamanho e o deslocamento na tabela do ramdisk do fornecedor.
- Pisca a nova imagem do vendor_boot.
 
- Substitui todo o ramdisk do fornecedor pela imagem especificada para que ela se torne o único fragmento de ramdisk do fornecedor na imagem 
 
- Se a inicialização do fornecedor for o cabeçalho versão
3,
ela fará o seguinte:
- fastboot flash vendor_boot:foo vendor-ramdisk.img- Busca - vendor_boot image, como se- fastboot fetchtivesse sido chamado.- Se o cabeçalho de inicialização do fornecedor for da versão 3, um erro será retornado.
- Se o cabeçalho de inicialização do fornecedor for a versão 4, ele fará o seguinte: - Encontra o fragmento de ramdisk do fornecedor com o nome
ramdisk_<var><foo></var>. Se não for encontrado ou se houver várias correspondências, um erro será retornado.
- Substitui o fragmento do ramdisk do fornecedor pela imagem especificada.
- Recalcula cada tamanho e deslocamento na tabela do ramdisk do fornecedor.
- Pisca a nova imagem do vendor_boot.
 
- Encontra o fragmento de ramdisk do fornecedor com o nome
- Se <foo> não for especificado, ele vai tentar encontrar - ramdisk_.
 
mkbootimg
O nome default é reservado para nomear fragmentos do ramdisk do fornecedor no
Android 12 e mais recentes. Embora a semântica do fastboot flash vendor_boot:default
permaneça a mesma, não nomeie seus fragmentos de ramdisk como
default.
Mudanças no SELinux
Uma mudança foi feita em
fastbootd.te
para oferecer suporte a ramdisks de fornecedores de atualização.
