O Android 10 e versões posteriores oferecem suporte a partições redimensionáveis, realocando a implementação do fastboot do bootloader para o espaço do usuário. Essa realocação permite mover o código flash para um local comum passível de manutenção 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 superior suporta flashing de ramdisks por meio de um comando fastboot adicionado.
Unificando fastboot e recuperação
Como o fastboot e a recuperação do espaço do usuário são semelhantes, você pode mesclá-los em uma partição ou binário. Isso oferece vantagens como usar menos espaço, ter menos partições em geral e fazer com que o fastboot e a recuperação compartilhem seu kernel e bibliotecas.
Para suportar fastbootd
, o bootloader deve implementar um novo comando de bloco de controle de inicialização (BCB) de boot-fastboot
. Para entrar no modo fastbootd
, o bootloader grava boot-fastboot
no campo de comando da mensagem do BCB e deixa o campo recovery
do BCB inalterado (para permitir o reinício de quaisquer tarefas de recuperação interrompidas). Os campos status
, stage
e reserved
também permanecem inalterados. O bootloader carrega e inicializa na imagem de recuperação ao ver boot-fastboot
no campo de comando BCB. A recuperação então analisa a mensagem BCB e muda para o modo fastbootd
.
Comandos ADB
Esta seção descreve o comando adb
para integração fastbootd
. O comando tem resultados diferentes, dependendo se é executado pelo sistema ou por recuperação.
Comando | Descrição |
---|---|
reboot fastboot |
|
Comandos de inicialização rápida
Esta seção descreve os comandos fastboot para integração fastbootd
, incluindo novos comandos para atualização e gerenciamento de 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 | Reinicia em fastbootd . |
getvar is-userspace |
|
getvar is-logical: <partition> | Retorna yes se a partição fornecida for uma partição lógica, caso contrário no . 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 (limpa 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 for uma versão sem suporte), esse comando falhará. Um parâmetro 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 no estado desbloqueado. |
erase <partition> | Apaga uma partição (não é necessário um apagamento seguro). O dispositivo deve estar no estado desbloqueado. |
getvar <variable> | all | Exibe uma variável do bootloader 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 de forma independente. Os slots são nomeados |
reboot | Reinicia o dispositivo normalmente. |
reboot-bootloader (ou reboot bootloader ) | Reinicia o dispositivo no bootloader. |
fastboot fetch vendor_boot <out.img> | Use no Android 12 e superior para oferecer suporte a ramdisks de fornecedores flash. Obtém o tamanho total da partição e o tamanho do bloco. Obtém dados para cada pedaço e depois une os dados em Para obter detalhes, consulte |
fastboot flash vendor_boot:default <vendor-ramdisk.img> | Use no Android 12 e superior para oferecer suporte a ramdisks de fornecedores flash. Esta é uma variante especial do comando flash. Ele executa uma função Para obter detalhes, consulte |
fastboot flash vendor_boot: <foo> <vendor-ramdisk.img> | Use no Android 12 e superior para oferecer suporte a ramdisks de fornecedores flash. Busca a imagem Para obter detalhes, consulte |
Fastboot e bootloader
O bootloader atualiza as partições bootloader
, radio
e boot/recovery
, após o qual o dispositivo inicializa no fastboot (userspace) e atualiza todas as outras partições. O bootloader deve suportar os seguintes comandos.
Comando | Descrição |
---|---|
download | Baixa a imagem para flash. |
flash recovery <image> / flash boot <image> / flash bootloader <image> / | Pisca a partição recovery/boot e o bootloader. |
reboot | Reinicia o dispositivo. |
reboot fastboot | Reinicia para fastboot. |
reboot recovery | Reinicia para recuperação. |
getvar | Obtém uma variável de bootloader necessária para atualizar a 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 bootloader não deve permitir a atualização 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) suporta um modo forçado para atualizar diretamente uma partição dinâmica enquanto estiver no modo bootloader. Por exemplo, se system
for uma partição dinâmica no dispositivo adaptado, usar o comando fastboot --force flash system
permite que o carregador de inicialização (em vez de fastbootd
) atualize a partição.
Carregamento fora do modo
Se um dispositivo suportar carregamento fora do modo ou de outra forma inicializar automaticamente em um modo especial quando a energia for aplicada, uma implementação do comando fastboot oem off-mode-charge 0
deverá ignorar esses modos especiais, para que o dispositivo inicialize como se o usuário tivesse pressionado o botão liga/desliga.
Fastboot OEM HAL
Para substituir completamente o bootloader fastboot, o 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 específicos do OEM não estão documentados. Para lidar com esses comandos, o fastboot HAL especifica os comandos OEM necessários. Os OEMs também podem implementar 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 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 ativar fastbootd
em um dispositivo:
Adicione
fastbootd
aPRODUCT_PACKAGES
emdevice.mk
:PRODUCT_PACKAGES += fastbootd
.Certifique-se de que o HAL de inicialização rápida, 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 por
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 do fastboot HAL 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) .
Ramdisks de fornecedores piscando
O Android 12 e versões posteriores oferecem suporte para flashing ramdisks com um comando fastboot adicionado que extrai a imagem vendor_boot
completa de um dispositivo. O comando solicita que a ferramenta fastboot do lado do host leia o cabeçalho de inicialização do fornecedor, recrie a imagem e atualize a nova imagem.
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. Observe que fastbootd implementa isso, mas o próprio bootloader pode não. Os OEMs podem adicionar o comando fetch:vendor_boot
à implementação do protocolo do bootloader. No entanto, se o comando não for reconhecido no modo bootloader, a atualização de ramdisks de fornecedores individuais no modo bootloader não é uma opção suportada pelo fornecedor.
Mudanças no bootloader
Os comandos getvar:max-fetch-size
e fetch:name
são implementados em fastbootd
. Para oferecer suporte a ramdisks de fornecedores flash no bootloader, você deve implementar esses dois comandos.
Mudanças no Fastbootd
getvar:max-fetch-size
é semelhante a max-download-size
. Especifica o tamanho máximo que o dispositivo pode enviar em uma resposta DATA. O driver não deve buscar um tamanho maior que esse valor.
fetch:name[:offset[:size]]
executa uma série de verificações no dispositivo. Se todas as afirmações a seguir forem verdadeiras, o comando fetch:name[:offset[:size]]
retornará dados:
- O dispositivo está executando uma compilação depurável.
- O dispositivo está desbloqueado (estado de inicialização laranja).
- O nome da partição buscada é
vendor_boot
. - O valor
size
está dentro de 0 <size
<=max-fetch-size
.
Quando estes são verificados, fetch:name[:offset[:size]]
retorna o tamanho e o deslocamento da partição. Observe o seguinte:
-
fetch:name
é equivalente afetch:name:0
, que é equivalente afetch:name:0:partition_size
. -
fetch:name:offset
é equivalente afetch: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, que para offset
é 0 e para size
é o valor calculado de partition_size - offset
.
- Deslocamento especificado, tamanho não especificado:
size = partition_size - offset
- Nenhum dos dois especificados: 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 driver
Comandos foram adicionados à ferramenta fastboot para implementar alterações de driver. Cada um está vinculado à sua definição completa na tabela de comandos do Fastboot .
fastboot fetch vendor_boot out.img
- Chama
getvar max-fetch-size
para determinar o tamanho do pedaço. - Chama
getvar partition-size:vendor_boot[_a]
para determinar o tamanho de toda a partição. - Chama
fastboot fetch vendor_boot[_a]:offset:size
para cada pedaço. (O tamanho do bloco é maior que o tamanhovendor_boot
, portanto normalmente há apenas um pedaço.) - Une os dados em
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 sefastboot fetch
tivesse sido chamada.- Se a inicialização do fornecedor for a versão do cabeçalho 3 , ele fará o seguinte:
- Substitui o ramdisk do fornecedor pela imagem fornecida.
- Atualiza a nova imagem
vendor_boot
.
- Se o cabeçalho de inicialização do fornecedor for a versão 4 , ele fará o seguinte:
- Substitui todo o ramdisk do fornecedor pela imagem fornecida para que a imagem fornecida se torne o único fragmento do ramdisk do fornecedor na imagem
vendor_boot
. - Recalcula o tamanho e o deslocamento na tabela de ramdisk do fornecedor.
- Pisca a nova imagem
vendor_boot
.
- Substitui todo o ramdisk do fornecedor pela imagem fornecida para que a imagem fornecida se torne o único fragmento do ramdisk do fornecedor na imagem
- Se a inicialização do fornecedor for a versão do cabeçalho 3 , ele fará o seguinte:
fastboot flash vendor_boot:foo vendor-ramdisk.img
Busca
vendor_boot image
, como sefastboot fetch
tivesse sido chamada.- Se o cabeçalho de inicialização do fornecedor for a versão 3, ele retornará um erro.
Se o cabeçalho de inicialização do fornecedor for a versão 4, ele fará o seguinte:
- Encontra o fragmento do ramdisk do fornecedor com o nome
foo
. Se não for encontrado ou se houver várias correspondências, retornará um erro. - Substitui o fragmento do ramdisk do fornecedor pela imagem fornecida.
- Recalcula cada tamanho e deslocamento na tabela de ramdisk do fornecedor.
- Pisca a nova imagem
vendor_boot
.
- Encontra o fragmento do ramdisk do fornecedor com o nome
mkbootimg
O nome default
é reservado para nomear fragmentos de ramdisk do fornecedor no Android 12 e versões posteriores. Embora a semântica fastboot flash vendor_boot:default
permaneça a mesma, você não deve nomear seus fragmentos de ramdisk como default
.
Mudanças no SELinux
Uma alteração foi feita no fastbootd.te
para oferecer suporte a ramdisks de fornecedores flash.