Przyrostowy system plików

Moduł jądra Incremental File System (IncFS) wprowadzony w Androidzie 11 umożliwia systemowi Android odbieranie strumieniowych plików APK za pomocą interfejsu Android Debug Bridge (ADB).

Ten samodzielny moduł jądra tworzy nowy wirtualny system plików, który działa na poziomie istniejącego systemu plików Androida. Uzupełnia to zmiany w ramach i pakiecie SDK, które umożliwiają deweloperom aplikacji i gier wdrażanie dużych plików APK za pomocą ADB na urządzeniu z Androidem 11 lub nowszym.

Zmiana jądra umożliwia korzystanie z nowego formatu schematu podpisu plików APK w wersji 4 i obsługuje zmiany w ramach Androida w Menedżerze pakietów Androida, nowe usługi systemowe i zmiany w ADB.

Implementacja

Aby wdrożyć IncFS, producenci OEM i producenci układów SoC muszą dodać nowy sterownik jądra do kompilacji urządzeń z Androidem.

Tylko w przypadku Androida 11: jeśli sterownik jądra został skompilowany jako moduł, jest ładowany na żądanie. Jeśli nie ma żadnych aplikacji zainstalowanych za pomocą cząstkowej instalacji ADB, urządzenie nie wczyta sterownika jądra.

W przeciwnym razie, gdy jest kompilowany jako część obrazu jądra, sterownik jest zawsze ładowany. Ta implementacja jest dostępna w Androidzie 12 lub nowszym i może być używana w Androidzie 11. Informacje o uaktualnianiu sterownika jądra do Androida 12 znajdziesz w artykule Uaktualnianie sterownika jądra.

Sterownik jądra jest częścią większego systemu umożliwiającego instalowanie plików APK z przesyłem strumieniowym. Producenci OEM i dostawcy nie muszą używać kodu IncFS w takiej postaci, w jakiej został on podany w przykładowych implementacjach. Aby jednak zapewnić spójne działanie na różnych urządzeniach, musisz zadbać o to, aby implementacja interfejsu API zawierała system plików z funkcją odczytu plików i funkcją odczytu/zapisu katalogów zgodnie z dokumentacją interfejsu Userspace dla Incremental FS.

Dodatkowo implementacje muszą mieć opcje mountowania i pliki specjalne, które pod względem funkcjonalności odpowiadają implementacji IncFS.

Poniżej znajdziesz listę niezbędnych zmian:

  1. Skonfiguruj maszynę programistyczną, aby skompilować jąderko.
  2. Kieruj na wspólne jądro z gałęzi common-android-mainline.
    repo init -u https://android.googlesource.com/kernel/manifest -b common-android-mainline
    repo sync
  3. Sprawdź, czy w gałęzi płatności te zmiany, które są wymagane do obsługi IncFS, znajdują się w gałęzi płatności:
  4. Dodaj CONFIG_INCREMENTAL_FS=y lub (tylko na Androidzie 11) CONFIG_INCREMENTAL_FS=m na końcu pliku defconfig. Aby zobaczyć przykład, kliknij jeden z linków poniżej:
  5. Tworzenie jądra
  6. Umieszczanie jądra w kompilacji obrazu urządzenia z Androidem.
  7. W przypadku docelowego urządzenia z Androidem dodaj do pliku device.mk jedną z tych linii właściwości systemowych, która jest specyficzna dla danego producenta (opcjonalnie na urządzeniach z Androidem 12 lub nowszym):
  8. Jeśli używasz CONFIG_INCREMENTAL_FS=y, dołącz do pliku jeden z tych elementów:

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

    Jeśli używasz CONFIG_INCREMENTAL_FS=m (tylko w Androidzie 11), dołącz do pliku jeden z tych plików:

    • PRODUCT_PROPERTY_OVERRIDES += \
    • ro.incremental.enable=module:/vendor/lib/modules/incrementalfs.ko
  9. Zobacz przykładowe pliki device.mk dla emulatora Androida i Pixela 4.
  10. Tylko w przypadku Androida 11: jeśli używasz CONFIG_INCREMENTAL_FS=m, dodaj SE Linux Rules.
  11. Utwórz plik vold.te i dodaj go do folderu /system/sepolicy/vendor na urządzeniu. Plik powinien zawierać te informacje:

    • vold.te

    Zezwól na wczytanie przyrostowego sterownika systemu plików:

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

    Dodaj te reguły SELinux do istniejącego pliku file.te w folderze /system/sepolicy/vendor:

    • Plik file.te (np. file.te).
    • Sterownik systemu plików przyrostowego
    • type vendor_incremental_module, vendor_file_type, file_type;

    Dodaj te reguły SE Linux do istniejącego pliku file_contents w folderze /system/sepolicy/vendor:

    • Plik file_contents – przykładowo file_contents.
    • # Incremental file system driver
    • /vendor/lib/modules/incrementalfs\.ko
    • u:object_r:vendor_incremental_module:s0

Aktualizacja sterownika jądra

Urządzenia, które są aktualizowane do Androida 12, mogą mieć starszą wersję sterownika IncFS. W przypadku tych urządzeń AOSP zaleca zaktualizowanie sterownika IncFS do bieżącej wersji (w tym przypadku wersji 2) z tych powodów:

  • Wersja wydana wraz z Androidem 11 jest początkową implementacją IncFS, przeznaczoną tylko do obsługi instalacji ADB.
  • Android 12 używa sterownika IncFS do strumieniowego instalowania gier Play. Aby zapewnić lepsze wrażenia użytkownika, konieczne są nowe funkcje i optymalizacje IncFS 2.
  • Wersja 1 obsługuje strumieniowe przesyłanie gier, ale wiąże się z tym spadkiem wydajności oraz większym zużyciem baterii, procesora i pamięci RAM niż w przypadku wersji 2.
  • Wersja 2 zapewnia ulepszony interfejs do strumieniowego przesyłania danych, płynne animacje postępu, dokładne raportowanie wykorzystania przestrzeni dyskowej oraz zapobieganie zakłóceniom podczas strumieniowego przesyłania danych z aplikacji innych firm.

Aby uaktualnić sterownik IncFS w jądrze, zastosuj te poprawki dla jądra 4.14 lub 4.19:

W przypadku wszystkich innych niestandardowych wersji jądra przeprowadź portowanie jednego z zestawów poprawek. Dotyczą one tylko katalogu fs/incfs i są stosowane tylko do istniejącego kodu w wersji 1.

Nadal używaj sterownika IncFS w taki sam sposób jak w przypadku oryginalnego, ale teraz zaktualizowanego Androida 11, jako wbudowanej części obrazu jądra lub jako oddzielnego modułu. Nie zmieniaj konfiguracji płyty głównej ani właściwości systemu.

Nowe urządzenia korzystające z obrazu jądra GKI otrzymują najnowszy (wersja 2.) sterownik IncFS automatycznie skonfigurowany jako część obrazu jądra. Nie wymaga to żadnych dodatkowych czynności.

Konfiguracja wczytywalnego modułu została wycofana w Androidzie 12 i nie jest obsługiwana na nowych urządzeniach. Jest to dozwolone tylko w przypadku uaktualnień lub zamrożenia obrazu przez dostawcę, gdy oryginalne jądro zawierało już ten moduł.

Implementacje referencyjne

Ta implementacja może być częścią obrazu jądra lub (tylko w Androidzie 11) modułem wczytywalnym.

Moduł do załadowania (urządzenie Pixel 4) Android Emulator (w ramach obrazu jądra)

Weryfikacja i testowanie

Sprawdź implementację za pomocą testów jednostek funkcji, CTS i GTS.

CTS

Użyj konta CtsIncrementalInstallHostTestCases.

GTS

atest GtsIncrementalInstallTestCases:

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

Testowanie IncFS

  1. Skonfiguruj środowisko programistyczne.
  2. Wykonaj zadania związane z wdrożeniem opisane w sekcji dotyczącej wdrożenia.
  3. Wykonaj te ręczne testy:
    mmma system/incremental_delivery/incfs/tests
    atest libincfs-test
    atest IncrementalServiceTest
    atest PackageManagerShellCommandTest
    PackageManagerShellCommandIncrementalTest

Testowanie IncFS za pomocą pakietu Android SDK (ADB i apksigner)

  • Skonfiguruj środowisko programistyczne.
  • Wykonaj zadania związane z wdrożeniem opisane w sekcji dotyczącej wdrożenia.
  • Wgraj kompilację na docelowym urządzeniu fizycznym lub w emulatorze.
  • Wygeneruj lub pobierz istniejący plik APK.
  • Utwórz klucz debugowania.
  • Podpisz plik APK przy użyciu formatu podpisu w wersji 4 z folderu build-tools.
    ./apksigner sign --ks debug.keystore game.apk
  • Zainstaluj plik APK na urządzeniu z folderu platform-tools.
    ./adb install game.apk
Przykład instalacji
Rysunek 1. Przykład instalacji

Znajdowanie tych testów