Модуль ядра Incremental File System (IncFS), представленный в Android 11, позволяет ОС Android получать потоковые APK-файлы через Android Debug Bridge (ADB).
Этот автономный модуль ядра создаёт новую виртуальную файловую систему, которая располагается поверх существующей файловой системы Android. Это дополняет изменения в фреймворке и SDK, позволяя разработчикам приложений и игр развертывать большие APK-файлы через ADB на устройствах под управлением Android 11 и выше.
Изменение ядра включает новый формат схемы подписи APK v4 и поддерживает изменения платформы Android в диспетчере пакетов Android, новые системные службы и изменения в ADB.
Выполнение
Чтобы внедрить IncFS, производители OEM-оборудования и систем на кристалле должны добавить новый драйвер ядра в свои сборки устройств Android.
Только для Android 11 : если драйвер ядра собран как модуль, он загружается по требованию. Если приложения не установлены с помощью инкрементальной установки ADB, устройство не загружает драйвер ядра.
В противном случае, при сборке в составе образа ядра, драйвер всегда загружается. Эта реализация действительна для Android 12 и более поздних версий и может использоваться с Android 11. Информация об обновлении драйвера ядра до Android 12 приведена в разделе Обновление драйвера ядра .
Драйвер ядра является частью более крупной системы, обеспечивающей потоковую установку APK. OEM-производителям и поставщикам не обязательно использовать точный код IncFS, представленный в примерах реализации. Однако для обеспечения единообразия работы на всех устройствах необходимо убедиться, что реализация API имеет файловую систему с функциями чтения файлов и чтения-записи каталогов, как определено в пользовательском интерфейсе для документации Incremental FS .
Кроме того, реализации должны иметь параметры монтирования и специальные файлы , функционально соответствующие реализации примера IncFS.
Ниже перечислены необходимые изменения для внедрения:
- Настройте машину разработки для сборки ядра.
- Используйте общее ядро из ветки
common-android-mainline
.repo init -u https://android.googlesource.com/kernel/manifest -b common-android-mainline
repo sync
- Убедитесь, что в проверке филиала присутствуют следующие изменения, необходимые для 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
- Добавьте
CONFIG_INCREMENTAL_FS=y
или, только для Android 11 ,CONFIG_INCREMENTAL_FS=m
в конец файлаdefconfig
. Чтобы увидеть пример, перейдите по одной из ссылок ниже: - Сборка ядра
- Встроить ядро в сборку образа устройства Android .
- Для вашего целевого устройства Android добавьте одну из следующих строк свойств системы, специфичных для поставщика, в файл
device.mk
( необязательно для устройств, работающих под управлением Android 12 и выше ): -
PRODUCT_PROPERTY_OVERRIDES += \
-
ro.incremental.enable=yes
-
PRODUCT_PROPERTY_OVERRIDES += \
-
ro.incremental.enable=module:/vendor/lib/modules/incrementalfs.ko
- См. примеры файлов
device.mk
для эмулятора Android и Pixel 4 . - Только для Android 11 : если вы используете
CONFIG_INCREMENTAL_FS=m
, добавьте правила 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
- Для примера см. этот файлfile.te
.) - Инкрементный драйвер файловой системы
-
type vendor_incremental_module, vendor_file_type, file_type;
- Файл
file_contents
— для примера см. этот файлfile_contents
. -
# Incremental file system driver
-
/vendor/lib/modules/incrementalfs\.ko
-
u:object_r:vendor_incremental_module:s0
При использовании CONFIG_INCREMENTAL_FS=y
добавьте к файлу одно из следующих значений:
При использовании CONFIG_INCREMENTAL_FS=m
( только для Android 11 ) добавьте к файлу одно из следующих значений:
Создайте и добавьте файл vold.te
в папку /system/sepolicy/vendor
вашего устройства со следующим содержимым:
Разрешите ему загрузить драйвер инкрементной файловой системы:
Добавьте следующие правила SE Linux к существующему файлу file.te
, находящемуся в папке /system/sepolicy/vendor
:
Добавьте следующие правила SE Linux к существующему файлу file_contents
, находящемуся в папке /system/sepolicy/vendor
:
Обновление драйвера ядра
Устройства, обновляемые до Android 12, могут включать в себя более старую версию драйвера IncFS. AOSP рекомендует обновить драйвер IncFS до актуальной версии (в данном случае v2) по следующим причинам:
- Версия, выпущенная вместе с Android 11, представляет собой начальную реализацию IncFS, предназначенную только для поддержки установки ADB.
- Android 12 использует драйвер IncFS для потоковой установки игр Play, что требует новых функций и оптимизаций IncFS v2 для лучшего пользовательского опыта.
- V1 поддерживает потоковую передачу игр, но это приводит к снижению производительности и более высокому использованию батареи, процессора и оперативной памяти, чем v2.
- V2 обеспечивает улучшенный пользовательский интерфейс для потоковой передачи с плавной анимацией хода выполнения, точными отчетами об использовании дискового пространства и предотвращением помех со стороны сторонних приложений при потоковой передаче.
Чтобы обновить драйвер IncFS в вашем ядре, примените следующие исправления для ядра 4.14 или ядра 4.19:
Для всех остальных кастомных версий ядра, пожалуйста, портируйте один из наборов патчей. Они затрагивают только каталог fs/incfs
и применяются к существующему коду v1.
- Исправление ядра 4.14 для драйвера v1
- Исправление ядра 4.19 для драйвера v1
- Исправление ядра 5.4 для драйвера v1
Продолжайте использовать драйвер IncFS так же, как и в оригинальной, но обновлённой версии Android 11, либо как встроенную часть образа ядра, либо как отдельный модуль. Не изменяйте конфигурацию системной платы или системных свойств.
Новые устройства, использующие образ ядра GKI, автоматически получают последний драйвер IncFS (v2), настроенный как часть образа ядра. Это не требует дополнительных действий.
Конфигурация загружаемого модуля устарела в Android 12 и не поддерживается на новых устройствах. Она разрешена только для обновлений или заморозки образа поставщика, если исходное ядро уже содержит её как модуль.
Референтные реализации
Эту реализацию можно рассматривать либо как часть образа ядра, либо ( только для Android 11 ) как загружаемый модуль.
Загружаемый модуль (устройство Pixel 4)- Добавить готовые модули ядра
- Добавление и включение изменения системных свойств модуля ядра на устройстве
- Обновление правил SE Linux
Проверка и тестирование
Проверьте реализацию с помощью Feature Unit Tests, CTS и GTS.
КТС
ИспользуйтеCtsIncrementalInstallHostTestCases
.ГТС
atest GtsIncrementalInstallTestCases
:
/gts-tests/tests/packageinstaller/incremental/src/com/google/android/packageinstaller/incremental/gts/IncrementalInstallerTest.java
Протестируйте IncFS
- Настройте среду разработки.
- Выполните задачи по внедрению, изложенные в разделе «Внедрение».
- Выполните следующие ручные тесты:
mmma system/incremental_delivery/incfs/tests
atest libincfs-test
atest IncrementalServiceTest
atest PackageManagerShellCommandTest
PackageManagerShellCommandIncrementalTest
Тестирование IncFS с Android SDK (ADB и apksigner)
- Настройте среду разработки.
- Выполните задачи по внедрению, изложенные в разделе «Внедрение».
- Записать сборку на целевое физическое устройство или эмулятор.
- Сгенерируйте или получите существующий APK.
- Создайте ключ подписи отладки .
- Подпишите APK с помощью формата подписи v4 из папки
build-tools
../apksigner sign --ks debug.keystore game.apk
- Установите APK на устройство из папки
platform-tools
../adb install game.apk

Найдите эти тесты
- /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