OTA para dispositivos A/B com partições dinâmicas

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
    • Barra de grupo_a
      • Partição vendor_a
      • Partição product_a
      • Outras partições atualizadas por Barra
    • Grupo foo_b (restante da atualização anterior)
    • Grupo bar_b (restante da atualização anterior)
  • 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
    • Grupo bar_b
      • Partição vendor_b
      • Partição product_b
      • Outras partições atualizadas por barra

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

  1. Inicialize os metadados da partição super.
    1. Carregar as extensões das partições dinâmicas de origem dos metadados S. Vamos chamar M de metadados carregados.
    2. 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.
    3. 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 em new_partition_info.
    4. Gravar M em Metadata T.
    5. Mapear as partições adicionadas no mapeador do dispositivo como graváveis.
  2. Aplique a atualização nos dispositivos de bloco.
    1. 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.
    2. Aplique uma atualização completa ou delta a todos os dispositivos de bloco no slot de destino.
    3. Monte as partições para executar o script pós-instalação e, em seguida, desmonte as partições.
  3. 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;
}