Establece el tamaño de la superpartición

Es importante ajustar el tamaño de la partición super de forma correcta para la actualización del dispositivo. El tamaño influye directamente en la cantidad de actualizaciones que puede recibir un dispositivo y en la cantidad de usuarios que pueden recibir esas actualizaciones correctamente.

Hay algunas variables importantes que debes tener en cuenta. El primero es el tamaño de fábrica, que es el tamaño de todas las particiones dinámicas cuando se escribe la imagen del dispositivo por primera vez. El segundo es el índice de crecimiento, que es el porcentaje en el que aumenta el tamaño del SO durante toda la vida útil actualizable del dispositivo.

Además, los dispositivos con Virtual A/B pueden usar espacio en /data durante una actualización, y esto se debe tener en cuenta cuando se dimensiona super. Si se necesita demasiado espacio en /data, algunos usuarios no podrán (o no querrán) realizar la actualización. Sin embargo, si se sabe que la mayoría de los usuarios tienen un cierto porcentaje de espacio libre, los dispositivos pueden restar cómodamente ese espacio de super. O bien, los dispositivos pueden garantizar que /data nunca sea necesario, simplemente haciendo que super sea lo suficientemente grande.

A continuación, se incluyen algunos modelos que te ayudarán a determinar el tamaño de las particiones de super en función de estas variables.

Cómo depender de /data

El A/B virtual fomenta la reducción de super para permitir el aumento del tamaño de /data. Parte de ese espacio se necesita durante una actualización. Para comprender el impacto en la capacidad de actualización, es fundamental saber qué porcentaje de dispositivos es probable que tengan esa cantidad de espacio libre con el tiempo. Determinar este número depende en gran medida del hardware del dispositivo y del comportamiento de los usuarios en ese dispositivo. En los siguientes ejemplos, este número se denomina AllowedUserdataUse.

Sin compresión

Sin compresión, una actualización OTA completa necesita una instantánea aproximadamente del mismo tamaño que el SO, por lo que se debe tener en cuenta al determinar el tamaño de super:

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

Por ejemplo, considera un dispositivo Virtual A/B con un tamaño de fábrica de 4 GB, un crecimiento esperado del 50% y el conocimiento de que casi todos los usuarios tienen 1 GB libre (o están dispuestos a liberar hasta 1 GB de espacio para una actualización). En este dispositivo, super puede tener el siguiente tamaño:

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

Por lo tanto, este dispositivo debería tener una partición super de 11 GB.

Con compresión

Con la compresión, una actualización inalámbrica completa necesita una instantánea de aproximadamente el 70% del tamaño del SO:

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

Por ejemplo, considera un dispositivo configurado con compresión Virtual A/B, con un tamaño de fábrica de 4 GB, un crecimiento esperado del 50% y el conocimiento de que casi todos los usuarios tienen 1 GB libre (o están dispuestos a liberar hasta 1 GB de espacio para una actualización). En el caso de este dispositivo, super puede tener el siguiente tamaño:

  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

Por lo tanto, este dispositivo debería tener una partición super de 9.2 GB.

Sin depender de /data

Si deseas tener OTAs que nunca requieran espacio de instantánea en /data, el dimensionamiento de super es sencillo.

Sin compresión

Para un dispositivo A/B virtual sin compresión o un dispositivo A/B normal, haz lo siguiente:

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

Por ejemplo, considera un dispositivo virtual A/B con un tamaño de fábrica de 4 GB y un crecimiento esperado del 50%. Para garantizar que este dispositivo nunca use /data para las instantáneas inalámbricas, su cálculo se vería de la siguiente manera:

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

Por lo tanto, este dispositivo debería tener una partición super de 12 GB.

Con compresión

Para un dispositivo con A/B virtual y compresión, haz lo siguiente:

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

Por ejemplo, considera un dispositivo de compresión A/B virtual con un tamaño de fábrica de 4 GB y un crecimiento esperado del 50%. Para garantizar que este dispositivo nunca use /data para las instantáneas de OTA, su cálculo se vería de la siguiente manera:

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

Por lo tanto, este dispositivo debería tener una partición super de 10.2 GB.

Advertencias

Podría ser tentador observar que, si el tamaño de fábrica es de 4 GB y la actualización final es de 5 GB, entonces super debe ser de 9 GB, en lugar de 10 GB. Sin embargo, si la primera y la última actualización son de 5 GB, es posible que el espacio en super no sea suficiente para la última actualización. Las fórmulas anteriores suponen que el crecimiento de la partición puede ocurrir en cualquier momento. El espacio necesario para aplicar la actualización final puede ser el mismo que el que se requiere para aplicar la primera actualización.

Ten en cuenta que las relaciones de compresión son una estimación. Una imagen del SO puede comprimirse mejor o peor según su contenido. Si se usa un sistema de archivos comprimido, como EROFS, la compresión adicional de Virtual A/B tiene retornos decrecientes. En este caso, es mejor usar una de las fórmulas sin comprimir como guía.

Cómo calcular el tamaño

Para encontrar el valor de FactorySize en los ejemplos anteriores, suma los tamaños de todas las particiones dinámicas. Las imágenes de particiones dinámicas del AOSP son las siguientes:

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

Asegúrate de calcular el tamaño en función de las imágenes no dispersas. Cuando compilas Android 12 o versiones anteriores, las imágenes se dispersan de forma predeterminada y se pueden dispersar con simg2img.

También es posible calcular los tamaños de partición a partir de un paquete OTA. Si lo haces, también se estimará el tamaño de la instantánea de Virtual A/B para cada partición:

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

También puedes usar la herramienta de análisis de OTA. Esta herramienta no sube ningún archivo y analiza los paquetes OTA de forma local.

Para encontrar el valor de ExpectedGrowth, usa un dispositivo lanzado anteriormente. Usa la imagen de super más antigua y la más reciente para calcular el crecimiento.