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 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 distribuire APK di grandi dimensioni tramite ADB su un dispositivo con Android 11 o versioni successive.
La modifica del kernel abilita un nuovo formato APK Signature Scheme v4 e supporta le modifiche al framework Android in Android Package Manager, i nuovi servizi di sistema e le modifiche all'ADB.
Implementazione
Per implementare IncFS, gli OEM e i produttori di SoC devono aggiungere un nuovo driver del kernel alle build dei loro dispositivi Android.
Solo per Android 11 , se il driver del kernel è compilato come modulo, viene caricato su richiesta. Se non ci sono app installate tramite un'installazione incrementale ADB, il dispositivo non carica il driver del kernel.
Altrimenti, 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'aggiornamento del driver del kernel ad Android 12, vedere Aggiornamento del driver del kernel .
Il driver del kernel fa parte di un sistema più ampio per abilitare le installazioni APK in streaming. Gli OEM e i fornitori non devono utilizzare l'esatto codice IncFS fornito nelle implementazioni di esempio. Tuttavia, per garantire un'esperienza coerente tra i dispositivi, è necessario assicurarsi che l'implementazione dell'API disponga di un file system con funzionalità di lettura file e funzionalità di lettura/scrittura directory come definito nell'interfaccia dello spazio utente per la documentazione di Incremental FS .
Inoltre, le implementazioni devono avere opzioni di montaggio e file speciali che corrispondono funzionalmente all'implementazione di esempio IncFS.
Di seguito sono elencate le modifiche necessarie per l'implementazione:
- Configurare 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 checkout della filiale:
- 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 solo per Android 11 ,CONFIG_INCREMENTAL_FS=m
alla fine del filedefconfig
. Per vedere un esempio, fare clic su uno dei collegamenti seguenti: - Costruisci il kernel
- Incorpora il kernel nella build dell'immagine del dispositivo Android .
- Per il tuo dispositivo Android di destinazione, aggiungi una delle seguenti righe di proprietà del sistema specifiche del fornitore al tuo file
device.mk
( facoltativo 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
- Guarda i file
device.mk
di esempio per l'emulatore Android e Pixel 4 . - Solo per Android 11 : se utilizzi
CONFIG_INCREMENTAL_FS=m
, aggiungi 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;
-
file.te
file - Per un esempio vedere questo filefile.te
.) - Driver del file system incrementale
-
type vendor_incremental_module, vendor_file_type, file_type;
-
file_contents
file - Per un esempio, vedere 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 al file uno di questi:
Quando utilizzi CONFIG_INCREMENTAL_FS=m
( solo per Android 11 ), aggiungi al file uno di questi:
Crea e aggiungi un file vold.te
alla cartella del tuo dispositivo /system/sepolicy/vendor
con il seguente contenuto:
Consentire di caricare il driver del file system incrementale:
Aggiungi le seguenti regole SE Linux al file file.te
esistente che si trova nella tua cartella /system/sepolicy/vendor
:
Aggiungi le seguenti regole SE Linux al file file_contents
esistente trovato nella cartella /system/sepolicy/vendor
:
Aggiornamento del driver del kernel
I dispositivi che eseguono l'aggiornamento 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 questi motivi:
- La versione rilasciata con Android 11 è l'implementazione iniziale di IncFS, destinata solo al supporto dell'installazione di ADB.
- Android 12 utilizza il driver IncFS per le installazioni in streaming dei giochi Play, che richiedono le nuove funzionalità e le ottimizzazioni di IncFS v2 per una migliore esperienza utente.
- V1 supporta lo streaming di giochi, ma lo fa con penalizzazioni delle prestazioni e maggiore utilizzo di batteria, CPU e RAM rispetto a v2.
- V2 offre una migliore esperienza utente per lo streaming, con animazioni di avanzamento fluide, rapporti precisi sull'utilizzo dello spazio su disco e prevenzione delle interferenze di streaming di app di terze parti.
Per aggiornare il driver IncFS nel tuo kernel, applica le seguenti patch per il kernel 4.14 o il kernel 4.19:
- Patch del kernel 4.14
- Patch del kernel 4.19
Per tutte le altre versioni del kernel personalizzate, porta uno dei set di patch. Influiscono solo sulla directory fs/incfs
e si applicano in modo pulito al codice v1 esistente.
- Correzione del kernel 4.14 al driver v1
- Correzione del kernel 4.19 al driver v1
- Correzione del kernel 5.4 al driver v1
Continua a utilizzare il driver IncFS nello stesso modo dell'originale ma ora aggiornato Android 11, come parte integrata dell'immagine del kernel o come modulo separato. Non modificare la scheda di sistema o la configurazione delle proprietà del sistema.
I nuovi dispositivi che utilizzano un'immagine del kernel GKI ottengono automaticamente il driver IncFS più recente (v2), configurato come parte dell'immagine del kernel. Questo non richiede passaggi aggiuntivi.
La configurazione del modulo caricabile è stata deprecata in Android 12 e non è supportata per i nuovi dispositivi. È consentito solo per gli aggiornamenti o per il blocco dell'immagine di un 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)- Aggiunta dei moduli precostituiti del kernel
- Aggiungi e abilita la modifica della proprietà del sistema del modulo kernel sul dispositivo
- Aggiorna le regole di SE Linux
Convalida e test
Convalida l'implementazione utilizzando Feature Unit Test, CTS e GTS.
CTS
UsaCtsIncrementalInstallHostTestCases
.GTS
atest GtsIncrementalInstallTestCases
:
/gts-tests/tests/packageinstaller/incremental/src/com/google/android/packageinstaller/incremental/gts/IncrementalInstallerTest.java
Prova l'IncFS
- Configurare un ambiente di sviluppo.
- Completare le attività di implementazione descritte nella sezione sull'implementazione.
- Eseguire i seguenti test manuali:
mmma system/incremental_delivery/incfs/tests
atest libincfs-test
atest IncrementalServiceTest
atest PackageManagerShellCommandTest
PackageManagerShellCommandIncrementalTest
Come testare IncFS con Android SDK (ADB e apksigner)
- Configurare un ambiente di sviluppo.
- Completare le attività di implementazione descritte nella sezione sull'implementazione.
- Eseguire 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