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

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

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

  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 .
  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 для лучшего пользовательского опыта.
  • V1 поддерживает потоковую передачу игр, но это приводит к снижению производительности и более высокому использованию батареи, процессора и оперативной памяти, чем v2.
  • V2 обеспечивает улучшенный пользовательский интерфейс для потоковой передачи с плавной анимацией хода выполнения, точными отчетами об использовании дискового пространства и предотвращением помех потоковой передаче со стороны сторонних приложений.

Чтобы обновить драйвер IncFS в вашем ядре, примените следующие исправления для ядра 4.14 или ядра 4.19:

Для всех других кастомных версий ядра, пожалуйста, портируйте один из наборов патчей. Они влияют только на каталог fs/incfs и применяются чисто к существующему коду v1.

Продолжайте использовать драйвер 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 : Пример установки

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