O Android 10 e versões mais recentes oferecem suporte a partições redimensionáveis, realocando a implementação do fastboot do carregador de inicialização para o espaço do usuário. Essa realocação permite mover o código de atualização para um local comum sustentá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 em ramdisks usando um comando fastboot adicionado.
Unificar o fastboot e a 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 binário. Isso oferece vantagens como o uso de 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.
Para oferecer suporte a fastbootd
, o carregador de inicialização precisa implementar um novo comando de bloco de controle de inicialização (BCB, na sigla em inglês) de boot-fastboot
. Para entrar no modo fastbootd
, o carregador de inicialização
grava boot-fastboot
no campo de comando da mensagem do BCB e deixa o
campo recovery
do BCB inalterado (para ativar 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 na imagem de recuperação ao ver boot-fastboot
no campo de comando do BCB. Em seguida, a recuperação analisa a mensagem do BCB
e alterna para o modo fastbootd
.
Comandos adb
Esta seção descreve o comando adb
para integrar o fastbootd
. O
comando tem resultados diferentes, dependendo se é executado pelo sistema ou
por recuperação.
Comando | Descrição |
---|---|
reboot fastboot |
|
Comandos de 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
carregador de inicialização ou por fastbootd
.
Comando | Descrição |
---|---|
reboot recovery |
|
reboot fastboot |
Reinicializa em fastbootd . |
getvar is-userspace |
|
getvar is-logical:<partition> |
Retorna yes se a partição especificada é uma partição lógica. Caso contrário, retorna no .
As partições lógicas oferecem suporte a todos os comandos listados abaixo. |
getvar super-partition-name |
Retorna o nome da superpartição. O nome incluirá o sufixo de slot atual se a superpartição for A/B (geralmente não é). |
create-logical-partition <partition> <size> |
Cria uma partição lógica com o nome e o tamanho fornecidos. O nome não pode existir como uma partição lógica. |
delete-logical-partition <partition> |
Exclui a partição lógica especificada (apaga efetivamente a partição). |
resize-logical-partition <partition> <size> |
Redimensiona a partição lógica para o novo tamanho sem alterar o conteúdo. Falha se não houver espaço suficiente disponível para fazer o redimensionamento. |
update-super <partition> |
Mescla as alterações nos metadados da superpartição. Se uma mesclagem não for possível
(por exemplo, se o formato no dispositivo for de uma versão sem suporte), esse
comando vai 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 precisa estar desbloqueado. |
erase <partition> |
Apaga uma partição (não é necessário para ser uma limpeza 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, retornará 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 chamados de |
reboot |
Reinicializa o dispositivo normalmente. |
reboot-bootloader (ou reboot 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 à atualização dos ramdisks do fornecedor.
Recebe o tamanho inteiro da partição e o tamanho do bloco. Recebe dados de cada bloco e os agrupa em
Veja mais detalhes em |
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. Essa é uma variante especial do comando flash. Ele executa uma função de imagem
Para mais detalhes, consulte
|
fastboot flash vendor_boot:<foo> <vendor-ramdisk.img> |
Use no Android 12 e 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 é inicializado no fastboot (espaço do usuário) e atualiza todas as outras partições. O carregador de inicialização precisa ser compatível com os comandos abaixo.
Comando | Descrição |
---|---|
download |
Faz o download da imagem para atualização. |
flash recovery <image>/ flash boot <image>/ flash
bootloader <image>/ |
Atualiza a partição recovery/boot e o carregador de inicialização. |
reboot |
Reinicializa o dispositivo. |
reboot fastboot |
Reinicializa para o fastboot. |
reboot recovery |
Reinicializa a recuperação. |
getvar |
Recebe uma variável do carregador de inicialização necessária para a atualização da 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 pode permitir a atualização ou a limpeza de partições dinâmicas e precisa retornar um erro em caso de tentativa dessas operações. Para dispositivos atualizados de partição dinâmica, a ferramenta fastboot (e o carregador de inicialização) aceita um modo de força para atualizar diretamente uma partição dinâmica no modo de carregador de inicialização. Por
exemplo, se system
for uma partição dinâmica no dispositivo atualizado,
o uso do comando fastboot --force flash system
permitirá que o carregador de inicialização
(em vez de fastbootd
) atualize a partição.
Carregamento no modo desativado
Se um dispositivo oferecer suporte ao carregamento fora do modo ou for inicializado automaticamente em um modo
especial quando a energia estiver ativada, 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 de OEM de fastboot
Para substituir completamente o fastboot, o fastboot precisa processar todos os comandos do 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, a HAL de fastboot especifica os comandos do OEM necessários. Os OEMs também podem implementar os próprios comandos.
A definição da HAL de fastboot é esta:
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:
Adicionar
fastbootd
aPRODUCT_PACKAGES
emdevice.mk
:PRODUCT_PACKAGES += fastbootd
.Confira se a HAL de fastboot, a HAL de controle de inicialização e a HAL de integridade estão empacotados como parte da imagem de recuperação.
Adicione todas as 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 da HAL de fastboot também pode exigir permissões específicas do dispositivo.
Para validar o fastboot do espaço do usuário, execute o conjunto de testes de fornecedor (VTS).
Atualizar ramdisks do fornecedor
O Android 12 e versões mais recentes oferecem suporte à
atualização de ramdisks com um comando fastboot adicionado 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 próprio carregador de inicialização pode não fazer isso. 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 do carregador de inicialização, a atualização dos ramdisks de fornecedores individuais no modo de carregador de inicialização não será uma opção
aceita pelo 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 à atualização dos ramdisks do fornecedor no carregador de inicialização, implemente estes dois comandos.
Mudanças no fastboot
getvar:max-fetch-size
é semelhante a max-download-size
. Ele especifica o
tamanho máximo que o dispositivo pode enviar em uma resposta de DADOS. O driver não pode buscar um tamanho maior que esse valor.
O fetch:name[:offset[:size]]
executa 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 (o estado de inicialização é laranja).
- O nome da partição buscado é
vendor_boot
. - O valor de
size
está dentro de 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 afetch:name:0
, que equivale 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 forem especificados, os
valores padrão serão usados, o 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 especificado: valores padrão usados para ambos,
size = partition_size
- 0.
Por exemplo, fetch:foo
busca a partição foo
inteira no deslocamento 0.
Mudanças de drivers
Foram adicionados comandos à ferramenta fastboot para implementar alterações de driver. Cada um está vinculado à 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 bloco. - Chama
getvar partition-size:vendor_boot[_a]
para determinar o tamanho da partição inteira. - Chama
fastboot fetch vendor_boot[_a]:offset:size
para cada bloco. O tamanho do bloco é maior que o tamanho devendor_boot
, por isso normalmente há apenas um bloco. - Agrupa os dados ao
out.img
.
- Chama
fastboot flash vendor_boot:default vendor-ramdisk.img
Essa é uma variante especial do comando flash. Ele busca a imagem
vendor_boot
, como sefastboot fetch
tivesse sido chamado.- Se a inicialização do fornecedor for o cabeçalho versão
3,
ele fará o seguinte:
- Substitui o ramdisk do fornecedor pela imagem especificada.
- 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 especificada, de modo que ela
se torne o único fragmento do ramdisk do fornecedor na
imagem
vendor_boot
. - Recalcula o tamanho e o deslocamento na tabela do ramdisk do fornecedor.
- Atualiza a nova imagem
vendor_boot
.
- Substitui todo o ramdisk do fornecedor pela imagem especificada, de modo que ela
se torne o único fragmento do ramdisk do fornecedor na
imagem
- Se a inicialização do fornecedor for o cabeçalho versão
3,
ele fará o seguinte:
fastboot flash vendor_boot:foo vendor-ramdisk.img
Busca
vendor_boot image
, como sefastboot fetch
tivesse sido chamado.- 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 especificada.
- Recalcula cada tamanho e deslocamento na tabela do ramdisk do fornecedor.
- Atualiza a nova imagem
vendor_boot
.
- Encontra o fragmento do ramdisk do fornecedor com o nome
mkbootimg
O nome default
é reservado para nomear os fragmentos do ramdisk do fornecedor no
Android 12 e versões mais recentes. Embora a semântica flash vendor_boot:default
do fastboot permaneça a mesma, não nomeie os fragmentos do ramdisk como
default
.
Mudanças no SELinux
Uma mudança foi feita em
fastbootd.te
para oferecer suporte à atualização de ramdisks do fornecedor.