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

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

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

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

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

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

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

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

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

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

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

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

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

Подтвердите реализацию с помощью функционального модульного тестирования, 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. Пример установки

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