Il modulo del 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 basa sul file system Android esistente. Questo completa le modifiche apportate 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 abilita un nuovo formato dello schema di firma dell'APK v4 e supporta le modifiche del framework Android in Android Package Manager, nuovi servizi di sistema e modifiche all'ADB.
Implementazione
Per implementare IncFS, gli OEM e i produttori di SoC devono aggiungere un nuovo driver del kernel alle build dei dispositivi Android.
Solo per Android 11, se il driver del kernel è compilato come modulo, viene caricato su richiesta. Se non sono state 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 caricato sempre. 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, consulta Upgrade del driver del kernel.
Il driver del kernel fa parte di un sistema più grande per abilitare le installazioni di APK in streaming. Gli OEM 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 abbia un file system con funzionalità di lettura dei file e di lettura/scrittura delle directory come definito nella documentazione dell'interfaccia dello spazio utente per il file system incrementale.
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:
- Configura la macchina di sviluppo per compilare il kernel.
- Scegli come target il kernel comune dal ramo
common-android-mainline
.repo init -u https://android.googlesource.com/kernel/manifest -b common-android-mainline
repo sync
- Verifica che le seguenti modifiche necessarie per IncFS siano presenti nel controllo del ramo:
- 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
- Aggiungi
CONFIG_INCREMENTAL_FS=y
o per solo Android 11,CONFIG_INCREMENTAL_FS=m
nella parte inferiore del filedefconfig
. Per visualizzare un esempio, fai clic su uno dei link riportati di seguito: - Compila il kernel
- Incorpora il kernel nella build dell'immagine del dispositivo Android.
- Per il dispositivo Android di destinazione, aggiungi al file
device.mk
una delle seguenti righe di proprietà di sistema specifiche del fornitore (facoltativa nei dispositivi lanciati con Android 12 e versioni successive): PRODUCT_PROPERTY_OVERRIDES += \
ro.incremental.enable=yes
PRODUCT_PROPERTY_OVERRIDES += \
ro.incremental.enable=module:/vendor/lib/modules/incrementalfs.ko
- Consulta i file
device.mk
di esempio per l'emulatore Android e per Pixel 4. - Solo per Android 11: se utilizzi
CONFIG_INCREMENTAL_FS=m
, aggiungi Regole SE Linux. 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;
-
File
file.te
: per un esempio, consulta questo filefile.te
. - Driver del file system incrementale
type vendor_incremental_module, vendor_file_type, file_type;
-
File
file_contents
: per un esempio, consulta questo filefile_contents
. # Incremental file system driver
/vendor/lib/modules/incrementalfs\.ko
u:object_r:vendor_incremental_module:s0
Quando utilizzi CONFIG_INCREMENTAL_FS=y
, aggiungi il file con uno dei seguenti elementi:
Quando utilizzi CONFIG_INCREMENTAL_FS=m
(solo per Android 11),
aggiungi il file con uno dei seguenti elementi:
Crea e aggiungi un file vold.te
alla cartella /system/sepolicy/vendor
del dispositivo con i seguenti contenuti:
Consenti di caricare il driver del file system incrementale:
Aggiungi le seguenti regole SE Linux al file file.te
esistente trovato nella cartella /system/sepolicy/vendor
:
Aggiungi le seguenti regole SE Linux al file file_contents
esistente nella cartella /system/sepolicy/vendor
:
Aggiornamento 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 corrente (in questo caso 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 Play Giochi, che richiede le nuove funzionalità e ottimizzazioni di IncFS v2 per un'esperienza utente migliore.
- La versione 1 supporta lo streaming di giochi, ma con penalizzazioni delle prestazioni e un utilizzo maggiore della batteria, della CPU e della RAM rispetto alla versione 2.
- La versione 2 offre un'esperienza utente migliorata per lo streaming, con animazioni di avanzamento fluide, report precisi sull'utilizzo dello spazio su disco e prevenzione delle interferenze con lo 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:
- Patch del kernel 4.14
- Patch per il kernel 4.19
Per tutte le altre versioni del kernel personalizzate, esegui il porting di uno dei patchset. Interessano solo la directory fs/incfs
e si applicano in modo pulito al codice v1 esistente.
- Correzione del driver v1 per il kernel 4.14
- Correzione del kernel 4.19 per il driver v1
- Correzione del driver v1 per il kernel 5.4
Continua a utilizzare il driver IncFS nello stesso modo in cui lo usavi per Android 11 originale, ma ora 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 del kernel GKI ricevono automaticamente il driver IncFS (v2) configurato come parte dell'immagine del kernel. Non sono necessari 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à compilato come modulo.
Implementazioni di riferimento
Questa implementazione può essere considerata come parte di un'immagine del kernel o (solo per Android 11) come modulo caricabile.
Modulo caricabile (dispositivo Pixel 4)- Aggiungere moduli precompilati del kernel
- Aggiungere e attivare la modifica della proprietà di sistema del modulo del kernel sul dispositivo
- Aggiorna le regole SE Linux
Convalida e test
Convalida l'implementazione utilizzando i test delle unità di 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
- Configura un ambiente di sviluppo.
- Completa le attività di implementazione descritte nella sezione relativa all'implementazione.
- Esegui i seguenti test manuali:
mmma system/incremental_delivery/incfs/tests
atest libincfs-test
atest IncrementalServiceTest
atest PackageManagerShellCommandTest
PackageManagerShellCommandIncrementalTest
Testa IncFS con l'SDK Android (ADB e apksigner)
- Configura un ambiente di sviluppo.
- Completa le attività di implementazione descritte nella sezione relativa all'implementazione.
- Esegui il flashing della build su un dispositivo fisico o un emulatore 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 cartella
build-tools
../apksigner sign --ks debug.keystore game.apk
- Installa l'APK sul dispositivo dalla cartella
platform-tools
../adb install game.apk

Individua questi test
- /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