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

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)
  • 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

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

  1. Inicialize os metadados super .
    1. Carregue as extensões para as partições dinâmicas de origem dos Metadados S. Sejam M os metadados carregados.
    2. 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 .
    3. 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 em new_partition_info .
    4. Escreva M nos metadados T.
    5. Mapeie as partições adicionadas no mapeador de dispositivos 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 desmonte as partições.
  3. 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;
}