Système de fichiers incrémentiel

Le module de noyau Incremental File System (IncFS) introduit dans Android 11 permet au système d'exploitation Android de recevoir des APK diffusés en streaming via Android Debug Bridge (ADB).

Ce module de noyau autonome crée un 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 des APK volumineux via ADB sur un appareil exécutant Android 11 ou version ultérieure.

La modification du noyau permet un nouveau format APK Signature Scheme v4 et prend en charge les modifications du framework Android dans le gestionnaire de packages Android, les nouveaux services système et les modifications apportées à ADB.

Implémentation

Pour implémenter IncFS, les OEM et les fabricants de SoC doivent ajouter un nouveau pilote de noyau à leurs builds d'appareils Android.

Pour Android 11 uniquement, si le pilote du noyau est conçu comme un 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, lorsque le pilote est intégré à l'image du noyau, il 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 noyau vers Android 12, consultez Mise à niveau du pilote du noyau.

Le pilote du noyau fait partie d'un système plus vaste permettant les installations d'APK en streaming. Les OEM et les fournisseurs n'ont pas besoin d'utiliser exactement le code IncFS fourni dans les exemples d'implémentation. 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 Incremental FS.

De plus, les implémentations doivent disposer d'options de montage et de fichiers spéciaux qui correspondent fonctionnellement à l'implémentation d'exemple IncFS.

Voici les modifications nécessaires à l'implémentation :

  1. Configurez l'ordinateur de développement pour compiler le noyau.
  2. 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
  3. Vérifiez que les modifications suivantes nécessaires à IncFS se trouvent dans l'extraction de branche :
  4. Ajoutez CONFIG_INCREMENTAL_FS=y ou CONFIG_INCREMENTAL_FS=m (pour Android 11 uniquement) en bas du fichier defconfig. Pour voir un exemple, cliquez sur l'un des liens ci-dessous :
  5. Créer le noyau
  6. Intégrez le noyau dans la compilation de l'image de l'appareil Android.
  7. 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 pour les appareils lancés avec Android 12 ou version ultérieure) :
  8. Lorsque vous utilisez CONFIG_INCREMENTAL_FS=y, ajoutez l'un des éléments suivants au fichier :

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

    Lorsque vous utilisez CONFIG_INCREMENTAL_FS=m (pour Android 11 uniquement), ajoutez l'un des éléments suivants au fichier :

    • PRODUCT_PROPERTY_OVERRIDES += \
    • ro.incremental.enable=module:/vendor/lib/modules/incrementalfs.ko
  9. Consultez les exemples de fichiers device.mk pour l'émulateur Android et le Pixel 4.
  10. Pour Android 11 uniquement : si vous utilisez CONFIG_INCREMENTAL_FS=m, ajoutez des règles SELinux.
  11. Créez et ajoutez un fichier vold.te au dossier /system/sepolicy/vendor de votre appareil avec le contenu suivant :

    • vold.te

    Autorisez-le à charger le pilote du système de fichiers incrémentiel :

    • allow vold self:capability sys_module;
    • allow vold vendor_incremental_module:file r_file_perms;
    • allow vold vendor_incremental_module:system module_load;

    Ajoutez les règles SE Linux suivantes au fichier file.te existant qui se trouve dans votre dossier /system/sepolicy/vendor :

    • Fichier file.te : pour obtenir un exemple, consultez ce fichier file.te.
    • Pilote de système de fichiers incrémentiel
    • type vendor_incremental_module, vendor_file_type, file_type;

    Ajoutez les règles SE Linux suivantes au fichier file_contents existant qui se trouve dans votre dossier /system/sepolicy/vendor :

    • Fichier file_contents : pour obtenir un exemple, consultez ce fichier file_contents.
    • # Incremental file system driver
    • /vendor/lib/modules/incrementalfs\.ko
    • u:object_r:vendor_incremental_module:s0

Mise à niveau du pilote du noyau

Les appareils mis à niveau vers Android 12 peuvent inclure une ancienne version du pilote IncFS. Pour ces appareils, l'AOSP recommande de mettre à jour le pilote IncFS vers la version actuelle (v2 dans ce cas) pour les raisons suivantes :

  • La version publiée avec Android 11 est l'implémentation initiale d'IncFS, qui ne cible que la compatibilité avec l'installation ADB.
  • Android 12 utilise le pilote IncFS pour les installations en streaming de 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 pertes de performances et une utilisation plus élevée 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'utilisation de l'espace disque et la prévention des interférences de streaming des applications tierces.

Pour mettre à niveau le pilote IncFS dans votre noyau, appliquez les correctifs suivants pour le noyau 4.14 ou le noyau 4.19 :

Pour toutes les autres versions de noyau personnalisées, veuillez transférer l'un des ensembles de correctifs. Elles n'affectent que le répertoire fs/incfs et s'appliquent proprement au code v1 existant.

Continuez à utiliser le pilote IncFS de la même manière que pour la version d'origine, mais maintenant avec Android 11 mis à niveau, 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 des propriétés système.

Les nouveaux appareils utilisant une image de noyau GKI obtiennent automatiquement le dernier pilote IncFS (v2), configuré dans l'image de noyau. Aucune autre étape n'est requise.

La configuration des modules chargeables 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 gel d'une image du fournisseur lorsque le noyau d'origine l'avait déjà intégré en tant que module.

Implémentations de référence

Cette implémentation peut être considérée comme faisant partie d'une image du noyau ou (pour Android 11 uniquement) comme un module chargeable.

Module chargeable (appareil Pixel 4) Android Emulator (en tant qu'élément de l'image du noyau)

Validation et tests

Validez l'implémentation à l'aide des tests unitaires de fonctionnalité, CTS et GTS.

CTS

Utilisez CtsIncrementalInstallHostTestCases.

GTS

atest GtsIncrementalInstallTestCases :

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

Tester IncFS

  1. Configurez un environnement de développement.
  2. Effectuez les tâches d'implémentation décrites dans la section correspondante.
  3. 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 correspondante.
  • Flashez la compilation sur un appareil physique ou un émulateur cible.
  • Générez ou obtenez un fichier 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
Exemple d'installation
Figure 1 : Exemple d'installation

Où trouver ces tests ?