El módulo del 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 del kernel autónomo crea un nuevo sistema de archivos virtual que se encuentra 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 APKs grandes a través de ADB en un dispositivo que ejecute Android 11 o versiones posteriores.
El cambio en el 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 ADB.
Implementación
Para implementar IncFS, los OEM y los fabricantes de SoC deben agregar un nuevo controlador del kernel a sus compilaciones de dispositivos Android.
Solo para Android 11, si el controlador del kernel se compila como un módulo, se carga a pedido. Si no hay apps instaladas 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 del kernel a Android 12, consulta Actualización del controlador del kernel.
El controlador del kernel forma parte de un sistema más grande para habilitar las instalaciones de APK transmitidas. Los OEM y los 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 con funcionalidad de lectura de archivos y 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 muestra de IncFS.
A continuación, se enumeran los cambios necesarios para la implementación:
- Configura la máquina de desarrollo para compilar el kernel.
- Establece como objetivo el kernel común de la rama
common-android-mainline
.repo init -u https://android.googlesource.com/kernel/manifest -b common-android-mainline
repo sync
- Valida que los siguientes cambios necesarios para IncFS estén en la confirmación de la rama:
- https://android-review.googlesource.com/c/kernel/common/+/1222869/
- https://android-review.googlesource.com/c/kernel/common/+/1222870
- https://android-review.googlesource.com/c/kernel/common/+/1222871
- https://android-review.googlesource.com/q/%2522ANDROID:+Incremental+fs:%2522+branch:android-mainline+status:merg
- Agrega
CONFIG_INCREMENTAL_FS=y
o,CONFIG_INCREMENTAL_FS=m
solo para Android 11, al final del archivodefconfig
. Para ver un ejemplo, haz clic en uno de los siguientes vínculos: - Compila el kernel
- Incorpora el kernel en la compilación de imágenes del dispositivo Android.
- Para tu dispositivo Android de destino, agrega una de las siguientes líneas de propiedad del sistema específicas del proveedor a tu archivo
device.mk
(opcional en dispositivos lanzados con Android 12 y versiones posteriores): PRODUCT_PROPERTY_OVERRIDES += \
ro.incremental.enable=yes
PRODUCT_PROPERTY_OVERRIDES += \
ro.incremental.enable=module:/vendor/lib/modules/incrementalfs.ko
- Consulta los archivos
device.mk
de ejemplo para el emulador de Android y el Pixel 4. - Solo para Android 11: Si usas
CONFIG_INCREMENTAL_FS=m
, agrega reglas de SE Linux. vold.te
allow vold self:capability sys_module;
allow vold vendor_incremental_module:file r_file_perms;
allow vold vendor_incremental_module:system module_load;
-
Archivo
file.te
(para ver un ejemplo, consulta este archivofile.te
). - Controlador del sistema de archivos incremental
type vendor_incremental_module, vendor_file_type, file_type;
-
Archivo
file_contents
: Para ver un ejemplo, consulta este archivofile_contents
. # Incremental file system driver
/vendor/lib/modules/incrementalfs\.ko
u:object_r:vendor_incremental_module:s0
Cuando uses CONFIG_INCREMENTAL_FS=y
, agrega el archivo con una de las siguientes opciones:
Cuando uses CONFIG_INCREMENTAL_FS=m
(solo para Android 11), agrega el archivo con uno de los siguientes elementos:
Crea y agrega un archivo vold.te
a la carpeta /system/sepolicy/vendor
de tu dispositivo con el siguiente contenido:
Permite que se cargue el controlador del sistema de archivos incremental:
Agrega las siguientes reglas de SE Linux al archivo file.te
existente que se encuentra en tu carpeta /system/sepolicy/vendor
:
Agrega las siguientes reglas de SE Linux al archivo file_contents
existente que se encuentra en tu carpeta /system/sepolicy/vendor
:
Actualización del controlador del kernel
Es posible que los dispositivos que se actualicen a Android 12 incluyan una versión anterior del controlador de IncFS. En el caso de esos dispositivos, AOSP recomienda que actualices el controlador de IncFS a la versión actual (en este caso, la versión 2) por los siguientes motivos:
- La versión lanzada con Android 11 es la implementación inicial de IncFS, que solo se orienta a la compatibilidad con la instalación de ADB.
- Android 12 usa el controlador IncFS para la instalación de transmisión de juegos de Play, lo que requiere las nuevas funciones y optimizaciones de IncFS v2 para 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 batería, CPU y 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 disco y prevención de interferencias en la transmisión de apps de terceros.
Para actualizar el controlador de IncFS en tu kernel, aplica los siguientes parches para el kernel 4.14 o el kernel 4.19:
- Parche de kernel 4.14
- Parche de kernel 4.19
Para todas las demás versiones del kernel personalizado, transfiere uno de los conjuntos de parches. Solo afectan al directorio fs/incfs
y se aplican correctamente al código existente de la versión 1.
- Corrección del kernel 4.14 para el controlador v1
- Se corrigió el kernel 4.19 para el controlador v1
- Corrección del kernel 5.4 para el controlador v1
Sigue usando el controlador de IncFS de la misma manera que para el Android 11 original, ya sea como parte integrada de la imagen del kernel o como un módulo independiente. No cambies la configuración de la placa base ni de las propiedades del sistema.
Los dispositivos nuevos que usan una imagen del kernel de GKI obtienen automáticamente el controlador IncFS más reciente (v2), configurado como parte de la imagen del kernel. No se requieren pasos adicionales.
La configuración de módulos cargables dejó de estar disponible en Android 12 y no se admite en dispositivos nuevos. Solo se permite para las actualizaciones o para la inmovilización de imágenes del proveedor cuando el kernel original ya lo tenía compilado 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)- Agrega módulos de kernel prediseñados
- Agrega y habilita el cambio de propiedad del sistema del módulo del kernel en el dispositivo
- Actualizar reglas de SE Linux
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 el IncFS
- Configura un entorno de desarrollo.
- Completa las tareas de implementación que se describen en la sección de implementación.
- 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 dispositivo físico o emulador de destino.
- Genera un APK existente u obtén uno.
- Crea una clave de firma de depuración.
- Firma el APK con el formato de firma v4 de la carpeta
build-tools
../apksigner sign --ks debug.keystore game.apk
- Instala el APK en el dispositivo desde la carpeta
platform-tools
../adb install game.apk

Cómo encontrar estas pruebas
- /android/kernel/common/tools/testing/selftests/filesystems/incfs/
- /android/system/incremental_delivery/incfs/tests/incfs_test.cpp
- /android/cts/tests/tests/content/src/android/content/pm/cts/PackageManagerShellCommandIncrementalTest.java