Przyrostowy system plików

Zadbaj o dobrą organizację dzięki kolekcji Zapisuj i kategoryzuj treści zgodnie ze swoimi preferencjami.

Moduł jądra Incremental File System (IncFS) wprowadzony w systemie Android 11 umożliwia systemowi operacyjnemu Android odbieranie przesyłanych strumieniowo pakietów APK przez Android Debug Bridge (ADB).

Ten samodzielny moduł jądra tworzy nowy wirtualny system plików, który znajduje się na szczycie istniejącego systemu plików Android. Uzupełnia to zmiany w strukturze i SDK, aby umożliwić deweloperom aplikacji i gier wdrażanie dużych pakietów APK za pośrednictwem ADB na urządzeniu z systemem Android 11 lub nowszym.

Zmiana jądra włącza nowy format APK Signature Scheme v4 i obsługuje zmiany w strukturze systemu Android w Menedżerze pakietów systemu Android, nowe usługi systemowe i zmiany w ADB.

Realizacja

Aby wdrożyć IncFS, producenci OEM i SoC muszą dodać nowy sterownik jądra do swoich kompilacji urządzeń z systemem Android.

Tylko dla Androida 11 , jeśli sterownik jądra jest zbudowany jako moduł, jest ładowany na żądanie. Jeśli nie ma żadnych aplikacji zainstalowanych za pomocą instalacji przyrostowej ADB, urządzenie nie ładuje sterownika jądra.

W przeciwnym razie, gdy kompiluje się jako część obrazu jądra, sterownik jest zawsze ładowany. Ta implementacja jest ważna dla systemu Android 12 i nowszych oraz może być używana z systemem Android 11 . Aby uzyskać informacje na temat uaktualniania sterownika jądra do systemu Android 12, zobacz Aktualizacja sterownika jądra .

Sterownik jądra jest częścią większego systemu, który umożliwia przesyłanie strumieniowe instalacji APK. Producenci OEM i dostawcy nie muszą używać dokładnego kodu IncFS podanego w przykładowych implementacjach. Aby jednak zapewnić spójne środowisko na różnych urządzeniach, należy upewnić się, że implementacja interfejsu API ma system plików, który ma funkcję odczytu plików i funkcję odczytu i zapisu katalogu, zgodnie z definicją w interfejsie przestrzeni użytkownika dla dokumentacji przyrostowego FS .

Dodatkowo implementacje muszą mieć opcje montowania i specjalne pliki , które funkcjonalnie pasują do przykładowej implementacji IncFS.

Poniżej wymieniono niezbędne zmiany do wdrożenia:

  1. Skonfiguruj maszynę deweloperską, aby zbudować jądro.
  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 następujące zmiany, które są potrzebne dla IncFS, znajdują się w kasie oddziału:
  4. Dołącz CONFIG_INCREMENTAL_FS=y lub tylko dla systemu Android 11 , CONFIG_INCREMENTAL_FS=m na dole pliku defconfig . Aby zobaczyć przykład, kliknij jeden z poniższych linków:
  5. Zbuduj jądro
  6. Osadź jądro w kompilacji obrazu urządzenia z systemem Android .
  7. W przypadku docelowego urządzenia z systemem Android dołącz jeden z następujących wierszy właściwości systemowych specyficznych dla dostawcy do pliku device.mk ( opcjonalnie w systemie Android 12 i nowszych ):
  8. Jeśli używasz CONFIG_INCREMENTAL_FS=y , dołącz do pliku jeden z poniższych:

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

    Jeśli używasz CONFIG_INCREMENTAL_FS=m ( tylko dla Androida 11 ), dołącz do pliku jeden z poniższych:

    • 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 dla systemu Android 11 : jeśli używasz CONFIG_INCREMENTAL_FS=m , dodaj reguły SE Linux .
  11. Utwórz i dodaj plik vold.te do folderu /system/sepolicy/vendor na urządzeniu z następującą zawartością:

    • vold.te

    Pozwól mu załadować przyrostowy sterownik 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;

    Dołącz następujące reguły SE Linux do istniejącego pliku file.te znalezionego w folderze /system/sepolicy/vendor :

    • file.te plik — na przykład zobacz plik file.te .)
    • Przyrostowy sterownik systemu plików
    • type vendor_incremental_module, vendor_file_type, file_type;

    Dołącz następujące reguły SE Linux do istniejącego pliku file_contents znalezionego w folderze /system/sepolicy/vendor :

    • file_contents file — na przykład zobacz ten plik file_contents .
    • # Incremental file system driver
    • /vendor/lib/modules/incrementalfs\.ko
    • u:object_r:vendor_incremental_module:s0

Aktualizacja sterownika jądra

Urządzenia aktualizowane do Androida 12 mogą zawierać starszą wersję sterownika IncFS. W przypadku tych urządzeń firma AOSP zaleca aktualizację sterownika IncFS do aktualnej wersji (w tym przypadku v2) z następujących powodów:

  • Wersja wydana z Androidem 11 jest początkową implementacją IncFS, ukierunkowaną tylko na obsługę instalacji ADB.
  • Android 12 używa sterownika IncFS do strumieniowego przesyłania instalacji gier Play, co wymaga nowych funkcji i optymalizacji IncFS v2 w celu zapewnienia lepszej obsługi.
  • V1 obsługuje przesyłanie strumieniowe gier, ale robi to z karami za wydajność i wyższym zużyciem baterii, procesora i pamięci RAM niż w wersji 2.
  • V2 zapewnia ulepszony UX do przesyłania strumieniowego, z płynnymi animacjami postępu, precyzyjnym raportowaniem wykorzystania miejsca na dysku i zapobieganiem zakłóceniom w przesyłaniu strumieniowym aplikacji innych firm.

Aby zaktualizować sterownik IncFS w jądrze, zastosuj następujące poprawki dla jądra 4.14 lub 4.19:

Dla wszystkich innych niestandardowych wersji jądra proszę przenieść jeden z zestawów poprawek. Wpływają one tylko na katalog fs/incfs i stosują się w sposób czysty do istniejącego kodu v1.

Kontynuuj używanie sterownika IncFS w taki sam sposób, jak w przypadku oryginalnego, ale teraz zaktualizowanego systemu Android 11, jako wbudowanej części obrazu jądra lub jako oddzielny moduł. Nie zmieniaj konfiguracji płyty systemowej ani właściwości systemu.

Nowe urządzenia korzystające z obrazu jądra GKI automatycznie otrzymują najnowszy (v2) sterownik IncFS, skonfigurowany jako część obrazu jądra. Nie wymaga to dodatkowych kroków.

Konfiguracja modułu ładowalnego została wycofana w systemie Android 12 i nie jest obsługiwana na nowych urządzeniach. Jest to dozwolone tylko w przypadku uaktualnień lub zamrożenia obrazu dostawcy, gdy oryginalne jądro zostało już zbudowane jako moduł.

Implementacje referencyjne

Ta implementacja może być traktowana jako część obrazu jądra lub ( tylko dla systemu Android 11 ) jako moduł ładowalny.

Moduł ładowalny (urządzenie Pixel 4) Emulator Androida (jako część obrazu jądra)

Walidacja i testowanie

Zweryfikuj implementację za pomocą testów jednostkowych funkcji, CTS i GTS.

CTS

Użyj CtsIncrementalInstallHostTestCases .

GTS

atest GtsIncrementalInstallTestCases :

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

Przetestuj IncFS

  1. Skonfiguruj środowisko programistyczne.
  2. Kompletne zadania wdrożeniowe opisane w sekcji wdrożeniowej.
  3. Uruchom następujące testy ręczne:
    mmma system/incremental_delivery/incfs/tests
    atest libincfs-test
    atest IncrementalServiceTest
    atest PackageManagerShellCommandTest
    PackageManagerShellCommandIncrementalTest

Jak przetestować IncFS za pomocą Android SDK (ADB i apksigner)

  • Skonfiguruj środowisko programistyczne.
  • Kompletne zadania wdrożeniowe opisane w sekcji wdrożeniowej.
  • Flash kompilację na docelowym urządzeniu fizycznym lub emulatorze.
  • Wygeneruj lub uzyskaj istniejący pakiet APK.
  • Utwórz klucz podpisywania debugowania .
  • Podpisz pakiet APK w formacie podpisu v4 z folderu build-tools .
    ./apksigner sign --ks debug.keystore game.apk
  • Zainstaluj pakiet APK na urządzeniu z folderu platform-tools .
    ./adb install game.apk
Przykład instalacji
Rysunek 1 : Przykład instalacji

Znajdź te testy