Модуль ядра 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 имеет файловую систему, которая имеет функции чтения файлов и функции чтения и записи каталогов, как определено в интерфейсе пользовательского пространства для документации 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 для лучшего взаимодействия с пользователем.
- Версия 1 поддерживает потоковую передачу игр, но при этом наблюдается снижение производительности и более высокая нагрузка на батарею, процессор и оперативную память, чем в версии 2.
- 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.
КТС
Используйте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