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:
- Skonfiguruj maszynę deweloperską, aby zbudować jądro.
- 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 następujące zmiany, które są potrzebne dla IncFS, znajdują się w kasie oddziału:
- 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:+Incremental+fs:%2522+branch:android-mainline+status:merg
- Dołącz
CONFIG_INCREMENTAL_FS=y
lub tylko dla systemu Android 11 ,CONFIG_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 systemem Android .
- 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 ): -
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 systemu Android 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;
-
file.te
plik — na przykład zobacz plikfile.te
.) - Przyrostowy sterownik systemu plików
-
type vendor_incremental_module, vendor_file_type, file_type;
-
file_contents
file — na przykład zobacz ten plikfile_contents
. -
# Incremental file system driver
-
/vendor/lib/modules/incrementalfs\.ko
-
u:object_r:vendor_incremental_module:s0
Jeśli używasz CONFIG_INCREMENTAL_FS=y
, dołącz do pliku jeden z poniższych:
Jeśli używasz CONFIG_INCREMENTAL_FS=m
( tylko dla Androida 11 ), dołącz do pliku jeden z poniższych:
Utwórz i dodaj plik vold.te
do folderu /system/sepolicy/vendor
na urządzeniu z następującą zawartością:
Pozwól mu załadować przyrostowy sterownik systemu plików:
Dołącz następujące reguły SE Linux do istniejącego pliku file.te
znalezionego w folderze /system/sepolicy/vendor
:
Dołącz następujące reguły SE Linux do istniejącego pliku file_contents
znalezionego w folderze /system/sepolicy/vendor
:
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:
- Łatka jądra 4.14
- Patch 4.19 do jądra
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.
- Poprawka jądra 4.14 do sterownika v1
- Poprawka jądra 4.19 do v1 drivr
- Kernel 5.4 poprawka do sterownika 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)- Dodaj prekompilowane 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 implementację 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.
- Kompletne zadania wdrożeniowe opisane w sekcji wdrożeniowej.
- 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

Znajdź te testy
- /android/jądro/wspólne/narzędzia/testowanie/autotesty/systemy plików/incfs/
- /android/system/incremental_delivery/incfs/tests/incfs_test.cpp
- /android/cts/tests/tests/content/src/android/content/pm/cts/PackageManagerShellCommandIncrementalTest.java