Inkrementelles Dateisystem

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:

  1. Richten Sie die Entwicklungsmaschine ein , um den Kernel zu erstellen.
  2. 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
  3. Überprüfen Sie, ob die folgenden Änderungen, die für IncFS erforderlich sind, im Branch-Checkout enthalten sind:
  4. Hängen Sie entweder CONFIG_INCREMENTAL_FS=y oder (nur für Android 11) CONFIG_INCREMENTAL_FS=m am Ende der defconfig Datei an. Um ein Beispiel anzusehen, klicken Sie auf einen der folgenden Links:
  5. Erstellen Sie den Kernel
  6. Betten Sie den Kernel in den Image-Build des Android-Geräts ein.
  7. 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 ):
  8. Wenn Sie CONFIG_INCREMENTAL_FS=y verwenden, hängen Sie der Datei eines davon an:

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

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

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

    • vold.te

    Erlauben Sie ihm, den inkrementellen Dateisystemtreiber zu 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 in Ihrem Ordner /system/sepolicy/vendor an:

    • 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 “ in Ihrem 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

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:

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.

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

Validierung und Tests

Validieren Sie die Implementierung mithilfe von Feature Unit Tests, CTS und GTS.

CTS

Verwenden Sie CtsIncrementalInstallHostTestCases .

GTS

atest GtsIncrementalInstallTestCases :

/gts-tests/tests/packageinstaller/incremental/src/com/google/android/packageinstaller/incremental/gts/IncrementalInstallerTest.java

Testen Sie das IncFS

  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

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
Abbildung 1 : Installationsbeispiel

Suchen Sie diese Tests