Dimensionar a superpartição

O dimensionamento correto da partição super é importante para a capacidade de atualização do dispositivo. O tamanho impacta diretamente quantas atualizações um dispositivo pode receber e quantos usuários podem receber essas atualizações.

Há algumas variáveis importantes a serem consideradas. O primeiro é o tamanho de fábrica, que é o tamanho de todas as partições dinâmicas quando o dispositivo é inicializado pela primeira vez. A segunda é a taxa de crescimento, que é a porcentagem do aumento do tamanho do SO durante todo o ciclo de atualização do dispositivo.

Além disso, os dispositivos A/B virtuais podem usar espaço em /data durante uma atualização, e isso precisa ser considerado ao dimensionar super. Se muito espaço for necessário em /data, alguns usuários não poderão (ou não quiserem) fazer a atualização. No entanto, se for sabido que a maioria dos usuários tem uma porcentagem de espaço livre, os dispositivos poderão subtrair esse espaço de super. Ou os dispositivos podem garantir que /data nunca seja necessário, simplesmente aumentando o tamanho de super.

Confira abaixo alguns modelos para ajudar a orientar o dimensionamento da partição super com base nessas variáveis.

Confiar em /data

O teste A/B virtual incentiva a redução de super para permitir o aumento do tamanho de /data. Parte desse espaço é necessária durante uma atualização. Para entender o impacto na capacidade de atualização, é essencial saber qual porcentagem de dispositivos provavelmente terá essa quantidade de espaço livre ao longo do tempo. A descoberta desse número depende muito do hardware do dispositivo e do comportamento dos usuários. Nos exemplos abaixo, esse número é chamado de AllowedUserdataUse.

Sem compactação

Sem compactação, uma OTA completa precisa de um snapshot com aproximadamente o mesmo tamanho do SO. Portanto, isso precisa ser considerado ao dimensionar super:

  FinalDessertSize = FactorySize + (FactorySize * ExpectedGrowth)
  Super = Max(FinalDessertUpdate, FinalDessertSize * 2 - AllowedUserdataUse)

Por exemplo, considere um dispositivo virtual A/B com um tamanho de fábrica de 4 GB, crescimento esperado de 50% e conhecimento de que quase todos os usuários têm 1 GB de espaço livre (ou estão dispostos a liberar até 1 GB de espaço para uma atualização). Para esse dispositivo, o tamanho de super pode ser definido assim:

  FinalDessertSize = 4GB + (4GB * 0.5) = 6GB
  Super = Max(6GB, 6GB * 2 - 1GB) = Max(6GB, 11GB)

Portanto, esse dispositivo precisa ter uma partição super de 11 GB.

Com compactação

Com a compactação, uma OTA completa precisa de um snapshot de aproximadamente 70% do tamanho do SO:

  FinalDessertSize = FactorySize + (FactorySize * ExpectedGrowth)
  FinalOTASnapshotSize = FinalDessertSize * 0.7
  Super = Max(FinalDessertUpdate, FinalDessertSize + FinalOTASnapshotSize - AllowedUserdataUse)

Por exemplo, considere um dispositivo configurado com a compactação Virtual A/B, com um tamanho de fábrica de 4 GB, crescimento esperado de 50% e conhecimento de que quase todos os usuários têm 1 GB livre (ou estão dispostos a liberar até 1 GB de espaço para uma atualização). Para esse dispositivo, o tamanho de super pode ser definido assim:

  FinalDessertSize = 4GB + (4GB * 0.5) = 6GB
  FinalOTASnapshotSize = 6GB * 0.7 = 4.2GB
  Super = Max(6GB, 6GB + 4.2GB - 1GB) = Max(6GB, 9.2GB) = 9.2GB

Portanto, esse dispositivo precisa ter uma partição super de 9,2 GB.

Sem depender de /data

Se você quiser que as OTAs nunca precisem de espaço de snapshot em /data, o dimensionamento de super será simples.

Sem compactação

Para um dispositivo A/B virtual sem compactação ou um dispositivo A/B normal:

  FinalDessertSize = FactorySize + (FactorySize * ExpectedGrowth)
  Super = FinalDessertSize * 2

Por exemplo, considere um dispositivo virtual A/B com um tamanho de fábrica de 4 GB e um crescimento esperado de 50%. Para garantir que esse dispositivo nunca use /data para instantâneos OTA, o cálculo será semelhante a este:

  FinalDessertSize = 4GB + (4GB * 0.5) = 6GB
  Super = FinalDessertSize * 2 = 12GB

Portanto, esse dispositivo precisa ter uma partição super de 12 GB.

Com compactação

Para um dispositivo A/B virtual com compactação:

  FinalDessertSize = FactorySize + (FactorySize * ExpectedGrowth)
  FinalOTASnapshotSize = FinalDessertSize * 0.7
  Super = FinalDessertSize + FinalOTASnapshotSize

Por exemplo, considere um dispositivo de compressão A/B virtual com um tamanho de fábrica de 4 GB e um crescimento esperado de 50%. Para garantir que esse dispositivo nunca use /data para snapshots OTA, o cálculo seria semelhante a este:

  FinalDessertSize = 4GB + (4GB * 0.5) = 6GB
  FinalOTASnapshotSize = 6GB * 0.7 = 4.2GB
  Super = 6GB + 4.2GB = 10.2GB

Portanto, esse dispositivo precisa ter uma partição super de 10,2 GB.

Avisos

Pode ser tentador observar que, se o tamanho da fábrica for de 4 GB e a atualização final for de 5 GB, o super precisará ser de 9 GB, em vez de 10 GB. No entanto, se a primeira e a última atualização tiverem 5 GB, o espaço em super poderá ser insuficiente para a atualização final. As fórmulas acima presumem que o crescimento da partição pode acontecer a qualquer momento. O espaço necessário para aplicar a atualização final pode ser o mesmo necessário para aplicar a primeira atualização.

As taxas de compressão são uma estimativa. Uma imagem do SO pode ser compactada melhor ou pior dependendo do conteúdo. Se você estiver usando um sistema de arquivos compactado, como o EROFS, a compactação adicional do Virtual A/B terá retornos decrescentes. Nesse caso, é melhor usar uma das fórmulas descomprimidas como uma diretriz.

Calcular o tamanho

Para encontrar o valor de FinalDessertSize nos exemplos acima, adicione os tamanhos de todas as partições dinâmicas. As imagens de partição dinâmica do AOSP são:

  • system.img
  • vendor.img
  • product.img
  • system_ext.img
  • vendor_dlkm.img
  • system_dlkm.img

Calcule o tamanho com base em imagens não analisadas. Ao criar o Android 12 ou versões anteriores, as imagens são espalhadas por padrão e podem ser descompiladas com simg2img.

Também é possível calcular os tamanhos de partição de um pacote OTA. Isso também estima o tamanho do snapshot A/B virtual para cada partição:

  python3 system/update_engine/scripts/payload_info.py path/to/ota-package.zip

Ou use a ferramenta de análise de OTA. Essa ferramenta não faz upload de arquivos e analisa pacotes OTA localmente.

Para encontrar o valor de ExpectedGrowth, use um dispositivo lançado anteriormente. Use a imagem super mais antiga e mais recente para calcular o crescimento.