Добавочная файловая система

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

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

Изменение ядра позволяет новому APK Signature схема формата v4 и поддерживает Android рамочные изменения в Android Package Manager, новые системные службы, а также изменения в АБР.

Реализация

Чтобы реализовать IncFS, OEM-производители и производители SoC должны добавить новый драйвер ядра в свои сборки Android-устройств.

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

В противном случае, когда он создается как часть образа ядра, драйвер всегда загружается. Эта реализация действительна для Android 12 и выше, и может быть использована с Android 11. Сведения об обновлении драйвера ядра для Android 12 см обновить драйвер ядра .

Драйвер ядра является частью более крупной системы, позволяющей устанавливать APK-файлы в потоковом режиме. OEM-производителям и поставщикам не нужно использовать точный код IncFS, представленный в примерах реализации. Однако, чтобы обеспечить последовательный опыт на различных устройствах, необходимо обеспечить реализацию API имеет файловую систему , которая имеет файл читаемый функциональность и каталог функциональных возможностей для чтения и записи , как это определено в интерфейсе UserSpace для инкрементного 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. Append либо 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;

    Append следующие правила SE Linux в существующий file.te файл найден в вашей /system/sepolicy/vendor папке:

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

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

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

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

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

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

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

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

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

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

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

Подтвердите реализацию с помощью функциональных модульных тестов, CTS и GTS.

CTS

Использование CtsIncrementalInstallHostTestCases .

GTS

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: пример установки

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