Разделы ODM

В Android 10 поддерживается создание разделов odm с помощью системы сборки Android.

Разделы отслеживания на устройствах

Производители оригинальных разработок (ODM) настраивают пакеты поддержки платформы (BSP) от поставщиков систем на кристалле (SoC) для своих устройств (плат). Это позволяет им реализовывать модули ядра для компонентов, относящихся к плате, демонов, относящихся к плате, или собственных функций на аппаратно-зависимых уровнях (HAL). Они также могут заменять или настраивать компоненты SoC.

В более ранних версиях Android такие настройки не позволяли использовать одно и то же изображение поставщика для устройств с одинаковыми процессорами (или с разными, но из одного семейства). В Android 10 и более поздних версий для настроек можно использовать отдельный раздел odm, что позволяет использовать один образ поставщика для нескольких вариантов оборудования.

Как использовать разделы для продуктов и ODM

В Android 9 добавлена поддержка создания разделов product, что позволяет использовать один образ системы для нескольких SKU программного обеспечения, поставляемых разными образами product.img. Раздел product предназначен для кодов SKU программного обеспечения, а раздел odm – для кодов SKU оборудования.

Благодаря выделенным разделам product и odm вы можете использовать раздел system для размещения общего кода, который будет использоваться в разных SKU ПО, а раздел vendor – для размещения кода BSP, относящегося к SoC, который будет использоваться на разных устройствах с этой SoC.

У использования отдельных разделов есть недостатки, например сложность управления местом на диске (например, вам нужно зарезервировать ограниченный объем пространства для будущего роста). Однако поддержка динамических разделов в Android 10 устраняет проблему с диском и позволяет перераспределять разделы устройства во время беспроводного обновления.

Компоненты ODM

Раздел odm содержит следующие компоненты, относящиеся к ODM (аналогично разделу vendor), перечисленные в таблице ниже.

Компонент, относящийся к ODM Местоположение
Загружаемые модули ядра (LKM) /odm/lib/modules/*.ko
Нативные библиотеки /odm/lib[64]
HAL /odm/lib[64]/hw
SEPolicy /odm/etc/selinux
Данные объекта VINTF /odm/etc/vintf
init.rc файлы /odm/etc/init
Свойства системы /odm/build.prop
Переопределение ресурсов во время выполнения (RRO) /odm/overlay/*.apk
Приложения /odm/app/*.apk
Приложения с привилегиями /odm/priv-app/*.apk
Библиотеки Java /odm/framework/*.jar
Системные конфигурации фреймворка Android /odm/etc/sysconfig/* и /odm/etc/permissions/*

Нет пользовательских образов

Не используйте специальные изображения, поскольку они не поддерживают:

  • Установка модуля в определенный целевой объект. В пользовательские образы можно копировать артефакты, но нельзя установить модуль в определенный раздел, указав целевой раздел как часть правила сборки.
  • Soong custom_images нельзя создать с помощью системы сборки Soong.
  • Беспроводное обновление. Собственные образы используются в качестве образов заводской ПЗУ, которые нельзя обновить по OTA.

Поддерживать ABI между разделами

Раздел odm является расширением раздела vendor. При рассмотрении стабильности двоичного интерфейса приложения (ABI) учитывайте следующую архитектуру.

Поддержка ABI между разделами

Рисунок 1. Поддержание ABI между разделами.

  • Между разделами odm и vendor нет стабильности ABI. Оба раздела должны быть обновлены одновременно.
  • Разделы odm и vendor могут зависеть друг от друга, но раздел vendor должен работать без раздела odm.
  • ABI между odm и system такой же, как и между vendor и system.

Прямое взаимодействие между разделом product и разделом vendor или odm запрещено. (Это обеспечивается политикой SEpolicy.)

Как реализовать разделы для отслеживания конверсий на устройствах

Перед тем как реализовать новый раздел, ознакомьтесь с соответствующими изменениями в AOSP.

Как настроить разделы ODM

Чтобы настроить разделы odm, добавьте следующие флаги сборки:

  • BOARD_ODMIMAGE_PARTITION_SIZE для фиксированного размера раздела
  • PRODUCT_USE_DYNAMIC_PARTITIONS и BOARD_ODMIMAGE_PARTITION_RESERVED_SIZE для размера динамического раздела
  • Тип файловой системы BOARD_ODMIMAGE_FILE_SYSTEM_TYPE, используемый для образа ODM.
  • PRODUCT_ODM_PROPERTIES для /odm/build.prop для использования в $(call inherit-product path/to/device.mk), как в PRODUCT_ODM_PROPERTIES += product.abc=ok

Как установить модуль в раздел ODM

Чтобы установить модуль в раздел odm, используйте следующие флаги сборки:

  • device_specific: true (Android.bp)
  • LOCAL_ODM_MODULE := true (Android.mk)

Как включить проверку при запуске

Чтобы вредоносное программное обеспечение не могло повредить разделы odm, включите для них проверку при запуске Android (AVB) (как для разделов vendor и system).

Чтобы включить AVB, добавьте флаг сборки BOARD_AVB_ODM_ADD_HASHTREE_FOOTER_ARGS. Подробнее о том, как настроить AVB в динамических разделах, рассказывается в статье Изменения в конфигурации AVB.

Раздел /odm обрабатывается так же, как и раздел /vendor.

Чтобы система обрабатывала раздел odm как раздел vendor, замените все заданные в коде ссылки на vendor набором разделов, ориентированных на аппаратное обеспечение (в настоящее время odm и vendor). К заметным местам ссылок на vendor на платформе относятся динамический компоновщик, менеджер пакетов и shell/libc.