O Android 10 oferece suporte a partições dinâmicas, um sistema de particionamento no espaço do usuário que pode criar, redimensionar e destruir partições durante atualizações OTA.
Esta página descreve como redimensionar partições dinâmicas durante uma atualização para dispositivos A/B que lançado com suporte a partições dinâmicas, para dispositivos que executam Android 9 e menores.
Contexto
Há uma partição super
no dispositivo. Esta
partição não tem um slot de sufixo. O dispositivo de bloco precisa existir com
a entrada blk_device
para /misc
em
fstab
. Por exemplo, se o arquivo fstab
listar:
/dev/block/bootdevice/by-name/misc /misc # Other fields
O dispositivo de bloco para super
precisa existir em
/dev/block/bootdevice/by-name/super
, mas a
partição super
não precisa ser listada no
arquivo fstab
.
Na partição super
, há dois
slots de metadados, numerados 0 e 1, correspondentes aos
slots A/B das partições. Nesta página, os slots de metadados são
chamada Metadados S (origem) e metadados T (destino). Da mesma forma,
as partições são chamadas de system_s
,
vendor_t
e assim por diante.
Antes do upgrade, o S de "metadados" contém as informações das
partições dinâmicas em uso (normalmente, system_s
,
vendor_s
, product_s
e assim por diante). O sistema
lê as extensões dessas partições durante a atualização.
não podem ser excluídas.
As partições pertencem a grupos de atualização. Consulte Implementação Partições dinâmicas para mais detalhes.
Confira a seguir um exemplo de metadados em um dispositivo.
- Metadados 0
- Grupo
foo_a
- Partição
system_a
- Partição
product_services_a
- Outras partições atualizadas por Foo
- Partição
- Barra de grupo_a
- Partição
vendor_a
- Partição
product_a
- Outras partições atualizadas por Barra
- Partição
- Grupo
foo_b
(restante da atualização anterior) - Grupo
bar_b
(restante da atualização anterior)
- Grupo
- Metadados 1
- Grupo
foo_a
(restante do upgrade anterior) - Grupo
bar_a
(restante da atualização anterior) - Grupo
foo_b
- Partição
system_b
- Partição
product_services_b
- Outras partições atualizadas pelo Foo
- Partição
- Grupo
bar_b
- Partição
vendor_b
- Partição
product_b
- Outras partições atualizadas por barra
- Partição
- Grupo
Você pode usar a ferramenta lpdump
(o código-fonte em
system/extras/partition_tools
) para despejar os metadados
seu dispositivo. Exemplo:
lpdump --slot 0 /dev/block/bootdevice/by-name/super
lpdump --slot 1 /dev/block/bootdevice/by-name/super
Atualizar fluxo
- Inicialize os metadados da partição
super
.- Carregar as extensões das partições dinâmicas de origem dos metadados S. Vamos chamar M de metadados carregados.
-
Remova os grupos e partições de destino (por exemplo,
foo_t
,bar_t
) de M para que M contenha apenas partições e grupos com o sufixo_s
. -
Adicione grupos e partições de destino de acordo com o
campo
dynamic_partition_metadata
no manifesto de atualização.
O tamanho de cada partição pode ser encontrado emnew_partition_info
. - Gravar M em Metadata T.
- Mapear as partições adicionadas no mapeador do dispositivo como graváveis.
- Aplique a atualização nos dispositivos de bloco.
- Se necessário, mapeie as partições de origem no mapeador de dispositivos como somente leitura. Isso é necessário para o sideload porque as partições de origem não são mapeadas antes da atualização.
- Aplique uma atualização completa ou delta a todos os dispositivos de bloco no slot de destino.
- Monte as partições para executar o script pós-instalação e, em seguida, desmonte as partições.
- Desmapear as partições de destino.
Antes e depois da atualização, as propriedades do sistema a seguir devem ter os respectivos valores:
ro.boot.dynamic_partitions=true ro.boot.dynamic_partitions_retrofit=true
Adicionar grupos e partições ao manifesto de atualização
Ao fazer uma atualização OTA em um dispositivo A/B com partições dinâmicas, faça o seguinte: ou um dispositivo A/B que está adicionando suporte para partições dinâmicas, precisamos adicionar grupos e partições ao manifesto de atualização. O snippet mostra mais informações sobre o manifesto de atualização para dar suporte partições dinâmicas. Consulte update_metadata.proto (link em inglês) para conferir a documentação detalhada de cada campo.
message DeltaArchiveManifest { optional DynamicPartitionMetadata dynamic_partition_metadata; } message DynamicPartitionMetadata { repeated DynamicPartitionGroup groups; } message DynamicPartitionGroup { required string name; optional uint64 size; // maximum size of group repeated string partition_names; }