Модуль ядра Incremental File System (IncFS), представленный в Android 11, позволяет операционной системе Android принимать потоковые APK-файлы через Android Debug Bridge (ADB).
Этот автономный модуль ядра создает новую виртуальную файловую систему, которая располагается поверх существующей файловой системы Android. Это дополняет изменения в фреймворке и SDK, позволяя разработчикам приложений и игр развертывать большие APK-файлы через ADB на устройствах под управлением Android 11 или выше.
Изменение ядра позволяет использовать новый формат схемы подписи APK v4 , а также поддерживает изменения в фреймворке Android в менеджере пакетов Android, новые системные службы и изменения в ADB.
Выполнение
Для реализации IncFS производителям оборудования и SoC необходимо добавить новый драйвер ядра в сборки своих устройств Android.
Только для Android 11 : если драйвер ядра собран как модуль, он загружается по запросу. Если нет установленных приложений, установленных через инкрементальную установку ADB, устройство не загружает драйвер ядра.
В противном случае, при сборке в составе образа ядра драйвер всегда загружается. Данная реализация действительна для Android 12 и выше и может использоваться с Android 11. Информацию об обновлении драйвера ядра до Android 12 см. в разделе «Обновление драйвера ядра» .
Драйвер ядра является частью более крупной системы, обеспечивающей потоковую установку APK-файлов. Производителям оборудования и поставщикам не обязательно использовать именно тот код IncFS, который представлен в примерах реализаций. Однако для обеспечения единообразного взаимодействия на разных устройствах необходимо убедиться, что реализация API имеет файловую систему с функциями чтения файлов и чтения-записи каталогов, как это определено в документации по пользовательскому интерфейсу для инкрементальной файловой системы .
Кроме того, реализация должна содержать параметры монтирования и специальные файлы , функционально соответствующие примеру реализации IncFS.
Ниже перечислены необходимые изменения для реализации:
- Настройте рабочую машину для сборки ядра.
- Используйте ядро Common из ветки
common-android-mainline.repo init -u https://android.googlesource.com/kernel/manifest -b common-android-mainlinerepo 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
- Добавьте в конец файла
defconfigлибоCONFIG_INCREMENTAL_FS=y, либо, только для Android 11 ,CONFIG_INCREMENTAL_FS=m. Чтобы увидеть пример, перейдите по одной из ссылок ниже: - Собрать ядро
- Встроить ядро в процесс сборки образа устройства 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.tefile.te - Драйвер инкрементальной файловой системы
-
type vendor_incremental_module, vendor_file_type, file_type; -
file_contentsfile - Пример можно посмотреть в этом файле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 Store, что требует новых функций и оптимизаций IncFS v2 для улучшения пользовательского опыта.
- Версия V1 поддерживает потоковую передачу игр, но это приводит к снижению производительности и увеличению потребления заряда батареи, ресурсов процессора и оперативной памяти по сравнению с версией V2.
- Версия V2 обеспечивает улучшенный пользовательский интерфейс для потоковой передачи, включая плавную анимацию прогресса, точные отчеты об использовании дискового пространства и предотвращение помех от потоковой передачи сторонними приложениями.
Для обновления драйвера IncFS в ядре примените следующие патчи для ядра версии 4.14 или 4.19:
Для всех остальных пользовательских версий ядра, пожалуйста, перенесите один из наборов патчей. Они затрагивают только каталог fs/incfs и корректно применяются к существующему коду версии 1.
- Исправление ядра 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.
CTS
Используйте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