Le module de noyau IncFS (Incremental File System) introduit dans Android 11 permet au système d'exploitation Android de recevoir des APK en streaming via Android Debug Bridge (ADB).
Ce module de kernel autonome crée un nouveau système de fichiers virtuel qui se trouve au-dessus du système de fichiers Android existant. Cela complète les modifications apportées au framework et au SDK pour permettre aux développeurs d'applications et de jeux de déployer de grands APK via l'ADB sur un appareil exécutant Android 11 ou version ultérieure.
La modification du kernel active un nouveau format APK Signature Scheme v4 et prend en charge les modifications du framework Android dans le Gestionnaire de paquets Android, les nouveaux services système et les modifications apportées à l'ADB.
Implémentation
Pour implémenter IncFS, les OEM et les fabricants de SoC doivent ajouter un nouveau pilote de kernel à leurs builds d'appareils Android.
Pour Android 11 uniquement, si le pilote du kernel est compilé en tant que module, il est chargé à la demande. Si aucune application n'est installée via une installation incrémentielle ADB, l'appareil ne charge pas le pilote du noyau.
Sinon, lors de la compilation dans le cadre de l'image du noyau, le pilote est toujours chargé. Cette implémentation est valide pour Android 12 et versions ultérieures, et peut être utilisée avec Android 11. Pour en savoir plus sur la mise à niveau du pilote du kernel vers Android 12, consultez la section Mise à niveau du pilote du kernel.
Le pilote du kernel fait partie d'un système plus vaste permettant d'installer des APK en streaming. Les OEM et les fournisseurs n'ont pas besoin d'utiliser le code IncFS exact fourni dans les exemples d'implémentations. Toutefois, pour garantir une expérience cohérente sur tous les appareils, vous devez vous assurer que l'implémentation de l'API dispose d'un système de fichiers doté de fonctionnalités de lecture de fichiers et de lecture-écriture de répertoires, comme défini dans la documentation Interface Userspace pour le système de fichiers incrémentiel.
De plus, les implémentations doivent comporter des options d'installation et des fichiers spéciaux qui correspondent fonctionnellement à l'implémentation exemple d'IncFS.
La liste suivante indique les modifications nécessaires à l'implémentation:
- Configurez l'ordinateur de développement pour compiler le noyau.
- Ciblez le noyau commun à partir de la branche
common-android-mainline
.repo init -u https://android.googlesource.com/kernel/manifest -b common-android-mainline
repo sync
- Vérifiez que les modifications suivantes requises pour IncFS sont incluses dans le checkout de la branche:
- 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
- Ajoutez
CONFIG_INCREMENTAL_FS=y
ou, pour Android 11 uniquement,CONFIG_INCREMENTAL_FS=m
au bas du fichierdefconfig
. Pour voir un exemple, cliquez sur l'un des liens ci-dessous: - Créer le noyau
- Intégrez le noyau dans la compilation de l'image de l'appareil Android.
- Pour votre appareil Android cible, ajoutez l'une des lignes de propriété système spécifiques au fournisseur suivantes à votre fichier
device.mk
(facultatif sur les appareils lancés avec Android 12 ou version ultérieure) : PRODUCT_PROPERTY_OVERRIDES += \
ro.incremental.enable=yes
PRODUCT_PROPERTY_OVERRIDES += \
ro.incremental.enable=module:/vendor/lib/modules/incrementalfs.ko
- Consultez les exemples de fichiers
device.mk
pour Android Emulator et le Pixel 4. - Pour Android 11 uniquement: si vous utilisez
CONFIG_INCREMENTAL_FS=m
, ajoutez les règles Linux SE. 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;
-
Fichier
file.te
(voir cet exemple de fichierfile.te
) - Pilote de système de fichiers incrémentiel
type vendor_incremental_module, vendor_file_type, file_type;
-
Fichier
file_contents
: consultez cet exemple de fichierfile_contents
. # Incremental file system driver
/vendor/lib/modules/incrementalfs\.ko
u:object_r:vendor_incremental_module:s0
Lorsque vous utilisez CONFIG_INCREMENTAL_FS=y
, ajoutez l'un des éléments suivants à la fin du fichier:
Lorsque vous utilisez CONFIG_INCREMENTAL_FS=m
(pour Android 11 uniquement), ajoutez l'un des éléments suivants à la fin du fichier:
Créez et ajoutez un fichier vold.te
au dossier /system/sepolicy/vendor
de votre appareil avec le contenu suivant:
Autorisez-le à charger le pilote du système de fichiers incrémentiel:
Ajoutez les règles SE Linux suivantes au fichier file.te
existant dans votre dossier /system/sepolicy/vendor
:
Ajoutez les règles SE Linux suivantes au fichier file_contents
existant dans votre dossier /system/sepolicy/vendor
:
Mise à niveau du pilote du kernel
Les appareils qui passent à Android 12 peuvent inclure une ancienne version du pilote IncFS. Pour ces appareils, AOSP vous recommande de mettre à jour le pilote IncFS vers la version actuelle (dans ce cas, la version 2) pour les raisons suivantes:
- La version publiée avec Android 11 est l'implémentation initiale d'IncFS, destinée uniquement à la prise en charge de l'installation ADB.
- Android 12 utilise le pilote IncFS pour les installations en streaming des jeux Play, ce qui nécessite les nouvelles fonctionnalités et optimisations d'IncFS v2 pour une meilleure expérience utilisateur.
- La version 1 est compatible avec le streaming de jeux, mais avec des pénalités de performances et une utilisation plus importante de la batterie, du processeur et de la RAM que la version 2.
- La version 2 offre une expérience utilisateur améliorée pour le streaming, avec des animations de progression fluides, des rapports précis sur l'espace disque utilisé et la prévention des interférences de streaming des applications tierces.
Pour mettre à niveau le pilote IncFS dans votre kernel, appliquez les correctifs suivants pour le kernel 4.14 ou le kernel 4.19:
- Correctif du noyau 4.14
- Correctif du noyau 4.19
Pour toutes les autres versions de kernel personnalisées, veuillez porter l'un des ensembles de correctifs. Ils ne concernent que le répertoire fs/incfs
et s'appliquent de manière propre au code v1 existant.
- Correction du pilote v1 pour le noyau 4.14
- Correction du noyau 4.19 pour le pilote v1
- Correction du pilote v1 dans le noyau 5.4
Poursuivez l'utilisation du pilote IncFS de la même manière que pour l'original, mais maintenant mis à niveau vers Android 11, soit en tant que partie intégrée de l'image du noyau, soit en tant que module distinct. Ne modifiez pas la configuration de la carte mère ni de la propriété système.
Les nouveaux appareils utilisant une image de kernel GKI reçoivent automatiquement le dernier pilote IncFS (v2), configuré dans l'image du kernel. Aucune autre étape n'est requise.
La configuration du module téléchargeable a été abandonnée dans Android 12 et n'est pas compatible avec les nouveaux appareils. Il n'est autorisé que pour les mises à niveau ou pour le blocage d'une image du fournisseur lorsque le noyau d'origine l'a déjà compilé en tant que module.
Implémentations de référence
Cette implémentation peut être considérée comme faisant partie d'une image de kernel ou (pour Android 11 uniquement) comme un module pouvant être chargé.
Module téléchargeable (appareil Pixel 4)- Ajouter des précompilés de modules de kernel
- Ajouter et activer la modification de la propriété système du module du noyau sur l'appareil
- Modifier les règles SE Linux
Validation et test
Validez l'implémentation à l'aide de tests unitaires de fonctionnalités, de CTS et de GTS.
CTS
Utilisez
CtsIncrementalInstallHostTestCases
.
GTS
atest GtsIncrementalInstallTestCases
:
/gts-tests/tests/packageinstaller/incremental/src/com/google/android/packageinstaller/incremental/gts/IncrementalInstallerTest.java
Tester IncFS
- Configurez un environnement de développement.
- Effectuez les tâches d'implémentation décrites dans la section "Implémentation".
- Exécutez les tests manuels suivants:
mmma system/incremental_delivery/incfs/tests
atest libincfs-test
atest IncrementalServiceTest
atest PackageManagerShellCommandTest
PackageManagerShellCommandIncrementalTest
Tester IncFS avec le SDK Android (ADB et apksigner)
- Configurez un environnement de développement.
- Effectuez les tâches d'implémentation décrites dans la section "Implémentation".
- Flashez le build sur un appareil physique ou un émulateur cible.
- Générez ou obtenez un APK existant.
- Créez une clé de signature de débogage.
- Signez l'APK avec le format de signature v4 à partir du dossier
build-tools
../apksigner sign --ks debug.keystore game.apk
- Installez l'APK sur l'appareil à partir du dossier
platform-tools
../adb install game.apk

Rechercher ces tests
- /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