Sistema de archivos incrementales

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

Este módulo de kernel autónomo crea un nuevo sistema de archivos virtual que se ubica sobre el sistema de archivos existente de Android. Esto complementa los cambios en el marco y SDK para permitir que los desarrolladores de aplicaciones y juegos implementen APK grandes a través de ADB en un dispositivo que se ejecuta en Android 11 o superior.

El cambio del kernel habilita un nuevo formato APK Signature Scheme v4 y admite cambios en el marco de trabajo de Android en el Administrador de paquetes de Android, nuevos servicios del sistema y cambios en ADB.

Implementación

Para implementar IncFS, los OEM 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 del kernel se crea como un módulo, se carga a pedido. Si no hay ninguna aplicación 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 superior, y se puede usar con Android 11 . Para obtener información sobre cómo actualizar el controlador del kernel a Android 12, consulte Actualización del controlador del kernel .

El controlador del kernel es parte de un sistema más grande para permitir instalaciones APK transmitidas. Los fabricantes de equipos originales y los proveedores no necesitan usar el código IncFS exacto proporcionado en las implementaciones de ejemplo. Sin embargo, para garantizar una experiencia coherente en todos los dispositivos, debe asegurarse de que la implementación de la API tenga un sistema de archivos que tenga funcionalidad de lectura de archivos y funcionalidad de lectura y escritura de directorios, tal como se define en la interfaz de espacio de usuario para la documentación de FS incremental .

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

A continuación se enumeran los cambios necesarios para su implementación:

  1. Configure la máquina de desarrollo para construir el kernel.
  2. Diríjase al 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. Valide que los siguientes cambios que se necesitan para IncFS estén en el pago de la sucursal:
  4. CONFIG_INCREMENTAL_FS=y o solo para Android 11 , CONFIG_INCREMENTAL_FS=m en la parte inferior del archivo defconfig . Para ver un ejemplo, haga clic en uno de los enlaces a continuación:
  5. Construye el núcleo
  6. Incruste el núcleo en la compilación de la imagen del dispositivo Android .
  7. Para su dispositivo Android de destino, agregue una de las siguientes líneas de propiedad del sistema específicas del proveedor a su archivo device.mk ( opcional en Android 12 y versiones posteriores):
  8. Cuando esté utilizando CONFIG_INCREMENTAL_FS=y , agregue el archivo con uno de estos:

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

    Cuando esté usando CONFIG_INCREMENTAL_FS=m ( solo para Android 11 ), agregue el archivo con uno de estos:

    • PRODUCT_PROPERTY_OVERRIDES += \
    • ro.incremental.enable=module:/vendor/lib/modules/incrementalfs.ko
  9. Consulte los archivos device.mk de ejemplo para el emulador de Android y Pixel 4 .
  10. Solo para Android 11 : si usa CONFIG_INCREMENTAL_FS=m , agregue SE Linux Rules .
  11. Cree y agregue un archivo vold.te a la carpeta /system/sepolicy/vendor de su dispositivo con el siguiente contenido:

    • vold.te

    Permita que cargue el controlador del 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;

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

    • archivo file.te : para ver un ejemplo, consulte este archivo file.te ).
    • Controlador de sistema de archivos incremental
    • type vendor_incremental_module, vendor_file_type, file_type;

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

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

Actualización del controlador del núcleo

Los dispositivos que se actualizan a Android 12 pueden incluir una versión anterior del controlador IncFS. Para esos dispositivos, AOSP recomienda que actualice el controlador IncFS a la versión actual (en este caso v2) por estos motivos:

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

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

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

Continúe usando el controlador IncFS de la misma manera que para el Android 11 original pero ahora actualizado, ya sea como una parte integrada de la imagen del kernel o como un módulo separado. No cambie la placa del sistema ni la configuración de las propiedades del sistema.

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

La configuración del módulo cargable quedó obsoleta en Android 12 y no es compatible con dispositivos nuevos. Solo se permite para las actualizaciones o para congelar la imagen del proveedor cuando el núcleo original ya lo tenía integrado como un módulo.

Implementaciones de referencia

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

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

Validación y prueba

Validar la implementación mediante Feature Unit Tests, CTS y GTS.

CTS

Utilice CtsIncrementalInstallHostTestCases .

GTS

atest GtsIncrementalInstallTestCases :

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

Probar el IncFS

  1. Configurar un entorno de desarrollo.
  2. Complete las tareas de implementación descritas en la sección de implementación.
  3. Ejecute las siguientes pruebas manuales:
    mmma system/incremental_delivery/incfs/tests
    atest libincfs-test
    atest IncrementalServiceTest
    atest PackageManagerShellCommandTest
    PackageManagerShellCommandIncrementalTest

Cómo probar IncFS con Android SDK (ADB y apksigner)

  • Configurar un entorno de desarrollo.
  • Complete las tareas de implementación descritas en la sección de implementación.
  • Actualice la compilación en un dispositivo físico o emulador de destino.
  • Generar u obtener un APK existente.
  • Cree una clave de firma de depuración .
  • Firme el APK con el formato de firma v4 desde la carpeta build-tools .
    ./apksigner sign --ks debug.keystore game.apk
  • Instale el APK en el dispositivo desde la carpeta platform-tools .
    ./adb install game.apk
Ejemplo de instalación
Figura 1 : Ejemplo de instalación

Localiza estas pruebas