Das in Android 11 eingeführte Kernelmodul für das inkrementelle Dateisystem (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 auf dem vorhandenen Android-Dateisystem basiert. Dies ergänzt Änderungen im Framework und SDK, damit App- und Spieleentwickler große APKs über die ADB auf einem Gerät mit Android 11 oder höher bereitstellen können.
Die Kerneländerung ermöglicht ein neues APK-Signaturschema v4 und unterstützt Änderungen am Android-Framework 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 Kerneltreiber als Modul erstellt wird, 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 Kerneltreibers auf Android 12 finden Sie unter Kerneltreiber-Upgrade.
Der Kerneltreiber ist Teil eines größeren Systems, das gestreamte APK-Installationen ermöglicht. OEMs und Anbieter müssen nicht den genauen IncFS-Code verwenden, der in den Beispielimplementierungen bereitgestellt wird. Um jedoch eine einheitliche Nutzererfahrung auf allen Geräten zu gewährleisten, muss die API-Implementierung ein Dateisystem mit Funktionen zum Lesen von Dateien und zum Lesen und Schreiben von Verzeichnissen haben, wie in der Dokumentation zur Userspace-Schnittstelle für das inkrementelle Dateisystem definiert.
Außerdem müssen Implementierungen Mount-Optionen und spezielle Dateien haben, die funktional mit der IncFS-Beispielimplementierung übereinstimmen.
Im Folgenden sind die für die Implementierung erforderlichen Änderungen aufgeführt:
- Richten Sie die Entwicklungsmaschine ein, um den Kernel zu erstellen.
- Richten Sie den gemeinsamen Kernel aus dem Branch
common-android-mainlineaus.repo init -u https://android.googlesource.com/kernel/manifest -b common-android-mainlinerepo sync - Prüfen Sie, ob die folgenden für das IncFS erforderlichen Änderungen 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
- Hängen Sie entweder
CONFIG_INCREMENTAL_FS=yoder _nur für Android 11_,CONFIG_INCREMENTAL_FS=munten an diedefconfig-Datei an. Ein Beispiel finden Sie unter einem der folgenden Links: - Erstellen Sie den Kernel.
- Binden Sie den Kernel in den Android-Geräte-Image-Build ein.
- Hängen Sie für Ihr Android-Zielgerät eine der folgenden anbieterspezifischen
Systemzeilen an Ihre
device.mkDatei (optional auf Geräten mit Android 12 und höher) an: PRODUCT_PROPERTY_OVERRIDES += \ro.incremental.enable=yesPRODUCT_PROPERTY_OVERRIDES += \ro.incremental.enable=module:/vendor/lib/modules/incrementalfs.ko- Beispielhafte
device.mkDateien finden Sie für den Android-Emulator und Pixel 4. - Nur für Android 11: Wenn Sie
CONFIG_INCREMENTAL_FS=mverwenden, fügen Sie SE Linux-Regeln hinzu. vold.teallow 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. - Treiber für das inkrementelle Dateisystem
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\.kou:object_r:vendor_incremental_module:s0
Wenn Sie CONFIG_INCREMENTAL_FS=y verwenden, hängen Sie eine der folgenden Zeilen an die Datei an:
Wenn Sie CONFIG_INCREMENTAL_FS=m verwenden (nur für Android 11), hängen Sie eine der folgenden Zeilen an die Datei an:
Erstellen Sie eine vold.te-Datei und fügen Sie sie mit dem folgenden Inhalt dem Ordner
/system/sepolicy/vendor Ihres Geräts hinzu:
Erlauben Sie das Laden des Treibers für das inkrementelle Dateisystem:
Hängen Sie die folgenden SE Linux-Regeln an die vorhandene file.te Datei
im Ordner /system/sepolicy/vendor an:
Hängen Sie die folgenden SE Linux-Regeln an die vorhandene file_contents
-Datei im Ordner /system/sepolicy/vendor an:
Kerneltreiber-Upgrade
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 Version 2) zu aktualisieren:
- Die mit Android 11 veröffentlichte Version ist die erste Implementierung des IncFS, die nur für die ADB-Installationsunterstützung vorgesehen ist.
- Android 12 verwendet den IncFS-Treiber für Streaming-Installationen von Play-Spielen. Dazu sind die neuen Funktionen und Optimierungen von IncFS Version 2 erforderlich, um die Nutzererfahrung zu verbessern.
- Version 1 unterstützt das Game-Streaming, aber mit Leistungseinbußen und höherem Akku-, CPU- und RAM-Verbrauch als Version 2.
- Version 2 bietet eine verbesserte Nutzererfahrung für das Streaming mit reibungslosen Fortschrittsanimationen, genauen Berichten zur Festplattenspeichernutzung und der Vermeidung von Streaming-Interferenzen durch 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:
Für alle anderen benutzerdefinierten Kernelversionen portieren Sie eines der Patchsets. Sie
wirken sich nur auf das Verzeichnis fs/incfs aus und lassen sich problemlos auf den
vorhandenen Version-1-Code anwenden.
- Fehlerbehebung für Kernel 4.14 für Version-1-Treiber
- Fehlerbehebung für Kernel 4.19 für Version-1-Treiber
- Fehlerbehebung für Kernel 5.4 für Version-1-Treiber
Verwenden Sie den IncFS-Treiber weiterhin auf dieselbe 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 die Konfiguration der Systemplatine oder der Systemeigenschaften nicht.
Auf neuen Geräten mit einem GKI-Kernel-Image wird automatisch der neueste (Version 2) IncFS-Treiber als Teil des Kernel-Images konfiguriert. Dazu sind keine zusätzlichen Schritte erforderlich.
Die Konfiguration für ladbare Module wurde in Android 12 eingestellt und wird für neue Geräte nicht unterstützt. Sie ist nur für Upgrades oder für das Einfrieren eines 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 (für Android 11 nur) als ladbares Modul betrachtet werden.
Ladbares Modul (Pixel 4-Gerät)- Kernelmodul-Prebuilts hinzufügen
- Änderung der Kernelmodul-Systemeigenschaft auf dem Gerät hinzufügen und aktivieren
- SE Linux-Regeln aktualisieren
Überprüfung und Tests
Überprüfen Sie die Implementierung mit Feature-Unittests, CTS und GTS.
CTS
Verwenden Sie
CtsIncrementalInstallHostTestCases.
GTS
atest GtsIncrementalInstallTestCases:
/gts-tests/tests/packageinstaller/incremental/src/com/google/android/packageinstaller/incremental/gts/IncrementalInstallerTest.javaIncFS testen
- Richten Sie eine Entwicklungsumgebung ein.
- Führen Sie die im Abschnitt zur 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
IncFS mit Android SDK testen (ADB und apksigner)
- Richten Sie eine Entwicklungsumgebung ein.
- Führen Sie die im Abschnitt zur Implementierung beschriebenen Implementierungsaufgaben aus.
- Flashen Sie den Build auf einem physischen Zielgerät oder Emulator.
- Generieren Sie eine APK oder rufen Sie eine vorhandene ab.
- Erstellen Sie einen Signaturschlüssel für das Debugging.
- Signieren Sie die APK mit dem Signaturformat v4 aus dem Ordner
build-tools../apksigner sign --ks debug.keystore game.apk
- Installieren Sie die APK 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