Модуль ядра 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-производители и производители SoC должны добавить новый драйвер ядра в свои сборки Android-устройств.
Только для Android 11 , если драйвер ядра построен как модуль, он загружается по запросу. Если через инкрементную установку ADB не установлено никаких приложений, устройство не загружает драйвер ядра.
В противном случае, когда он собирается как часть образа ядра, драйвер загружается всегда. Эта реализация действительна для Android 12 и выше и может использоваться с Android 11 . Сведения об обновлении драйвера ядра до Android 12 см. в разделе Обновление драйвера ядра .
Драйвер ядра является частью более крупной системы, обеспечивающей потоковую установку APK. OEM-производителям и поставщикам не нужно использовать точный код IncFS, представленный в примерах реализации. Однако, чтобы обеспечить единообразие работы на разных устройствах, вы должны убедиться, что реализация API имеет файловую систему с функциями чтения файлов и чтения-записи каталогов, как определено в интерфейсе пользовательского пространства для документации по добавочным 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 обеспечивает улучшенный UX для потоковой передачи, с плавной анимацией прогресса, точными отчетами об использовании дискового пространства и предотвращением вмешательства сторонних приложений в потоковую передачу.
Чтобы обновить драйвер IncFS в ядре, примените следующие исправления для ядра 4.14 или ядра 4.19:
Для всех других пользовательских версий ядра, пожалуйста, портируйте один из наборов исправлений. Они влияют только на каталог fs/incfs
и полностью применяются к существующему коду v1.
- Исправление ядра 4.14 для драйвера v1
- Исправление ядра 4.19 для драйвера v1
- Исправление ядра 5.4 для драйвера v1
Продолжайте использовать драйвер IncFS так же, как и для оригинальной, но теперь обновленной версии Android 11, либо как встроенную часть образа ядра, либо как отдельный модуль. Не изменяйте системную плату или конфигурацию системных свойств.
Новые устройства, использующие образ ядра GKI, автоматически получают последний (v2) драйвер IncFS, настроенный как часть образа ядра. Это не требует дополнительных действий.
Конфигурация загружаемого модуля устарела в Android 12 и не поддерживается для новых устройств. Это разрешено только для обновлений или для замораживания образа поставщика, когда исходное ядро уже было построено как модуль.
Эталонные реализации
Эту реализацию можно рассматривать либо как часть образа ядра, либо ( только для Android 11 ) как загружаемый модуль.
Загружаемый модуль (устройство Pixel 4)- Добавить готовые модули ядра
- Добавить и включить изменение системных свойств модуля ядра на устройстве
- Обновить правила SE Linux
Валидация и тестирование
Подтвердите реализацию с помощью функционального модульного тестирования, 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/система/incremental_delivery/incfs/тесты/incfs_test.cpp
- /android/cts/tests/tests/content/src/android/content/pm/cts/PackageManagerShellCommandIncrementalTest.java