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 in sich geschlossene Kernelmodul erstellt ein neues virtuelles Dateisystem, das sich über dem vorhandenen Android-Dateisystem befindet. Dies ergänzt Änderungen im Framework und SDK, die es App- und Spieleentwicklern ermöglichen, große APKs über ADB auf einem Gerät mit Android 11 oder höher bereitzustellen.
Die Kerneländerung ermöglicht ein neues APK-Signaturschema v4 und unterstützt Änderungen am Android-Framework im Android-Paketmanager, neue Systemdienste und Änderungen am ADB.
Implementierung
Um 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 Kerneltreiber als Modul erstellt wird, wird er bei Bedarf geladen. Wenn keine Apps über eine inkrementelle ADB-Installation installiert werden, lädt das Gerät den Kernel-Treiber nicht.
Andernfalls wird der Treiber immer geladen, wenn er als Teil des Kernel-Images erstellt wird. Diese Implementierung ist für Android 12 und höher gültig und kann mit Android 11 verwendet werden. Informationen zum Upgraden des Kerneltreibers auf Android 12 finden Sie unter Kernel driver upgrade.
Der Kerneltreiber ist Teil eines größeren Systems, das die Installation von gestreamten APKs ermöglicht. OEMs und Anbieter müssen nicht den genauen IncFS-Code verwenden, der in den Beispielimplementierungen bereitgestellt wird. Damit die Nutzer auf allen Geräten eine einheitliche Erfahrung haben, muss die API-Implementierung jedoch ein Dateisystem mit Funktionen zum Lesen von Dateien und zum Lesen und Schreiben von Verzeichnissen gemäß der Dokumentation Userspace interface for Incremental FS (Userspace-Schnittstelle für inkrementelles Dateisystem) haben.
Außerdem müssen Implementierungen Bereitstellungsoptionen und Spezialdateien haben, die funktional der IncFS-Beispielimplementierung entsprechen.
Im Folgenden sind die erforderlichen Änderungen für die Implementierung aufgeführt:
- Richten Sie den Entwicklungscomputer ein, um den Kernel zu erstellen.
- Richten Sie die Ausrichtung auf den gemeinsamen Kernel aus dem
common-android-mainline
-Zweig aus.repo init -u https://android.googlesource.com/kernel/manifest -b common-android-mainline
repo sync
- Prüfen Sie, ob die folgenden Änderungen, die für IncFS erforderlich sind, im Branch-Checkout vorhanden 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
- Fügen Sie entweder
CONFIG_INCREMENTAL_FS=y
oderCONFIG_INCREMENTAL_FS=m
für nur Android 11 unten in die Dateidefconfig
ein. Klicken Sie auf einen der folgenden Links, um ein Beispiel aufzurufen: - Kernel erstellen
- Bette den Kernel in den Build des Android-Geräte-Images ein.
- Fügen Sie für Ihr Android-Zielgerät eine der folgenden anbieterspezifischen Systemzeilen in die Datei
device.mk
ein (optional bei Geräten, die mit Android 12 und höher eingeführt wurden): PRODUCT_PROPERTY_OVERRIDES += \
ro.incremental.enable=yes
PRODUCT_PROPERTY_OVERRIDES += \
ro.incremental.enable=module:/vendor/lib/modules/incrementalfs.ko
- Sehen Sie sich die
device.mk
-Beispieldateien für den Android-Emulator und das Pixel 4 an. - Nur für Android 11: Wenn Sie
CONFIG_INCREMENTAL_FS=m
verwenden, fügen Sie SELinux-Regeln 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 eine der folgenden Optionen an die Datei an:
Wenn Sie CONFIG_INCREMENTAL_FS=m
verwenden (nur für Android 11), hängen Sie eine der folgenden Endungen an die Datei an:
Erstellen Sie eine vold.te
-Datei und fügen Sie sie dem Ordner /system/sepolicy/vendor
auf Ihrem Gerät mit folgendem Inhalt hinzu:
Lassen Sie den inkrementellen Dateisystemtreiber laden:
Hängen Sie die folgenden SE Linux-Regeln an die vorhandene Datei file.te
an, die sich im Ordner /system/sepolicy/vendor
befindet:
Hängen Sie die folgenden SE Linux-Regeln an die vorhandene Datei file_contents
im Ordner /system/sepolicy/vendor
an:
Upgrade des Kerneltreibers
Auf Geräten, die auf Android 12 aktualisiert werden, ist möglicherweise eine ältere Version des IncFS-Treibers installiert. Für diese Geräte empfiehlt AOSP, den IncFS-Treiber aus folgenden Gründen auf die aktuelle Version (in diesem Fall v2) zu aktualisieren:
- Die mit Android 11 veröffentlichte Version ist die erste Implementierung von IncFS, die nur für die ADB-Installation vorgesehen ist.
- Android 12 verwendet den IncFS-Treiber für Streaming-Installationen von Play-Spielen. Dafür sind die neuen Funktionen und Optimierungen von IncFS v2 erforderlich, um die Nutzerfreundlichkeit zu verbessern.
- V1 unterstützt das Streaming von Spielen, allerdings mit Leistungseinbußen und einem höheren Akku-, CPU- und Arbeitsspeicherverbrauch als V2.
- V2 bietet eine verbesserte Nutzerfreundlichkeit für das Streaming mit flüssigen Fortschrittsanimationen, einer genauen Berichterstellung zur Festplattenspeichernutzung und der Verhinderung von Störungen durch das Streaming von Drittanbieter-Apps.
Wenn Sie den IncFS-Treiber in Ihrem Kernel aktualisieren möchten, wenden Sie die folgenden Patches für Kernel 4.14 oder Kernel 4.19 an:
- Kernel 4.14-Patch
- Kernel 4.19-Patch
Für alle anderen benutzerdefinierten Kernelversionen müssen Sie eines der Patchsets portieren. Sie wirken sich nur auf das Verzeichnis fs/incfs
aus und lassen sich problemlos auf den vorhandenen V1-Code anwenden.
- Korrektur für Kernel 4.14 für V1-Treiber
- Korrektur für Kernel 4.19 für v1-Treiber
- Korrektur für Kernel 5.4 für v1-Treiber
Verwenden Sie den IncFS-Treiber weiterhin wie für das ursprüngliche, aber jetzt auf Android 11 aktualisierte Gerät, entweder als integrierten Teil des Kernel-Images oder als separates Modul. Ändern Sie nicht die Konfiguration der Systemplatine oder der Systemeigenschaft.
Neue Geräte, die ein GKI-Kernel-Image verwenden, erhalten automatisch den neuesten (v2) IncFS-Treiber, der als Teil des Kernel-Images konfiguriert ist. Dazu sind keine zusätzlichen Schritte erforderlich.
Die Konfiguration für ladbare Module wurde in Android 12 eingestellt und wird auf neuen Geräten nicht unterstützt. Dies ist nur für Upgrades oder für das Einfrieren von Anbieter-Images zulässig, wenn der ursprüngliche Kernel bereits als Modul erstellt wurde.
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)- Kernelmodul-Prebuilts hinzufügen
- Systemeigenschaftsänderung für Kernelmodul auf dem Gerät hinzufügen und aktivieren
- SE Linux-Regeln aktualisieren
Validierung und Tests
Implementierung mit Feature-Unittests, CTS und GTS validieren
CTS
CtsIncrementalInstallHostTestCases
verwenden.
GTS
atest GtsIncrementalInstallTestCases
:
/gts-tests/tests/packageinstaller/incremental/src/com/google/android/packageinstaller/incremental/gts/IncrementalInstallerTest.java
IncFS testen
- Richten Sie eine Entwicklungsumgebung ein.
- Führen Sie die im Implementierungsabschnitt 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
IncFS mit dem Android SDK testen (ADB und apksigner)
- Richten Sie eine Entwicklungsumgebung ein.
- Führen Sie die im Implementierungsabschnitt beschriebenen Implementierungsaufgaben aus.
- Spiele den Build auf ein physisches Zielgerät oder einen Emulator.
- Erstellen Sie ein APK oder verwenden Sie ein vorhandenes.
- Debug-Signierschlüssel erstellen
- Signieren Sie das APK mit dem Signaturformat v4 aus dem Ordner
build-tools
../apksigner sign --ks debug.keystore game.apk
- Installieren Sie die APK-Datei auf dem Gerät aus dem Ordner
platform-tools
../adb install game.apk

Diese Tests finden
- /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