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:
- Skonfiguruj maszynę programistyczną, aby skompilować jąderko.
- 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 gałęzi płatności te zmiany, które są wymagane do obsługi IncFS, znajdują się w gałęzi płatności:
- 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
- Dodaj
CONFIG_INCREMENTAL_FS=y
lub (tylko na Androidzie 11)CONFIG_INCREMENTAL_FS=m
na końcu plikudefconfig
. Aby zobaczyć przykład, kliknij jeden z linków poniżej: - Tworzenie jądra
- Umieszczanie jądra w kompilacji obrazu urządzenia z Androidem.
- 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): 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 w przypadku Androida 11: jeśli używasz
CONFIG_INCREMENTAL_FS=m
, dodaj SE Linux Rules. 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
(np.file.te
). - Sterownik systemu plików przyrostowego
type vendor_incremental_module, vendor_file_type, file_type;
-
Plik
file_contents
– przykładowofile_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 tych elementów:
Jeśli używasz CONFIG_INCREMENTAL_FS=m
(tylko w Androidzie 11), dołącz do pliku jeden z tych plików:
Utwórz plik vold.te
i dodaj go do folderu /system/sepolicy/vendor
na urządzeniu. Plik powinien zawierać te informacje:
Zezwól na wczytanie przyrostowego sterownika systemu plików:
Dodaj te reguły SELinux do istniejącego pliku file.te
w folderze /system/sepolicy/vendor
:
Dodaj te reguły SE Linux do istniejącego pliku file_contents
w folderze /system/sepolicy/vendor
:
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:
- Aktualizacja jądra 4.14
- Aktualizacja 4.19 jądra
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.
- Jądro 4.14 – poprawka do sterownika v1
- Naprawa dotycząca sterownika v1 w jądrze 4.19
- Poprawka dotycząca sterownika v1 w jądrze 5.4
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)- Dodawanie gotowych modułów jądra
- Dodawanie i włączanie zmiany właściwości systemu modułu jądra na urządzeniu
- Aktualizowanie reguł SE Linux
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
- Skonfiguruj środowisko programistyczne.
- Wykonaj zadania związane z wdrożeniem opisane w sekcji dotyczącej wdrożenia.
- 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

Znajdowanie tych testów
- /android/kernel/common/tools/testing/selftests/filesystems/incfs/
- /android/system/incremental_delivery/incfs/tests/incfs_test.cpp
- /android/cts/tests/tests/content/src/android/content/pm/cts/PackageManagerShellCommandIncrementalTest.java