Przyrostowy system plików

Moduł jądra przyrostowego systemu plików (IncFS) wprowadzony w systemie Android 11 umożliwia systemowi operacyjnemu Android odbieranie przesyłanych strumieniowo plików APK przez mostek debugowania systemu Android (ADB).

Ten samodzielny moduł jądra tworzy nowy wirtualny system plików, który znajduje się na istniejącym systemie plików Androida. Stanowi to uzupełnienie zmian w frameworku i pakiecie SDK, aby umożliwić twórcom aplikacji i gier wdrażanie dużych plików APK za pośrednictwem ADB na urządzeniu z systemem Android 11 lub nowszym.

Zmiana jądra umożliwia nowy format schematu podpisów APK v4 i obsługuje zmiany struktury Androida w Menedżerze pakietów Androida, 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 wersji urządzeń z Androidem.

Tylko dla Androida 11 , jeśli sterownik jądra jest zbudowany jako moduł, jest ładowany na żądanie. Jeśli w ramach instalacji przyrostowej ADB nie są zainstalowane żadne aplikacje, urządzenie nie ładuje sterownika jądra.

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

Sterownik jądra jest częścią większego systemu umożliwiającego strumieniową instalację plików APK. Producenci OEM i dostawcy nie muszą używać dokładnego kodu IncFS dostarczonego w przykładowych implementacjach. Aby jednak zapewnić spójne działanie na różnych urządzeniach, należy upewnić się, że implementacja interfejsu API ma system plików obsługujący funkcję odczytu plików i funkcję odczytu i zapisu katalogów, zgodnie z definicją w interfejsie przestrzeni użytkownika dla dokumentacji przyrostowego systemu plików .

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

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

  1. Skonfiguruj maszynę programistyczną do zbudowania jądra.
  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 kasie oddziału znajdują się następujące zmiany potrzebne dla IncFS:
  4. Dołącz CONFIG_INCREMENTAL_FS=y lub tylko w przypadku Androida 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 Androidem .
  7. W przypadku docelowego urządzenia z Androidem dołącz jeden z następujących wierszy właściwości systemowych specyficznych dla dostawcy do pliku device.mk ( opcjonalnie w urządzeniach z systemem Android 12 i nowszym ):
  8. Kiedy używasz CONFIG_INCREMENTAL_FS=y , dołącz plik jednym z poniższych:

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

    Jeśli używasz CONFIG_INCREMENTAL_FS=m ( tylko dla Androida 11 ), dołącz plik z jednym 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 Androida 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 swoim urządzeniu z następującą zawartością:

    • vold.te

    Zezwól na załadowanie 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;

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

    • plik file.te — przykład można znaleźć w pliku 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 znajdującego się w folderze /system/sepolicy/vendor :

    • plik file_contents — 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

Aktualizacja urządzeń do systemu Android 12 może obejmować 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 systemem Android 11 jest początkową implementacją IncFS, przeznaczoną wyłącznie do obsługi instalacji ADB.
  • Android 12 korzysta ze sterownika IncFS do strumieniowego przesyłania instalacji gier Play, co wymaga nowych funkcji i optymalizacji IncFS v2, aby zapewnić lepszą wygodę użytkowania.
  • Wersja 1 obsługuje strumieniowanie gier, ale powoduje to spadek wydajności oraz większe zużycie baterii, procesora i pamięci RAM niż wersja 2.
  • Wersja 2 zapewnia ulepszony interfejs użytkownika do przesyłania strumieniowego, z płynnymi animacjami postępu, precyzyjnym raportowaniem wykorzystania miejsca na dysku i zapobieganiem zakłóceniom podczas przesyłania strumieniowego aplikacji innych firm.

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

W przypadku wszystkich innych niestandardowych wersji jądra należy przenieść jeden z zestawów poprawek. Mają one wpływ jedynie na katalog fs/incfs i odnoszą się czysto do istniejącego kodu v1.

Kontynuuj korzystanie ze sterownika IncFS w taki sam sposób, jak w przypadku oryginalnego, ale teraz zaktualizowanego systemu Android 11, albo jako wbudowaną część obrazu jądra, albo 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 sterownik IncFS (v2), skonfigurowany jako część obrazu jądra. Nie wymaga to dodatkowych kroków.

Konfiguracja modułu ładowalnego została przestarzała w systemie Android 12 i nie jest obsługiwana na nowych urządzeniach. Jest to dozwolone tylko w przypadku aktualizacji lub zawieszenia obrazu dostawcy, gdy oryginalne jądro miało już go wbudowanego jako moduł.

Implementacje referencyjne

Tę implementację można uznać za część obrazu jądra lub ( tylko w przypadku Androida 11 ) jako ładowalny moduł.

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

Walidacja i testowanie

Zweryfikuj wdrożenie 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. Wykonaj zadania wdrożeniowe opisane w części poświęconej wdrażaniu.
  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ą zestawu SDK systemu Android (ADB i apksigner)

  • Skonfiguruj środowisko programistyczne.
  • Wykonaj zadania wdrożeniowe opisane w części poświęconej wdrażaniu.
  • Flashuj kompilację na docelowym urządzeniu fizycznym lub emulatorze.
  • Wygeneruj lub uzyskaj istniejący plik APK.
  • Utwórz klucz podpisywania debugowania .
  • Podpisz plik 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