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 auf dem bestehenden Android-Dateisystem aufgesetzt wird. Dies ergänzt Änderungen am Framework und SDK, damit App- und Spieleentwickler große APKs über die ADB auf einem Gerät bereitstellen können, auf dem Android 11 oder höher ausgeführt wird.

Die Kernel-Änderung ermöglicht ein neues APK-Signaturschema 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 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 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 eine konsistente Erfahrung auf allen Geräten zu gewährleisten, 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 Userspace-Schnittstelle für inkrementelle FS- Dokumentation definiert.

Darüber hinaus müssen Implementierungen Mount-Optionen und spezielle Dateien haben, die funktional mit der IncFS-Beispielimplementierung übereinstimmen.

Im Folgenden sind die notwendigen Änderungen zur Umsetzung aufgelistet:

  1. Richten Sie die Entwicklungsmaschine ein , um den Kernel zu erstellen.
  2. Zielen Sie auf den gemeinsamen Kernel aus dem common-android-mainline Zweig ab.
    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 Zweig-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 zu sehen, klicken Sie auf einen der folgenden Links:
  5. Erstellen Sie den Kernel
  6. Betten Sie den Kernel in den Android-Geräte-Image-Build 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 die Datei mit einem der folgenden 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 dem 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 file.te -Datei an, die sich in Ihrem /system/sepolicy/vendor Ordner 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 file_contents -Datei an, die sich in Ihrem /system/sepolicy/vendor Ordner befindet:

    • 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 Kernel-Treibers

Geräte, die auf Android 12 aktualisieren, 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 anfängliche 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 eine bessere Benutzererfahrung erfordert.
  • V1 unterstützt Game-Streaming, jedoch mit Leistungseinbußen und einer höheren Akku-, CPU- und RAM-Auslastung als v2.
  • V2 bietet eine verbesserte UX für das Streaming mit reibungslosen Fortschrittsanimationen, präzisen Berichten zur Speicherplatznutzung und Verhinderung von Streaming-Interferenzen durch Apps von Drittanbietern.

Um den IncFS-Treiber in Ihrem Kernel zu aktualisieren, wenden Sie die folgenden Patches entweder 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 sauber 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 integrierten 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 ist. Dies erfordert keine zusätzlichen Schritte.

Die ladbare Modulkonfiguration ist in Android 12 veraltet und wird für neue Geräte nicht unterstützt. Es ist nur für die Upgrades oder für das Einfrieren eines Anbieter-Images erlaubt, wenn der ursprüngliche Kernel es bereits als Modul gebaut hatte.

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 Prüfung

Validieren Sie die Implementierung mit 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 Abschnitt „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

So testen Sie IncFS mit Android SDK (ADB und apksigner)

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

Suchen Sie diese Tests