O Android 10 oferece suporte a partições dinâmicas , um sistema de particionamento de espaço do usuário que pode criar, redimensionar e destruir partições durante atualizações over-the-air (OTA).
Esta página descreve como redimensionar partições dinâmicas durante uma atualização para dispositivos A/B lançados com suporte a partições dinâmicas, para dispositivos que executam Android 9 e versões anteriores .
Fundo
Há uma super
no dispositivo. Esta partição não tem sufixo de slot. O dispositivo de bloco deve existir junto 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
Então o dispositivo de bloco para super
deve existir em /dev/block/bootdevice/by-name/super
, mas a super
partição não precisa ser listada no arquivo fstab
.
Na super
, existem dois slots de metadados , numerados 0 e 1, correspondentes aos slots A/B para partições. Nesta página, os slots de metadados são chamados de 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 da atualização, os Metadados S contêm as informações das partições dinâmicas que estão sendo usadas (normalmente, system_s
, vendor_s
, product_s
e assim por diante). O sistema lê as extensões dessas partições durante a atualização, portanto elas não podem ser excluídas.
As partições pertencem a grupos de atualização . Consulte Implementando partições dinâmicas para obter detalhes.
Um exemplo de metadados em um dispositivo é o seguinte.
- Metadados 0
- Grupo
foo_a
-
system_a
de partição_a - Partição
product_services_a
- Outras partições atualizadas por Foo
-
- Grupo bar_a
-
vendor_a
de partição_a -
product_a
de partição_a - Outras partições atualizadas pelo Bar
-
- Grupo
foo_b
(restos da atualização anterior) - Grupo
bar_b
(restos da atualização anterior)
- Grupo
- Metadados 1
- Grupo
foo_a
(restos da atualização anterior) - Grupo
bar_a
(restos da atualização anterior) - Grupo
foo_b
-
system_b
de partição_b - Partição
product_services_b
- Outras partições atualizadas por Foo
-
-
bar_b
de grupo_b-
vendor_b
de partição_b -
product_b
de partição_b - Outras partições atualizadas pelo Bar
-
- Grupo
Você pode usar a ferramenta lpdump
(código fonte em system/extras/partition_tools
) para despejar os metadados em seu dispositivo. Por exemplo:
lpdump --slot 0 /dev/block/bootdevice/by-name/super
lpdump --slot 1 /dev/block/bootdevice/by-name/super
Fluxo de atualização
- Inicialize os metadados
super
.- Carregue as extensões para as partições dinâmicas de origem dos Metadados S. Sejam M os metadados carregados.
- Remova 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 de destino e partições 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
. - Escreva M nos metadados T.
- Mapeie as partições adicionadas no mapeador de dispositivos 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 desmonte as partições.
- Remova o mapeamento das partições de destino.
Antes e depois da atualização, as seguintes propriedades do sistema deverão ter os respectivos valores:
ro.boot.dynamic_partitions=true ro.boot.dynamic_partitions_retrofit=true
Adicione grupos e partições ao manifesto de atualização
Ao executar uma atualização OTA em um dispositivo A/B com partições dinâmicas ou em um dispositivo A/B que está adicionando suporte para partições dinâmicas, você precisa adicionar grupos e partições ao manifesto de atualização. O snippet abaixo mostra informações adicionais sobre o manifesto de atualização para dar suporte a partições dinâmicas. Consulte update_metadata.proto para documentação detalhada sobre 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; }