Incremental File System (IncFS) es un módulo del kernel que permite al sistema operativo Android recibir APK transmitidos a través de Android Debug Bridge (ADB). El módulo de kernel autónomo crea un nuevo sistema de archivos virtual que se asienta sobre el sistema de archivos Android existente y complementa los cambios en el marco y SDK de Android 11 para permitir que los desarrolladores de aplicaciones y juegos implementen APK grandes a través de ADB en un dispositivo con Android 11.
El cambio de kernel habilita un nuevo formato APK Signature Scheme v4 , admite cambios en el marco de Android en Android Package Manager, nuevos servicios del sistema y cambios en Android Debug Bridge.
Implementación
Los fabricantes de OEM y SoC deben agregar un nuevo controlador de kernel a las compilaciones de sus dispositivos Android. Si el controlador del kernel está construido como un módulo, se carga a pedido. Si no se instala ninguna aplicación mediante la instalación incremental de ADB, el dispositivo no carga el controlador del kernel. Al compilar como parte de la imagen del núcleo, el controlador siempre se carga.
El controlador del kernel es parte de un sistema más grande para permitir instalaciones de APK transmitidas. Los socios no necesitan utilizar el código IncFS exacto proporcionado en las implementaciones de muestra. Sin embargo, para garantizar una experiencia consistente en todos los dispositivos, los socios deben asegurarse 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 / escritura de directorios como se define aquí .
Además, las implementaciones de socios deben tener opciones de montaje y archivos especiales que coincidan funcionalmente con la implementación de muestra de IncFS.
A continuación se describen los cambios necesarios para la implementación:
- Configure la máquina de desarrollo para compilar el kernel.
- Apunte al kernel común de la rama
common-android-mainline
.-
$ repo init -u https://android.googlesource.com/kernel/manifest -b common-android-mainline
-
$ repo sync
-
- Valide que los siguientes cambios necesarios para IncFS están en la caja de la sucursal:
- 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
-
CONFIG_INCREMENTAL_FS=y
líneaCONFIG_INCREMENTAL_FS=m
al final del archivodefconfig
. Se pueden encontrar ejemplos en los siguientes enlaces: - Construir kernel
- Incruste el kernel en la compilación de la imagen del dispositivo Android .
- 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
:- En caso de que esté usando
CONFIG_INCREMENTAL_FS=y
-
PRODUCT_PROPERTY_OVERRIDES += \
-
ro.incremental.enable=yes
- En caso de que esté usando
CONFIG_INCREMENTAL_FS=m
-
PRODUCT_PROPERTY_OVERRIDES += \
-
ro.incremental.enable=module:/vendor/lib/modules/incrementalfs.ko
- Hay archivos device.mk de ejemplo para el emulador de Android yPixel 4 .
- En caso de que esté usando
- Solo si usa
CONFIG_INCREMENTAL_FS=m
, agregue reglas de SE Linux .- Cree y agregue un archivo
vold.te
carpeta de su dispositivo/system/sepolicy/vendor
con el siguiente contenido:-
vold.te
- Permitir cargar 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
:- Ejemplo de archivo
file.te
- Controlador del sistema de archivos incremental
-
type vendor_incremental_module, vendor_file_type, file_type;
- Ejemplo de archivo
- Agregue las siguientes reglas de SE Linux al archivo
file_contents
existente que se encuentra en su carpeta/system/sepolicy/vendor
:- Ejemplo de archivo
file_contents
-
# Incremental file system driver
- Ejemplo de archivo
- Cree y agregue un archivo
-
/vendor/lib/modules/incrementalfs\.ko
-
u:object_r:vendor_incremental_module:s0
Implementaciones de referencia
Hay dos formas de abordar esta implementación, ya sea como un módulo cargable o como parte de una imagen del kernel.
- Módulo cargable (dispositivo Pixel 4)
- Agregar precompilaciones de módulos de kernel
- Agregar y habilitar el cambio de propiedad del sistema del módulo del kernel en el dispositivo
- Actualizar las reglas de SE Linux
- Emulador de Android (como parte de la imagen del kernel)
- Habilitar el controlador del kernel IncFS
- Habilitar Incremental en el dispositivo
Validación y prueba
Valide la implementación utilizando Feature Unit Tests, CTS y GTS.
CTS
-
CtsIncrementalInstallHostTestCases
GTS
-
atest GtsIncrementalInstallTestCases
-
/gts-tests/tests/packageinstaller/incremental/src/com/google/android/packageinstaller/incremental/gts/IncrementalInstallerTest.java
-
Prueba de los IncF (sistema de archivos incrementales)
- Configura un entorno de desarrollo.
- Complete las tareas de implementación descritas en la sección de implementación.
- Ejecute las siguientes pruebas manuales:
-
$ mmma system/incremental_delivery/incfs/tests
-
$ atest libincfs-test
-
$ atest IncrementalServiceTest
-
$ atest PackageManagerShellCommandTest PackageManagerShellCommandIncrementalTest
-
Prueba de IncFS con Android SDK (ADB y apksigner)
- Configura 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.
- Genere u obtenga una apk existente.
- Cree una clave de firma de depuración .
- Firme apk con formato de firma v4 desde la carpeta
build-tools
.-
$ ./apksigner sign --ks debug.keystore game.apk
-
- Instale apk en el dispositivo desde la carpeta de
platform-tools
de laplatform-tools
.-
$ ./adb install game.apk
-

¿Dónde se pueden encontrar estas pruebas?
- / android / kernel / common / tools / testing / selftests / filesystems / incfs /
- /android/system/incremental_delivery/incfs/tests/incfs_test.cpp
- /android/frameworks/base/services/incremental/test/IncrementalServiceTest.cpp
- /android/cts/tests/tests/content/src/android/content/pm/cts/PackageManagerShellCommandIncrementalTest.java