Инкрементная файловая система

Модуль ядра 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.

Ниже перечислены необходимые изменения для реализации:

  1. Настройте машину разработки для сборки ядра.
  2. Нацельтесь на общее ядро ​​из ветки common-android-mainline .
    repo init -u https://android.googlesource.com/kernel/manifest -b common-android-mainline
    repo sync
  3. Убедитесь, что следующие изменения, необходимые для IncFS, находятся в извлечении ветки:
  4. Добавьте CONFIG_INCREMENTAL_FS=y или (только для Android 11) CONFIG_INCREMENTAL_FS=m в нижней части файла defconfig . Чтобы увидеть пример, нажмите одну из ссылок ниже:
  5. Сборка ядра
  6. Встройте ядро ​​в сборку образа устройства Android .
  7. Для вашего целевого устройства Android добавьте одну из следующих строк системных свойств, зависящих от поставщика, в файл device.mk ( необязательно для устройств, запущенных с Android 12 и более поздних версий ):
  8. Когда вы используете CONFIG_INCREMENTAL_FS=y , добавьте к файлу один из них:

    • PRODUCT_PROPERTY_OVERRIDES += \
    • ro.incremental.enable=yes

    Если вы используете CONFIG_INCREMENTAL_FS=m ( только для Android 11 ), добавьте к файлу один из следующих параметров:

    • PRODUCT_PROPERTY_OVERRIDES += \
    • ro.incremental.enable=module:/vendor/lib/modules/incrementalfs.ko
  9. См. примеры файлов device.mk для эмулятора Android и Pixel 4 .
  10. Только для Android 11 : если вы используете CONFIG_INCREMENTAL_FS=m , добавьте SE Linux Rules .
  11. Создайте и добавьте файл vold.te в папку /system/sepolicy/vendor вашего устройства со следующим содержимым:

    • 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;

    Добавьте следующие правила SE Linux в существующий файл file.te , который находится в папке /system/sepolicy/vendor :

    • Файл file.te — пример см. в этом файле file.te )
    • Драйвер инкрементальной файловой системы
    • type vendor_incremental_module, vendor_file_type, file_type;

    Добавьте следующие правила SE Linux в существующий файл file_contents , который находится в вашей папке /system/sepolicy/vendor :

    • Файл file_contents — пример см. в этом файле file_contents .
    • # Incremental file system driver
    • /vendor/lib/modules/incrementalfs\.ko
    • u:object_r:vendor_incremental_module:s0

Обновление драйвера ядра

Устройства, обновляющиеся до 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.

Продолжайте использовать драйвер IncFS так же, как и для исходной, но теперь обновленной версии Android 11, либо как встроенную часть образа ядра, либо как отдельный модуль. Не меняйте конфигурацию системной платы или свойств системы.

Новые устройства, использующие образ ядра GKI, автоматически получают последнюю версию драйвера IncFS (v2), настроенную как часть образа ядра. Это не требует дополнительных действий.

Конфигурация загружаемого модуля устарела в Android 12 и не поддерживается для новых устройств. Это разрешено только для обновлений или заморозки образа поставщика, если исходное ядро ​​уже было построено как модуль.

Эталонные реализации

Эту реализацию можно рассматривать либо как часть образа ядра, либо ( только для Android 11 ) как загружаемый модуль.

Загружаемый модуль (устройство Pixel 4) Эмулятор Android (как часть образа ядра)

Валидация и тестирование

Проверьте реализацию с помощью Feature Unit Tests, CTS и GTS.

КТС

Используйте CtsIncrementalInstallHostTestCases .

ГТС

atest GtsIncrementalInstallTestCases :

/gts-tests/tests/packageinstaller/incremental/src/com/google/android/packageinstaller/incremental/gts/IncrementalInstallerTest.java

Проверьте IncFS

  1. Настройте среду разработки.
  2. Выполните задачи по внедрению, указанные в разделе «Реализация».
  3. Запустите следующие ручные тесты:
    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
Пример установки
Рис. 1. Пример установки.

Найдите эти тесты