Sistema de archivos incrementales

El módulo de kernel del sistema de archivos incremental (IncFS) que se introdujo en Android 11 permite que el SO Android reciba APKs transmitidos a través de Android Debug Bridge (ADB).

Este módulo de kernel independiente crea un nuevo sistema de archivos virtual que se ubica sobre el sistema de archivos de Android existente. Esto complementa los cambios en el framework y el SDK para permitir que los desarrolladores de apps y juegos implementen APK grandes a través de ADB en un dispositivo que ejecute Android 11 o versiones posteriores.

El cambio de kernel habilita un nuevo formato de Esquema de firma de APK v4 y admite cambios en el framework de Android en el Administrador de paquetes de Android, nuevos servicios del sistema y cambios en el ADB.

Implementación

Para implementar IncFS, los OEMs y los fabricantes de SoC deben agregar un nuevo controlador de kernel a sus compilaciones de dispositivos Android.

Solo para Android 11, si el controlador de kernel se compila como un módulo, se carga a pedido. Si no hay ninguna app instalada a través de una instalación incremental de ADB, el dispositivo no carga el controlador del kernel.

De lo contrario, cuando se compila como parte de la imagen del kernel, el controlador siempre se carga. Esta implementación es válida para Android 12 y versiones posteriores, y se puede usar con Android 11. Para obtener información sobre cómo actualizar el controlador de kernel a Android 12, consulta Actualización del controlador de kernel.

El controlador de kernel forma parte de un sistema más grande para habilitar las instalaciones de APK transmitidas. Los OEMs y proveedores no necesitan usar el código exacto de IncFS que se proporciona en las implementaciones de muestra. Sin embargo, para garantizar una experiencia coherente en todos los dispositivos, debes asegurarte de que la implementación de la API tenga un sistema de archivos que tenga la funcionalidad de lectura de archivos y la funcionalidad de lectura y escritura de directorios, como se define en la documentación de la interfaz de espacio de usuario para el sistema de archivos incremental.

Además, las implementaciones deben tener opciones de activación y archivos especiales que coincidan funcionalmente con la implementación de ejemplo de IncFS.

A continuación, se indican los cambios necesarios para la implementación:

  1. Configura la máquina de desarrollo para compilar el kernel.
  2. Orienta el kernel común desde la rama common-android-mainline.
    repo init -u https://android.googlesource.com/kernel/manifest -b common-android-mainline
    repo sync
  3. Verifica que los siguientes cambios necesarios para IncFS estén en la confirmación de la compra de la rama:
  4. Agrega CONFIG_INCREMENTAL_FS=y o, solo para Android 11, CONFIG_INCREMENTAL_FS=m en la parte inferior del archivo defconfig. Para ver un ejemplo, haz clic en uno de los siguientes vínculos:
  5. Cómo compilar el kernel
  6. Incorpora el kernel en la compilación de imágenes de dispositivos Android.
  7. Para tu dispositivo Android de destino, agrega una de las siguientes líneas de propiedades del sistema específicas del proveedor a tu archivo device.mk (opcional en dispositivos lanzados con Android 12 y versiones posteriores):
  8. Cuando uses CONFIG_INCREMENTAL_FS=y, agrega el archivo con una de las siguientes opciones:

    • PRODUCT_PROPERTY_OVERRIDES += \
    • ro.incremental.enable=yes

    Cuando uses CONFIG_INCREMENTAL_FS=m (solo para Android 11), agrega el archivo con una de las siguientes opciones:

    • PRODUCT_PROPERTY_OVERRIDES += \
    • ro.incremental.enable=module:/vendor/lib/modules/incrementalfs.ko
  9. Consulta los archivos device.mk de ejemplo para el emulador de Android y el Pixel 4.
  10. Solo para Android 11: Si usas CONFIG_INCREMENTAL_FS=m, agrega reglas de SE Linux.
  11. Crea y agrega un archivo vold.te a la carpeta /system/sepolicy/vendor de tu dispositivo con el siguiente contenido:

    • vold.te

    Permite que cargue el controlador de sistema de archivos incremental:

    • allow vold self:capability sys_module;
    • allow vold vendor_incremental_module:file r_file_perms;
    • allow vold vendor_incremental_module:system module_load;

    Agrega las siguientes reglas de SE Linux al archivo file.te existente que se encuentra en la carpeta /system/sepolicy/vendor:

    • Archivo file.te: Para ver un ejemplo, consulta este archivo file.te.
    • Controlador de sistema de archivos incremental
    • type vendor_incremental_module, vendor_file_type, file_type;

    Agrega las siguientes reglas de SE Linux al archivo file_contents existente que se encuentra en la carpeta /system/sepolicy/vendor:

    • Archivo file_contents: Para ver un ejemplo, consulta este archivo file_contents.
    • # Incremental file system driver
    • /vendor/lib/modules/incrementalfs\.ko
    • u:object_r:vendor_incremental_module:s0

Actualización del controlador de kernel

Es posible que los dispositivos que se actualicen a Android 12 incluyan una versión anterior del controlador IncFS. En el caso de esos dispositivos, AOSP recomienda que actualices el controlador IncFS a la versión actual (en este caso, la v2) por los siguientes motivos:

  • La versión que se lanzó con Android 11 es la implementación inicial de IncFS, que solo está orientada a la compatibilidad con la instalación de ADB.
  • Android 12 usa el controlador IncFS para transmitir instalaciones de juegos de Play, lo que requiere las nuevas funciones y optimizaciones de IncFS v2 para brindar una mejor experiencia del usuario.
  • La versión 1 admite la transmisión de juegos, pero lo hace con penalizaciones de rendimiento y un mayor uso de la batería, la CPU y la RAM que la versión 2.
  • La versión 2 proporciona una UX mejorada para la transmisión, con animaciones de progreso fluidas, informes precisos del uso del espacio en el disco y prevención de interferencias de transmisión de apps de terceros.

Para actualizar el controlador IncFS en tu kernel, aplica los siguientes parches para el kernel 4.14 o el kernel 4.19:

Para todas las demás versiones de kernel personalizadas, migra uno de los conjuntos de parches. Solo afectan al directorio fs/incfs y se aplican de forma correcta al código v1 existente.

Sigue usando el controlador IncFS de la misma manera que en el Android 11 original, pero ahora actualizado, ya sea como parte integrada de la imagen del kernel o como un módulo independiente. No cambies la configuración de la placa del sistema ni de la propiedad del sistema.

Los dispositivos nuevos que usan una imagen de kernel de GKI obtienen el controlador IncFS más reciente (v2) automáticamente, configurado como parte de la imagen del kernel. Esto no requiere pasos adicionales.

La configuración del módulo cargable dejó de estar disponible en Android 12 y no es compatible con dispositivos nuevos. Solo se permite para las actualizaciones o para la inmovilización de una imagen del proveedor cuando el kernel original ya la había compilado como un módulo.

Implementaciones de referencia

Esta implementación se puede considerar como parte de una imagen de kernel o (solo para Android 11) como un módulo cargable.

Módulo cargable (dispositivo Pixel 4) Android Emulator (como parte de la imagen del kernel)

Validación y pruebas

Valida la implementación con pruebas de unidades de funciones, CTS y GTS.

CTS

Utiliza CtsIncrementalInstallHostTestCases.

GTS

atest GtsIncrementalInstallTestCases:

/gts-tests/tests/packageinstaller/incremental/src/com/google/android/packageinstaller/incremental/gts/IncrementalInstallerTest.java

Prueba IncFS

  1. Configura un entorno de desarrollo.
  2. Completa las tareas de implementación que se describen en la sección de implementación.
  3. Ejecuta las siguientes pruebas manuales:
    mmma system/incremental_delivery/incfs/tests
    atest libincfs-test
    atest IncrementalServiceTest
    atest PackageManagerShellCommandTest
    PackageManagerShellCommandIncrementalTest

Prueba IncFS con el SDK de Android (ADB y apksigner)

  • Configura un entorno de desarrollo.
  • Completa las tareas de implementación que se describen en la sección de implementación.
  • Instala la compilación en un emulador o dispositivo físico de destino.
  • Genera o obtén un APK existente.
  • Crea una clave de firma de depuración.
  • Firma el APK con el formato de firma v4 desde la carpetabuild-tools.
    ./apksigner sign --ks debug.keystore game.apk
  • Instala el APK en el dispositivo desde la carpeta platform-tools.
    ./adb install game.apk
Ejemplo de instalación
Figura 1: Ejemplo de instalación

Cómo encontrar estas pruebas