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:
- Skonfiguruj maszynę programistyczną do zbudowania jądra.
- 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
- Sprawdź, czy w kasie oddziału znajdują się następujące zmiany potrzebne dla IncFS:
- https://android-review.googlesource.com/c/kernel/common/+/1222869/
- https://android-review.googlesource.com/c/kernel/common/+/1222870
- https://android-review.googlesource.com/c/kernel/common/+/1222871
- https://android-review.googlesource.com/q/%2522ANDROID:+Przyrostowy+fs:%2522+branch:android-mainline+status:merg
- Dołącz
CONFIG_INCREMENTAL_FS=y
lub tylko w przypadku Androida 11CONFIG_INCREMENTAL_FS=m
na dole plikudefconfig
. Aby zobaczyć przykład, kliknij jeden z poniższych linków: - Zbuduj jądro
- Osadź jądro w kompilacji obrazu urządzenia z Androidem .
- 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 ): -
PRODUCT_PROPERTY_OVERRIDES += \
-
ro.incremental.enable=yes
-
PRODUCT_PROPERTY_OVERRIDES += \
-
ro.incremental.enable=module:/vendor/lib/modules/incrementalfs.ko
- Zobacz przykładowe pliki
device.mk
dla emulatora Androida i Pixela 4 . - Tylko dla Androida 11 : Jeśli używasz
CONFIG_INCREMENTAL_FS=m
, dodaj reguły SE Linux . -
vold.te
-
allow vold self:capability sys_module;
-
allow vold vendor_incremental_module:file r_file_perms;
-
allow vold vendor_incremental_module:system module_load;
- plik
file.te
— przykład można znaleźć w plikufile.te
) - Przyrostowy sterownik systemu plików
-
type vendor_incremental_module, vendor_file_type, file_type;
- plik
file_contents
— przykład zobacz ten plikfile_contents
. -
# Incremental file system driver
-
/vendor/lib/modules/incrementalfs\.ko
-
u:object_r:vendor_incremental_module:s0
Kiedy używasz CONFIG_INCREMENTAL_FS=y
, dołącz plik jednym z poniższych:
Jeśli używasz CONFIG_INCREMENTAL_FS=m
( tylko dla Androida 11 ), dołącz plik z jednym z poniższych:
Utwórz i dodaj plik vold.te
do folderu /system/sepolicy/vendor
na swoim urządzeniu z następującą zawartością:
Zezwól na załadowanie przyrostowego sterownika systemu plików:
Dołącz następujące reguły SE Linux do istniejącego pliku file.te
znajdującego się w folderze /system/sepolicy/vendor
:
Dołącz następujące reguły SE Linux do istniejącego pliku file_contents
znajdującego się w folderze /system/sepolicy/vendor
:
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 w celu zapewnienia lepszej obsługi.
- 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:
- Łatka dla jądra 4.14
- Łatka dla 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.
- Poprawka jądra 4.14 do sterownika v1
- Poprawka jądra 4.19 do sterownika v1
- Poprawka jądra 5.4 do sterownika 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)- Dodaj gotowe moduły jądra
- Dodaj i włącz zmianę właściwości systemu modułu jądra na urządzeniu
- Zaktualizuj reguły SE Linux
Walidacja i testowanie
Zweryfikuj wdrożenie za pomocą testów jednostkowych funkcji, CTS i GTS.
CTS
UżyjCtsIncrementalInstallHostTestCases
.GTS
atest GtsIncrementalInstallTestCases
:
/gts-tests/tests/packageinstaller/incremental/src/com/google/android/packageinstaller/incremental/gts/IncrementalInstallerTest.java
Przetestuj IncFS
- Skonfiguruj środowisko programistyczne.
- Wykonaj zadania wdrożeniowe opisane w części poświęconej wdrażaniu.
- 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

Znajdź te testy
- /Android/kernel/common/tools/testing/selftests/filesystems/incfs/
- /Android/system/inkrementalna_delivery/incfs/tests/incfs_test.cpp
- /android/cts/tests/tests/content/src/android/content/pm/cts/PackageManagerShellCommandInkrementalnyTest.java