El módulo del kernel del sistema de archivos incremental (IncFS) introducido en Android 11 permite que el sistema operativo Android reciba APK transmitidos a través del puente de depuración de Android (ADB).
Este módulo de kernel autónomo crea un nuevo sistema de archivos virtual que se ubica encima del sistema de archivos de Android existente. Esto complementa los cambios en el marco y el SDK para permitir a los desarrolladores de aplicaciones y juegos implementar APK de gran tamaño a través del ADB en un dispositivo que ejecuta Android 11 o superior.
El cambio de kernel habilita un nuevo formato APK Signature Scheme v4 y admite cambios en el marco de Android en el Administrador de paquetes de Android, nuevos servicios del sistema y cambios en el ADB.
Implementación
Para implementar IncFS, los fabricantes de OEM y SoC deben agregar un nuevo controlador de kernel a las versiones de sus dispositivos Android.
Solo para Android 11 , si el controlador del kernel está creado como un módulo, se carga según demanda. 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 está cargado. Esta implementación es válida para Android 12 y superiores, y se puede utilizar 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 de APK transmitidas. Los OEM y los proveedores no necesitan utilizar el código IncFS exacto proporcionado en las implementaciones de muestra. 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 como se define en la documentación de la interfaz del espacio de usuario para FS incremental .
Además, las implementaciones deben tener opciones de montaje 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:
- Configure la máquina de desarrollo para construir el kernel.
- Apunte 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
- Valide que los siguientes cambios necesarios para IncFS estén en el proceso de pago 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
- Agregue
CONFIG_INCREMENTAL_FS=y
o solo para Android 11 ,CONFIG_INCREMENTAL_FS=m
en la parte inferior del archivodefconfig
. Para ver un ejemplo, haga clic en uno de los enlaces siguientes: - construir el núcleo
- 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 propiedades del sistema específicas del proveedor a su 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 Pixel 4 . - Solo para Android 11 : si está usando
CONFIG_INCREMENTAL_FS=m
, agregue SE Linux Rules . -
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, consulte este archivofile.te
). - Controlador de sistema de archivos incremental
-
type vendor_incremental_module, vendor_file_type, file_type;
- Archivo
file_contents
: para ver un ejemplo, consulte este archivofile_contents
. -
# Incremental file system driver
-
/vendor/lib/modules/incrementalfs\.ko
-
u:object_r:vendor_incremental_module:s0
Cuando estés usando CONFIG_INCREMENTAL_FS=y
, agrega al archivo uno de estos:
Cuando estés usando CONFIG_INCREMENTAL_FS=m
( solo para Android 11 ), agrega al archivo uno de estos:
Cree y agregue un archivo vold.te
a la carpeta /system/sepolicy/vendor
de su dispositivo con el siguiente contenido:
Permítale cargar el controlador del sistema de archivos incremental:
Agregue las siguientes reglas de SE Linux al archivo file.te
existente que se encuentra en su carpeta /system/sepolicy/vendor
:
Agregue las siguientes reglas de SE Linux al archivo file_contents
existente que se encuentra en su carpeta /system/sepolicy/vendor
:
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 actualizar 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, dirigida únicamente al soporte de instalación de ADB.
- Android 12 utiliza el controlador IncFS para instalaciones de transmisión de juegos Play, lo que requiere las nuevas funciones y optimizaciones de IncFS v2 para una mejor experiencia de usuario.
- La 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 la V2.
- V2 proporciona una experiencia de usuario mejorada para la transmisión, con animaciones de progreso fluidas, informes precisos del 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:
- Parche del núcleo 4.14
- Parche del núcleo 4.19
Para todas las demás versiones de kernel personalizadas, transfiera uno de los conjuntos de parches. Solo afectan al directorio fs/incfs
y se aplican limpiamente al código v1 existente.
- Corrección del kernel 4.14 al controlador v1
- Corrección del kernel 4.19 en el controlador v1
- Corrección del kernel 5.4 al controlador v1
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 propiedades del sistema.
Los nuevos dispositivos que utilizan una imagen del kernel GKI obtienen automáticamente el controlador IncFS más reciente (v2), configurado como parte de la imagen del 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. Sólo está permitido para las actualizaciones o para la congelación de una imagen del proveedor cuando el kernel original ya lo tenía integrado como 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)- Agregar módulos precompilados del kernel
- Agregar y habilitar el cambio de propiedad del sistema del módulo Kernel en el dispositivo
- Actualizar las reglas de SE Linux
Validación y pruebas
Validar la implementación utilizando Feature Unit Tests, CTS y GTS.
cts
UtiliceCtsIncrementalInstallHostTestCases
.GTS
atest GtsIncrementalInstallTestCases
:
/gts-tests/tests/packageinstaller/incremental/src/com/google/android/packageinstaller/incremental/gts/IncrementalInstallerTest.java
Pruebe el IncFS
- Configurar 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
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
Localiza 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