Moduł jądra przyrostowego systemu plików (IncFS) wprowadzony w Androidzie 11 umożliwia systemowi Android odbieranie przesyłanych strumieniowo plików APK przez Android Debug Bridge (ADB).
Ten samodzielny moduł jądra tworzy nowy wirtualny system plików, który znajduje się nad istniejącym systemem plików Androida. Uzupełnia to zmiany w platformie 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 w jądrze umożliwia korzystanie z nowego formatu schematu podpisu plików APK w wersji 4 i obsługuje zmiany w strukturze Androida w Menedżerze pakietów Androida, nowe usługi systemowe i zmiany w ADB.
Implementacja
Aby wdrożyć IncFS, producenci OEM i producenci SoC muszą dodać do kompilacji urządzeń z Androidem nowy sterownik jądra.
Tylko w przypadku Androida 11: jeśli sterownik jądra jest zbudowany jako moduł, jest ładowany na żądanie. Jeśli nie ma aplikacji zainstalowanych za pomocą przyrostowej instalacji ADB, urządzenie nie wczytuje sterownika jądra.
W przeciwnym razie, gdy jest on kompilowany jako część obrazu jądra, sterownik jest zawsze ładowany. Ta implementacja jest prawidłowa w przypadku Androida 12 i nowszych wersji, ale można jej używać też w przypadku Androida 11. Więcej informacji o uaktualnianiu sterownika jądra do Androida 12 znajdziesz w artykule Uaktualnianie sterownika jądra.
Sterownik jądra jest częścią większego systemu, który umożliwia instalowanie strumieniowych plików APK. Producenci OEM i dostawcy nie muszą używać dokładnego kodu IncFS podanego w przykładowych implementacjach. Aby jednak zapewnić spójne działanie na różnych urządzeniach, musisz zadbać o to, aby implementacja interfejsu API miała system plików z funkcją odczytu plików i funkcją odczytu i zapisu katalogów zgodnie z dokumentacją Userspace interface for Incremental FS.
Dodatkowo implementacje muszą mieć opcje montowania i pliki specjalne, które funkcjonalnie odpowiadają przykładowej implementacji IncFS.
Poniżej znajdziesz listę niezbędnych zmian do wdrożenia:
- Skonfiguruj komputer programistyczny, aby skompilować 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 w wersji gałęzi znajdują się te zmiany, które są potrzebne w przypadku 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:+Incremental+fs:%2522+branch:android-mainline+status:merg
- Na dole pliku
defconfig
dodaj znakCONFIG_INCREMENTAL_FS=y
lub (tylko w przypadku Androida 11)CONFIG_INCREMENTAL_FS=m
. Aby zobaczyć przykład, kliknij jeden z linków poniżej: - Kompilowanie jądra
- Osadź jądro w obrazie urządzenia z Androidem.
- W przypadku docelowego urządzenia z Androidem dodaj do pliku
device.mk
jeden z tych wierszy właściwości systemu (opcjonalnie na urządzeniach wprowadzonych na rynek 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
device.mk
pliki dla emulatora Androida i Pixela 4. - Tylko 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
– przykład znajdziesz w tymfile.te
pliku). - Przyrostowy sterownik systemu plików
type vendor_incremental_module, vendor_file_type, file_type;
-
file_contents
– przykład znajdziesz w tymfile_contents
pliku. # 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:
Gdy używasz CONFIG_INCREMENTAL_FS=m
(tylko w przypadku Androida 11), dołącz do pliku jeden z tych elementó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:
Dołącz te reguły SE Linux do istniejącego pliku file.te
znajdującego się w folderze /system/sepolicy/vendor
:
Dołącz te reguły SE Linux do istniejącego pliku file_contents
znajdującego się w folderze /system/sepolicy/vendor
:
Uaktualnienie sterownika jądra
Urządzenia, które przechodzą na Androida 12, mogą zawierać starszą wersję sterownika IncFS. W przypadku tych urządzeń AOSP zaleca zaktualizowanie sterownika IncFS do bieżącej wersji (w tym przypadku v2) z tych powodów:
- Wersja wydana z Androidem 11 to początkowa implementacja IncFS, która jest przeznaczona tylko do obsługi instalacji ADB.
- Android 12 używa sterownika IncFS do instalacji strumieniowych gier w Google Play. Wymaga to nowych funkcji i optymalizacji IncFS w wersji 2, aby zapewnić użytkownikom lepsze wrażenia.
- Wersja 1 obsługuje strumieniowanie gier, ale wiąże się to z mniejszą wydajnością i większym zużyciem baterii, procesora i pamięci RAM niż w przypadku wersji 2.
- Wersja 2 zapewnia lepszą wygodę użytkownika podczas przesyłania strumieniowego dzięki płynnym animacjom postępu, dokładnemu raportowaniu wykorzystania miejsca na dysku i zapobieganiu zakłóceniom przesyłania strumieniowego przez aplikacje innych firm.
Aby uaktualnić sterownik IncFS w jądrze, zastosuj te poprawki w przypadku jądra 4.14 lub 4.19:
W przypadku wszystkich innych wersji jądra niestandardowego przenieś jeden z zestawów poprawek. Dotyczą one tylko katalogu fs/incfs
i można je bez problemu zastosować do istniejącego kodu w wersji 1.
- Poprawka jądra 4.14 w sterowniku v1
- Poprawka w jądrze 4.19 w sterowniku v1
- Poprawka w sterowniku v1 dla jądra 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 osobnego 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 automatycznie otrzymują najnowszy (wersja 2) sterownik IncFS skonfigurowany jako część obrazu jądra. Nie wymaga to dodatkowych czynności.
Konfiguracja modułu z możliwością wczytywania 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 dostawcy, gdy oryginalne jądro miało już wbudowany moduł.
Przykładowe implementacje
Ta implementacja może być traktowana jako część obrazu jądra lub (tylko w przypadku Androida 11) jako moduł, który można wczytać.
Moduł do załadowania (urządzenie Pixel 4)- Dodawanie wstępnie skompilowanych modułów jądra
- Dodawanie i włączanie zmiany właściwości systemowej modułu jądra na urządzeniu
- Aktualizacja reguł SE Linux
Weryfikacja i testowanie
Sprawdź wdrożenie za pomocą testów jednostkowych 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 wdrożeniowe opisane w sekcji dotyczącej wdrażania.
- Przeprowadź te testy ręczne:
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 wdrożeniowe opisane w sekcji dotyczącej wdrażania.
- Wgraj kompilację na docelowe urządzenie fizyczne lub emulator.
- Wygeneruj lub uzyskaj istniejący plik APK.
- Utwórz klucz podpisywania debugowania.
- Podpisz plik APK w formacie 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