File system incrementale

Il modulo kernel Incremental File System (IncFS) introdotto in Android 11 consente al sistema operativo Android di ricevere APK in streaming tramite Android Debug Bridge (ADB).

Questo modulo del kernel autonomo crea un nuovo file system virtuale che si trova sopra il file system Android esistente. Ciò integra le modifiche al framework e all'SDK per consentire agli sviluppatori di app e giochi di eseguire il deployment di APK di grandi dimensioni tramite ADB su un dispositivo con Android 11 o versioni successive.

La modifica del kernel attiva un nuovo formato dello schema di firma dell'APK v4 e supporta le modifiche al framework Android in Android Package Manager, nuovi servizi di sistema e modifiche ad ADB.

Implementazione

Per implementare IncFS, i produttori di OEM e SoC devono aggiungere un nuovo driver del kernel alle build dei loro dispositivi Android.

Solo per Android 11, se il driver del kernel è creato come modulo, viene caricato su richiesta. Se non sono installate app tramite un'installazione incrementale ADB, il dispositivo non carica il driver del kernel.

In caso contrario, quando viene compilato come parte dell'immagine del kernel, il driver viene sempre caricato. Questa implementazione è valida per Android 12 e versioni successive e può essere utilizzata con Android 11. Per informazioni sull'upgrade del driver del kernel ad Android 12, vedi Upgrade del driver del kernel.

Il driver del kernel fa parte di un sistema più ampio per consentire le installazioni di APK in streaming. I produttori di apparecchiature originali e i fornitori non devono utilizzare il codice IncFS esatto fornito nelle implementazioni di esempio. Tuttavia, per garantire un'esperienza coerente su tutti i dispositivi, devi assicurarti che l'implementazione dell'API disponga di un file system con funzionalità di lettura dei file e di lettura/scrittura delle directory come definito nella documentazione dell'interfaccia Userspace per Incremental FS.

Inoltre, le implementazioni devono avere opzioni di montaggio e file speciali che corrispondono funzionalmente all'implementazione di esempio di IncFS.

Di seguito sono elencate le modifiche necessarie per l'implementazione:

  1. Configura la macchina di sviluppo per compilare il kernel.
  2. Scegli come target il kernel comune del ramo common-android-mainline.
    repo init -u https://android.googlesource.com/kernel/manifest -b common-android-mainline
    repo sync
  3. Verifica che le seguenti modifiche necessarie per IncFS siano presenti nel checkout del ramo:
  4. Aggiungi CONFIG_INCREMENTAL_FS=y o per Android 11, CONFIG_INCREMENTAL_FS=m in fondo al file defconfig. Per visualizzare un esempio, fai clic su uno dei seguenti link:
  5. Crea il kernel
  6. Incorpora il kernel nella compilazione dell'immagine del dispositivo Android.
  7. Per il dispositivo Android di destinazione, aggiungi una delle seguenti righe di proprietà di sistema specifiche del fornitore al file device.mk (facoltativo nei dispositivi lanciati con Android 12 e versioni successive):
  8. Quando utilizzi CONFIG_INCREMENTAL_FS=y, aggiungi al file uno di questi elementi:

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

    Quando utilizzi CONFIG_INCREMENTAL_FS=m (solo per Android 11), aggiungi il file con uno di questi elementi:

    • PRODUCT_PROPERTY_OVERRIDES += \
    • ro.incremental.enable=module:/vendor/lib/modules/incrementalfs.ko
  9. Consulta i file di esempio device.mk per l'emulatore Android e Pixel 4.
  10. Solo per Android 11: se utilizzi CONFIG_INCREMENTAL_FS=m, aggiungi le regole SE Linux.
  11. Crea e aggiungi un file vold.te alla cartella /system/sepolicy/vendor del tuo dispositivo con i seguenti contenuti:

    • vold.te

    Consenti il caricamento del driver del file system incrementale:

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

    Aggiungi le seguenti regole SE Linux al file file.te esistente che si trova nella cartella /system/sepolicy/vendor:

    • file.te. Per un esempio, vedi questo file file.te.)
    • Driver del file system incrementale
    • type vendor_incremental_module, vendor_file_type, file_type;

    Aggiungi le seguenti regole SE Linux al file file_contents esistente nella cartella /system/sepolicy/vendor:

    • File file_contents. Per un esempio, vedi questo file file_contents.
    • # Incremental file system driver
    • /vendor/lib/modules/incrementalfs\.ko
    • u:object_r:vendor_incremental_module:s0

Upgrade del driver del kernel

I dispositivi che eseguono l'upgrade ad Android 12 potrebbero includere una versione precedente del driver IncFS. Per questi dispositivi, AOSP consiglia di aggiornare il driver IncFS alla versione attuale (in questo caso la v2) per i seguenti motivi:

  • La versione rilasciata con Android 11 è l'implementazione iniziale di IncFS, destinata solo al supporto dell'installazione ADB.
  • Android 12 utilizza il driver IncFS per le installazioni in streaming di giochi Play, che richiede le nuove funzionalità e ottimizzazioni di IncFS v2 per una migliore esperienza utente.
  • V1 supporta lo streaming di giochi, ma con penalizzazioni delle prestazioni e un maggiore utilizzo di batteria, CPU e RAM rispetto alla versione 2.
  • La versione 2 offre una UX migliorata per lo streaming, con animazioni di avanzamento fluide, report precisi sull'utilizzo dello spazio su disco e prevenzione delle interferenze dello streaming di app di terze parti.

Per eseguire l'upgrade del driver IncFS nel kernel, applica le seguenti patch per il kernel 4.14 o il kernel 4.19:

Per tutte le altre versioni del kernel personalizzato, esegui il porting di uno dei patchset. Interessano solo la directory fs/incfs e vengono applicate in modo pulito al codice v1 esistente.

Continua a utilizzare il driver IncFS nello stesso modo della versione originale, ma ora con Android 11 aggiornato, come parte integrata dell'immagine del kernel o come modulo separato. Non modificare la configurazione della scheda di sistema o della proprietà di sistema.

I nuovi dispositivi che utilizzano un'immagine kernel GKI ricevono automaticamente l'ultimo driver IncFS (v2), configurato come parte dell'immagine kernel. Questa operazione non richiede passaggi aggiuntivi.

La configurazione del modulo caricabile è stata ritirata in Android 12 e non è supportata per i nuovi dispositivi. È consentito solo per gli upgrade o per il blocco dell'immagine del fornitore quando il kernel originale lo aveva già integrato come modulo.

Implementazioni di riferimento

Questa implementazione può essere considerata parte di un'immagine del kernel o (solo per Android 11) come modulo caricabile.

Modulo caricabile (dispositivo Pixel 4) Emulatore Android (come parte dell'immagine del kernel)

Convalida e test

Convalida l'implementazione utilizzando i test delle unità delle funzionalità, CTS e GTS.

CTS

Utilizza CtsIncrementalInstallHostTestCases.

GTS

atest GtsIncrementalInstallTestCases:

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

Testa IncFS

  1. Configura un ambiente di sviluppo.
  2. Completa le attività di implementazione descritte nella sezione Implementazione.
  3. Esegui i seguenti test manuali:
    mmma system/incremental_delivery/incfs/tests
    atest libincfs-test
    atest IncrementalServiceTest
    atest PackageManagerShellCommandTest
    PackageManagerShellCommandIncrementalTest

Testare IncFS con l'SDK Android (ADB e apksigner)

  • Configura un ambiente di sviluppo.
  • Completa le attività di implementazione descritte nella sezione Implementazione.
  • Installa la build su un emulatore o un dispositivo fisico di destinazione.
  • Genera o ottieni un APK esistente.
  • Crea una chiave di firma di debug.
  • Firma l'APK con il formato di firma v4 dalla cartellabuild-tools.
    ./apksigner sign --ks debug.keystore game.apk
  • Installa l'APK sul dispositivo dalla cartella platform-tools.
    ./adb install game.apk
Esempio di installazione
Figura 1: esempio di installazione

Individuare questi test