Das in Android 11 eingeführte Kernelmodul Incremental File System (IncFS) ermöglicht es dem Android-Betriebssystem, gestreamte APKs über die Android Debug Bridge (ADB) zu empfangen.
Dieses eigenständige Kernelmodul erstellt ein neues virtuelles Dateisystem, das auf dem bestehenden Android-Dateisystem aufgesetzt wird. Dies ergänzt Änderungen am Framework und SDK, damit App- und Spieleentwickler große APKs über die ADB auf einem Gerät bereitstellen können, auf dem Android 11 oder höher ausgeführt wird.
Die Kernel-Änderung ermöglicht ein neues APK-Signaturschema v4-Format und unterstützt Android-Framework-Änderungen im Android Package Manager, neue Systemdienste und Änderungen an der ADB.
Implementierung
Um das IncFS zu implementieren, müssen OEMs und SoC-Hersteller ihren Android-Geräte-Builds einen neuen Kernel-Treiber hinzufügen.
Nur für Android 11 , wenn der Kernel-Treiber als Modul erstellt wurde, wird er bei Bedarf geladen. Wenn keine Apps über eine inkrementelle ADB-Installation installiert sind, lädt das Gerät den Kerneltreiber nicht.
Andernfalls wird der Treiber immer geladen, wenn er als Teil des Kernel-Images erstellt wird. Diese Implementierung gilt für Android 12 und höher und kann mit Android 11 verwendet werden . Informationen zum Upgrade des Kernel-Treibers auf Android 12 finden Sie unter Kernel-Treiber-Upgrade .
Der Kernel-Treiber ist Teil eines größeren Systems, um gestreamte APK-Installationen zu ermöglichen. OEMs und Anbieter müssen nicht den genauen IncFS-Code verwenden, der in den Beispielimplementierungen bereitgestellt wird. Um jedoch eine konsistente Erfahrung auf allen Geräten zu gewährleisten, müssen Sie sicherstellen, dass die API-Implementierung über ein Dateisystem verfügt, das über Dateilesefunktionen und Verzeichnis-Lese-/Schreibfunktionen verfügt, wie in der Userspace-Schnittstelle für inkrementelle FS- Dokumentation definiert.
Darüber hinaus müssen Implementierungen Mount-Optionen und spezielle Dateien haben, die funktional mit der IncFS-Beispielimplementierung übereinstimmen.
Im Folgenden sind die notwendigen Änderungen zur Umsetzung aufgelistet:
- Richten Sie die Entwicklungsmaschine ein , um den Kernel zu erstellen.
- Zielen Sie auf den gemeinsamen Kernel aus dem
common-android-mainline
Zweig ab.repo init -u https://android.googlesource.com/kernel/manifest -b common-android-mainline
repo sync
- Überprüfen Sie, ob die folgenden Änderungen, die für IncFS erforderlich sind, im Zweig-Checkout enthalten sind:
- 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
- Hängen Sie entweder
CONFIG_INCREMENTAL_FS=y
oder nur für Android 11CONFIG_INCREMENTAL_FS=m
am Ende derdefconfig
Datei an. Um ein Beispiel zu sehen, klicken Sie auf einen der folgenden Links: - Erstellen Sie den Kernel
- Betten Sie den Kernel in den Android-Geräte-Image-Build ein .
- Hängen Sie für Ihr Android-Zielgerät eine der folgenden herstellerspezifischen Systemeigenschaftenzeilen an Ihre
device.mk
-Datei an ( optional bei Geräten, die mit Android 12 und höher gestartet wurden ): -
PRODUCT_PROPERTY_OVERRIDES += \
-
ro.incremental.enable=yes
-
PRODUCT_PROPERTY_OVERRIDES += \
-
ro.incremental.enable=module:/vendor/lib/modules/incrementalfs.ko
- Sehen Sie sich die Beispieldateien
device.mk
für den Android-Emulator und Pixel 4 an. - Nur für Android 11 : Wenn Sie
CONFIG_INCREMENTAL_FS=m
verwenden, fügen Sie SE Linux Rules hinzu. -
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
Datei - Ein Beispiel finden Sie in dieserfile.te
Datei .) - Inkrementeller Dateisystemtreiber
-
type vendor_incremental_module, vendor_file_type, file_type;
-
file_contents
Datei – Ein Beispiel finden Sie in dieserfile_contents
Datei. -
# Incremental file system driver
-
/vendor/lib/modules/incrementalfs\.ko
-
u:object_r:vendor_incremental_module:s0
Wenn Sie CONFIG_INCREMENTAL_FS=y
verwenden, hängen Sie die Datei mit einem der folgenden an:
Wenn Sie CONFIG_INCREMENTAL_FS=m
( nur für Android 11 ) verwenden, hängen Sie die Datei mit einem der folgenden an:
Erstellen Sie eine vold.te
Datei und fügen Sie sie dem Geräteordner /system/sepolicy/vendor
mit folgendem Inhalt hinzu:
Erlauben Sie ihm, den inkrementellen Dateisystemtreiber zu laden:
Hängen Sie die folgenden SE-Linux-Regeln an die vorhandene file.te
-Datei an, die sich in Ihrem /system/sepolicy/vendor
Ordner befindet:
Hängen Sie die folgenden SE-Linux-Regeln an die vorhandene file_contents
-Datei an, die sich in Ihrem /system/sepolicy/vendor
Ordner befindet:
Upgrade des Kernel-Treibers
Geräte, die auf Android 12 aktualisieren, enthalten möglicherweise eine ältere Version des IncFS-Treibers. Für diese Geräte empfiehlt AOSP aus folgenden Gründen, den IncFS-Treiber auf die aktuelle Version (in diesem Fall v2) zu aktualisieren:
- Die mit Android 11 veröffentlichte Version ist die anfängliche Implementierung von IncFS, die nur für die ADB-Installationsunterstützung vorgesehen ist.
- Android 12 verwendet den IncFS-Treiber für Streaming-Installationen von Play-Spielen, was die neuen Funktionen und Optimierungen von IncFS v2 für eine bessere Benutzererfahrung erfordert.
- V1 unterstützt Game-Streaming, jedoch mit Leistungseinbußen und einer höheren Akku-, CPU- und RAM-Auslastung als v2.
- V2 bietet eine verbesserte UX für das Streaming mit reibungslosen Fortschrittsanimationen, präzisen Berichten zur Speicherplatznutzung und Verhinderung von Streaming-Interferenzen durch Apps von Drittanbietern.
Um den IncFS-Treiber in Ihrem Kernel zu aktualisieren, wenden Sie die folgenden Patches entweder für Kernel 4.14 oder Kernel 4.19 an:
- Kernel 4.14- Patch
- Kernel 4.19- Patch
Für alle anderen benutzerdefinierten Kernel-Versionen portieren Sie bitte eines der Patchsets. Sie wirken sich nur auf das fs/incfs
Verzeichnis aus und gelten sauber für den vorhandenen v1-Code.
Verwenden Sie den IncFS-Treiber weiterhin auf die gleiche Weise wie für das ursprüngliche, aber jetzt aktualisierte Android 11, entweder als integrierten Teil des Kernel-Images oder als separates Modul. Ändern Sie nicht die Konfiguration der Systemplatine oder der Systemeigenschaften.
Neue Geräte, die ein GKI-Kernel-Image verwenden, erhalten automatisch den neuesten (v2) IncFS-Treiber, der als Teil des Kernel-Image konfiguriert ist. Dies erfordert keine zusätzlichen Schritte.
Die ladbare Modulkonfiguration ist in Android 12 veraltet und wird für neue Geräte nicht unterstützt. Es ist nur für die Upgrades oder für das Einfrieren eines Anbieter-Images erlaubt, wenn der ursprüngliche Kernel es bereits als Modul gebaut hatte.
Referenzimplementierungen
Diese Implementierung kann entweder als Teil eines Kernel-Images oder ( nur für Android 11 ) als ladbares Modul betrachtet werden.
Ladbares Modul (Pixel 4-Gerät)- Vorgefertigte Kernel-Module hinzufügen
- Hinzufügen und Aktivieren der Systemeigenschaftenänderung des Kernelmoduls auf dem Gerät
- Aktualisieren Sie die SE-Linux-Regeln
Validierung und Prüfung
Validieren Sie die Implementierung mit Feature Unit Tests, CTS und GTS.
CTS
Verwenden SieCtsIncrementalInstallHostTestCases
.GTS
atest GtsIncrementalInstallTestCases
:
/gts-tests/tests/packageinstaller/incremental/src/com/google/android/packageinstaller/incremental/gts/IncrementalInstallerTest.java
Testen Sie das IncFS
- Richten Sie eine Entwicklungsumgebung ein .
- Führen Sie die im Abschnitt „Implementierung“ beschriebenen Implementierungsaufgaben aus.
- Führen Sie die folgenden manuellen Tests aus:
mmma system/incremental_delivery/incfs/tests
atest libincfs-test
atest IncrementalServiceTest
atest PackageManagerShellCommandTest
PackageManagerShellCommandIncrementalTest
So testen Sie IncFS mit Android SDK (ADB und apksigner)
- Richten Sie eine Entwicklungsumgebung ein .
- Führen Sie die im Abschnitt „Implementierung“ beschriebenen Implementierungsaufgaben aus.
- Flashen Sie den Build auf einem physischen Zielgerät oder Emulator.
- Generieren oder erhalten Sie ein vorhandenes APK.
- Erstellen Sie einen Debug-Signaturschlüssel .
- Signieren Sie das APK mit v4-Signaturformat aus dem Ordner
build-tools
../apksigner sign --ks debug.keystore game.apk
- Installieren Sie das APK auf dem Gerät aus dem
platform-tools
Ordner../adb install game.apk

Suchen Sie diese 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