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 eigenständige Kernelmodul erstellt ein neues virtuelles Dateisystem, das über dem vorhandenen Android-Dateisystem liegt. Dies ergänzt die Änderungen am 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.

Durch die Kerneländerung wird ein neues APK-Signaturschema v4-Format aktiviert und Änderungen am Android-Framework im Android Package Manager, neue Systemdienste und Änderungen an der ADB unterstützt.

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 Kernel-Treiber als Modul erstellt wird, wird er bei Bedarf geladen. Wenn keine Apps über eine inkrementelle ADB-Installation installiert wurden, 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, das gestreamte APK-Installationen ermöglicht. OEMs und Anbieter müssen nicht genau den IncFS-Code verwenden, der in den Beispielimplementierungen bereitgestellt wird. Für eine einheitliche Nutzung auf allen Geräten muss die API-Implementierung jedoch ein Dateisystem mit Lese- und Schreibfunktionen für Dateien und Verzeichnisse haben, wie in der Dokumentation Userspace interface for Incremental FS (Benutzerbereichsschnittstelle für inkrementelle Dateisysteme) definiert.

Außerdem müssen Implementierungen Bereitstellungsoptionen und Sonderdateien haben, die funktional mit der IncFS-Beispielimplementierung übereinstimmen.

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 das Targeting auf den gemeinsamen Kernel aus dem common-android-mainline-Branch.
    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 Bezahlvorgang für Ladengeschäfte vorhanden sind:
  4. Fügen Sie unten in der defconfig-Datei entweder CONFIG_INCREMENTAL_FS=y oder nur für Android 11 CONFIG_INCREMENTAL_FS=m hinzu. Klicken Sie auf einen der folgenden Links, um sich ein Beispiel anzusehen:
  5. Kernel erstellen
  6. Bearbeiten Sie den Kernel und fügen Sie ihn in den Build des Android-Geräte-Images ein.
  7. Fügen Sie der Datei device.mk für Ihr Android-Zielgerät eine der folgenden anbieterspezifischen Zeilen für Systemeigenschaften hinzu (optional auf Geräten, die mit Android 12 oder höher auf den Markt gebracht wurden):
  8. Wenn Sie CONFIG_INCREMENTAL_FS=y verwenden, fügen Sie der Datei eine der folgenden Informationen hinzu:

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

    Wenn Sie CONFIG_INCREMENTAL_FS=m verwenden (nur Android 11), fügen Sie der Datei einen der folgenden Einträge an:

    • PRODUCT_PROPERTY_OVERRIDES += \
    • ro.incremental.enable=module:/vendor/lib/modules/incrementalfs.ko
  9. Sehen Sie sich die Beispieldevice.mk-Dateien für den Android-Emulator und Google Pixel 4 an.
  10. Nur für Android 11: Wenn Sie CONFIG_INCREMENTAL_FS=m verwenden, fügen Sie SE Linux-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 file.te-Datei im Ordner /system/sepolicy/vendor an:

    • file.te-Datei (Beispiel: file.te-Datei)
    • Incremental File System Driver
    • type vendor_incremental_module, vendor_file_type, file_type;

    Hängen Sie die folgenden SE Linux-Regeln an die vorhandene file_contents-Datei 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

Kernel-Treiber-Upgrade

Auf Geräten, die auf Android 12 umgestellt 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 von IncFS, die nur für die Unterstützung der ADB-Installation gedacht ist.
  • Android 12 verwendet den IncFS-Treiber für die Streaminginstallation von Play-Spielen. Für eine bessere Nutzerfreundlichkeit sind die neuen Funktionen und Optimierungen von IncFS v2 erforderlich.
  • Version 1 unterstützt das Gamestreaming, allerdings mit Leistungseinbußen und einer höheren Akku-, CPU- und RAM-Nutzung als Version 2.
  • V2 bietet eine verbesserte Benutzererfahrung beim Streaming mit flüssigen Fortschrittsanimationen, genauen Berichten zur Festplattennutzung und der Vermeidung von Streaming-Störungen durch Drittanbieter-Apps.

Um den IncFS-Treiber in Ihrem Kernel zu aktualisieren, wenden Sie die folgenden Patches für den Kernel 4.14 oder den Kernel 4.19 an:

Für alle anderen benutzerdefinierten Kernelversionen müssen Sie eines der Patchsets portieren. Sie wirken sich nur auf das fs/incfs-Verzeichnis aus und werden nahtlos auf den vorhandenen V1-Code angewendet.

Der IncFS-Treiber kann weiterhin wie beim ursprünglichen, aber jetzt aktualisierten Android 11 verwendet werden, entweder als integrierter Teil des Kernel-Images oder als separates Modul. Ändern Sie die Konfiguration des Systemboards oder der Systemeigenschaft nicht.

Neue Geräte mit einem GKI-Kernel-Image erhalten automatisch den neuesten IncFS-Treiber (Version 2), der als Teil des Kernel-Images konfiguriert ist. Dazu sind keine zusätzlichen Schritte erforderlich.

Die Konfiguration ladbarer Module wurde in Android 12 eingestellt und wird auf neuen Geräten nicht unterstützt. Sie ist nur für Upgrades oder für ein Anbieter-Image-Freeze zulässig, wenn das Modul bereits im ursprünglichen Kernel enthalten war.

Referenzimplementierungen

Diese Implementierung kann entweder als Teil eines Kernel-Images oder (nur für Android 11) als ladbares Modul betrachtet werden.

Ladbares Modul (Google Pixel 4) Android-Emulator (als Teil des Kernel-Images)

Validierung und Tests

Validieren Sie die Implementierung mithilfe von Funktions-Unittests, CTS und GTS.

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 Abschnitt zur Implementierung 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 (ADB und apksigner) testen

  • Richten Sie eine Entwicklungsumgebung ein.
  • Führen Sie die im Abschnitt zur Implementierung beschriebenen Aufgaben aus.
  • Flashen Sie das Build auf einem Zielgerät oder Emulator.
  • Erstellen oder laden Sie ein vorhandenes APK herunter.
  • Erstellen Sie einen Debug-Signaturschlüssel.
  • Signieren Sie das APK mit dem Signaturformat v4 aus dem Ordnerbuild-tools.
    ./apksigner sign --ks debug.keystore game.apk
  • Installieren Sie das APK auf dem Gerät aus dem Ordner platform-tools.
    ./adb install game.apk
Beispiel für die Installation
Abbildung 1: Installationsbeispiel

Diese Tests finden