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. Isso a realocação permite mover o código com flash para um ambiente local comum com apenas as partes do fastboot específicas do fornecedor implementadas por um camada de abstração de hardware (HAL). Além disso, o Android 12 e versões mais recentes oferecem suporte à atualização em ramdisks com um comando de 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 um ou binário. Isso oferece vantagens como o uso de menos espaço, com menos partições e o fastboot e a recuperação compartilham as kernel e bibliotecas.
Para oferecer suporte a fastbootd
, o carregador de inicialização precisa implementar um novo bloco de controle de inicialização.
(BCB) de boot-fastboot
. Para entrar no modo fastbootd
, o carregador de inicialização
escreve boot-fastboot
no campo de comando da mensagem do BCB e deixa a
Campo recovery
do BCB inalterado (para permitir a reinicialização de qualquer recuperação interrompida)
tarefas). 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 muda para o modo fastbootd
.
Comandos adb
Esta seção descreve o comando adb
para integrar o fastbootd
. A
tem resultados diferentes, dependendo se ele é 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 atualização e gerenciamento de partições lógicas. Algumas
têm resultados diferentes dependendo se eles foram executados
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, 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 inclui o 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 deve já existem 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 não for possível fazer uma mesclagem
(por exemplo, o formato no dispositivo é uma versão sem suporte), este
falha. Um parâmetro wipe opcional substitui o
em vez de mesclar. |
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 deve estar no 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 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 para cada bloco,
e agrupa os dados 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
oferecem suporte à atualização em ramdisks do fornecedor. Busca a imagem Para mais detalhes, consulte
|
Fastboot e carregador de inicialização
O carregador de inicialização atualiza bootloader
, radio
e boot/recovery
.
Depois disso, o dispositivo inicializa 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 em comandos de recuperação/inicialização
imagem (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 se essas operações forem tentadas. Para dispositivos retrô
dispositivos de partição dinâmica, a ferramenta fastboot (e o carregador de inicialização) oferecem suporte a uma
para realizar uma atualização direta em uma partição dinâmica enquanto estiver no modo de carregador de inicialização. Para
exemplo, se system
for uma partição dinâmica no dispositivo atualizado,
o uso do comando fastboot --force flash system
ativa o carregador de inicialização
(em vez de fastbootd
) para atualizar a partição.
Carregamento no modo desativado
Se um dispositivo oferecer suporte a carregamento fora do modo ou inicializar automaticamente em um
quando a energia é aplicada, uma implementação do
O comando fastboot oem off-mode-charge 0
precisa
ignorar esses modos especiais, de modo que o dispositivo seja inicializado como se o usuário tivesse pressionado
botão liga/desliga.
HAL de OEM de fastboot
Para substituir completamente o fastboot, o fastboot precisa lidar fastboot. 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 documentadas. Para lidar com esses comandos, a HAL de fastboot especifica os parâmetros Comandos do OEM. 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
.Verifique se a HAL de fastboot, a HAL de controle de inicialização e a HAL de integridade estão incluídas como parte da imagem de recuperação.
Adicione todas as permissões SEPolicy específicas do dispositivo exigidas por
fastbootd
. Para exemplo,fastbootd
requer acesso de gravação a uma partição específica do dispositivo para atualizar a partição. Além disso, a implementação de HAL com fastboot exigem 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 a
atualizar os ramdisks com um comando fastboot adicionado
vendor_boot
imagem de um dispositivo. O comando solicita o fastboot no lado do host
para ler o cabeçalho de inicialização do fornecedor, restaurar a imagem e atualizar a nova imagem.
Para extrair a imagem vendor_boot
completa, o comando fetch:vendor_boot
foi adicionado
no protocolo fastboot e na implementação fastbootd do protocolo
no Android 12. O fastbootd faz
implementá-la, mas o próprio carregador de inicialização pode não fazer isso. OEMs podem adicionar
o comando fetch:vendor_boot
à implementação do carregador de inicialização
protocolo. No entanto, se o comando não for reconhecido no modo de carregador de inicialização,
a atualização em ramdisks de fornecedores individuais no modo de carregador de inicialização não é compatível com o fornecedor
é a melhor opção.
Mudanças no carregador de inicialização
Os comandos getvar:max-fetch-size
e fetch:name
são implementados em
fastbootd
Para atualizar os ramdisks do fornecedor no carregador de inicialização, você precisa
implementar esses dois comandos.
Mudanças no fastboot
getvar:max-fetch-size
é semelhante a max-download-size
. Ela especifica
tamanho máximo que o dispositivo pode enviar em uma resposta DATA. O motorista 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 todos
dos itens a seguir forem verdadeiros, 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
size
está entre 0 <size
<=max-fetch-size
Após a verificação, fetch:name[:offset[:size]]
retorna o tamanho da partição.
e deslocamento.
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, o
são usados os valores padrão, sendo 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 é vinculada à definição completa na tabela de Fastboot comandos.
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 da partição inteira. - Chamada de
fastboot fetch vendor_boot[_a]:offset:size
para cada bloco. O tamanho do bloco é maior que o tamanho devendor_boot
, então 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. Ela busca Imagem
vendor_boot
, como sefastboot fetch
fosse chamado.- Se a inicialização do fornecedor for a version de cabeçalho
3,
ele faz 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 version [versão]
4,
ele faz o seguinte:
- Substitui todo o ramdisk do fornecedor pela imagem especificada, de modo que o
a imagem especificada se torna 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 o
a imagem especificada se torna o único fragmento do ramdisk do fornecedor na
Imagem
- Se a inicialização do fornecedor for a version de cabeçalho
3,
ele faz 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 forem encontrados, 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
está reservado para nomear os fragmentos do ramdisk do fornecedor em
Android 12 e versões mais recentes. Durante o fastboot flash vendor_boot:default
a mesma semântica, não dê nomes aos fragmentos do ramdisk como
default
.
Mudanças no SELinux
Uma alteração foi feita em
fastbootd.te
para oferecer suporte à atualização
dos ramdisks do fornecedor.