Inkrementelles Dateisystem

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:

  1. Richten Sie den Entwicklungscomputer ein, um den Kernel zu erstellen.
  2. 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
  3. Prüfen Sie, ob die folgenden Änderungen, die für IncFS erforderlich sind, im Branch-Checkout vorhanden sind:
  4. Fügen Sie entweder CONFIG_INCREMENTAL_FS=y oder CONFIG_INCREMENTAL_FS=m für nur Android 11 unten in die Datei defconfig ein. Klicken Sie auf einen der folgenden Links, um ein Beispiel aufzurufen:
  5. Kernel erstellen
  6. Bette den Kernel in den Build des Android-Geräte-Images ein.
  7. 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):
  8. Wenn Sie CONFIG_INCREMENTAL_FS=y verwenden, hängen Sie eine der folgenden Optionen an die Datei an:

    • PRODUCT_PROPERTY_OVERRIDES += \
    • ro.incremental.enable=yes

    Wenn Sie CONFIG_INCREMENTAL_FS=m verwenden (nur für Android 11), hängen Sie eine der folgenden Endungen an die Datei an:

    • PRODUCT_PROPERTY_OVERRIDES += \
    • ro.incremental.enable=module:/vendor/lib/modules/incrementalfs.ko
  9. Sehen Sie sich die device.mk-Beispieldateien für den Android-Emulator und das Pixel 4 an.
  10. Nur für Android 11: Wenn Sie CONFIG_INCREMENTAL_FS=m verwenden, fügen Sie SELinux-Regeln hinzu.
  11. Erstellen Sie eine vold.te-Datei und fügen Sie sie dem Ordner /system/sepolicy/vendor auf Ihrem Gerät mit folgendem Inhalt hinzu:

    • vold.te

    Lassen Sie den inkrementellen Dateisystemtreiber laden:

    • allow vold self:capability sys_module;
    • allow vold vendor_incremental_module:file r_file_perms;
    • allow vold vendor_incremental_module:system module_load;

    Hängen Sie die folgenden SE Linux-Regeln an die vorhandene Datei file.te an, die sich im Ordner /system/sepolicy/vendor befindet:

    • file.te-Datei – Ein Beispiel finden Sie in dieser file.te-Datei.)
    • Inkrementeller Dateisystemtreiber
    • type vendor_incremental_module, vendor_file_type, file_type;

    Hängen Sie die folgenden SE Linux-Regeln an die vorhandene Datei file_contents im Ordner /system/sepolicy/vendor an:

    • file_contents-Datei: Ein Beispiel finden Sie in dieser file_contents-Datei.
    • # Incremental file system driver
    • /vendor/lib/modules/incrementalfs\.ko
    • u:object_r:vendor_incremental_module:s0

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:

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.

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) Android Emulator (als Teil des Kernel-Images)

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

  1. Richten Sie eine Entwicklungsumgebung ein.
  2. Führen Sie die im Implementierungsabschnitt beschriebenen Implementierungsaufgaben aus.
  3. 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 Ordnerbuild-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
Beispiel für die Installation
Abbildung 1: Installationsbeispiel

Diese Tests finden