Das in Android 11 eingeführte Incremental File System (IncFS)-Kernelmodul 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 vorhandenen Android-Dateisystem aufsetzt. Dies ergänzt Änderungen im Framework und SDK, um App- und Spieleentwicklern die Bereitstellung großer APKs über die ADB auf einem Gerät mit Android 11 oder höher zu ermöglichen.
Die Kernel-Änderung ermöglicht ein neues APK Signature Scheme 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 über eine inkrementelle ADB-Installation keine Apps installiert sind, 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 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 ein konsistentes Erlebnis auf allen Geräten sicherzustellen, 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 Dokumentation zur Userspace-Schnittstelle für inkrementelles FS definiert.
Darüber hinaus müssen Implementierungen über Mount-Optionen und spezielle Dateien verfügen, die funktional mit der IncFS-Beispielimplementierung übereinstimmen.
Im Folgenden sind die für die Umsetzung notwendigen Änderungen aufgeführt:
- Richten Sie die Entwicklungsmaschine ein , um den Kernel zu erstellen.
- Zielen Sie auf den gemeinsamen Kernel aus dem Zweig
common-android-mainline
.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 Branch-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:+Inkremental+fs:%2522+branch:android-mainline+status:merg
- Hängen Sie entweder
CONFIG_INCREMENTAL_FS=y
oder (nur für Android 11)CONFIG_INCREMENTAL_FS=m
am Ende derdefconfig
Datei an. Um ein Beispiel anzusehen, klicken Sie auf einen der folgenden Links: - Erstellen Sie den Kernel
- Betten Sie den Kernel in den Image-Build des Android-Geräts 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 der Datei eines davon 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 Ihrem 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 Datei file.te
in Ihrem Ordner /system/sepolicy/vendor
an:
Hängen Sie die folgenden SE Linux-Regeln an die vorhandene Datei file_contents
“ in Ihrem Ordner /system/sepolicy/vendor
an:
Kernel-Treiber-Upgrade
Geräte, die auf Android 12 aktualisiert werden, 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 erste 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 ein besseres Benutzererlebnis erfordert.
- V1 unterstützt Spiele-Streaming, allerdings mit Leistungseinbußen und einer höheren Akku-, CPU- und RAM-Auslastung als Version 2.
- V2 bietet eine verbesserte Benutzeroberfläche für das Streaming, mit flüssigen Fortschrittsanimationen, präzisen Berichten zur Speicherplatznutzung und der Verhinderung von Streaming-Störungen durch Apps von Drittanbietern.
Um den IncFS-Treiber in Ihrem Kernel zu aktualisieren, 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 Kernel-Versionen portieren Sie bitte eines der Patchsets. Sie wirken sich nur auf das fs/incfs
Verzeichnis aus und gelten problemlos für den vorhandenen v1-Code.
- Kernel 4.14-Korrektur für v1-Treiber
- Kernel 4.19 wurde auf v1-Treiber korrigiert
- Kernel 5.4-Korrektur für v1-Treiber
Verwenden Sie den IncFS-Treiber weiterhin auf die gleiche Weise wie für das ursprüngliche, aber jetzt aktualisierte Android 11, entweder als integrierter 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 wird. Dies erfordert keine zusätzlichen Schritte.
Die ladbare Modulkonfiguration wurde in Android 12 veraltet und wird für neue Geräte nicht unterstützt. Dies ist nur für Upgrades oder für das Einfrieren eines Anbieter-Images zulässig, wenn es im ursprünglichen 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-Gerät)- Fügen Sie vorgefertigte Kernel-Module hinzu
- Fügen Sie die Systemeigenschaftenänderung des Kernelmoduls auf dem Gerät hinzu und aktivieren Sie sie
- Aktualisieren Sie die SE Linux-Regeln
Validierung und Tests
Validieren Sie die Implementierung mithilfe von 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 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
So testen Sie IncFS mit Android SDK (ADB und apksigner)
- Richten Sie eine Entwicklungsumgebung ein .
- Führen Sie die im Implementierungsabschnitt beschriebenen Implementierungsaufgaben aus.
- Flashen Sie den Build auf einem physischen Zielgerät oder Emulator.
- Generieren oder erwerben Sie ein vorhandenes APK.
- Erstellen Sie einen Debug-Signaturschlüssel .
- Signieren Sie die APK mit dem v4-Signaturformat aus dem
build-tools
Ordner../apksigner sign --ks debug.keystore game.apk
- Installieren Sie die APK auf dem Gerät aus dem Ordner
platform-tools
../adb install game.apk
![Beispiel einer Installation](https://source.android.google.cn/static/docs/core/architecture/images/incfs-incremental-install.png?authuser=6&hl=de)
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