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

Модуль ядра Incremental File System (IncFS), представленный в Android 11, позволяет операционной системе Android принимать потоковые APK-файлы через Android Debug Bridge (ADB).

Этот автономный модуль ядра создает новую виртуальную файловую систему, которая располагается поверх существующей файловой системы Android. Это дополняет изменения в фреймворке и SDK, позволяя разработчикам приложений и игр развертывать большие APK-файлы через ADB на устройствах под управлением Android 11 или выше.

Изменение ядра позволяет использовать новый формат схемы подписи APK v4 , а также поддерживает изменения в фреймворке Android в менеджере пакетов Android, новые системные службы и изменения в ADB.

Выполнение

Для реализации IncFS производителям оборудования и SoC необходимо добавить новый драйвер ядра в сборки своих устройств Android.

Только для Android 11 : если драйвер ядра собран как модуль, он загружается по запросу. Если нет установленных приложений, установленных через инкрементальную установку ADB, устройство не загружает драйвер ядра.

В противном случае, при сборке в составе образа ядра драйвер всегда загружается. Данная реализация действительна для Android 12 и выше и может использоваться с Android 11. Информацию об обновлении драйвера ядра до Android 12 см. в разделе «Обновление драйвера ядра» .

Драйвер ядра является частью более крупной системы, обеспечивающей потоковую установку APK-файлов. Производителям оборудования и поставщикам не обязательно использовать именно тот код IncFS, который представлен в примерах реализаций. Однако для обеспечения единообразного взаимодействия на разных устройствах необходимо убедиться, что реализация API имеет файловую систему с функциями чтения файлов и чтения-записи каталогов, как это определено в документации по пользовательскому интерфейсу для инкрементальной файловой системы .

Кроме того, реализация должна содержать параметры монтирования и специальные файлы , функционально соответствующие примеру реализации IncFS.

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

  1. Настройте рабочую машину для сборки ядра.
  2. Используйте ядро ​​Common из ветки common-android-mainline .
    repo init -u https://android.googlesource.com/kernel/manifest -b common-android-mainline
    repo sync
  3. Убедитесь, что следующие изменения, необходимые для IncFS, внесены в репозиторий:
  4. Добавьте в конец файла defconfig либо CONFIG_INCREMENTAL_FS=y , либо, только для Android 11 , CONFIG_INCREMENTAL_FS=m . Чтобы увидеть пример, перейдите по одной из ссылок ниже:
  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 - Пример можно посмотреть в этом файле 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 Store, что требует новых функций и оптимизаций IncFS v2 для улучшения пользовательского опыта.
  • Версия V1 поддерживает потоковую передачу игр, но это приводит к снижению производительности и увеличению потребления заряда батареи, ресурсов процессора и оперативной памяти по сравнению с версией V2.
  • Версия 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.

CTS

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

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