Подразделения товара

В Android 9 и более поздних версий поддерживается создание разделов product с помощью системы сборки Android. Ранее в Android 8.x компоненты, относящиеся к однокристальной системе, были отделены от раздела system и перенесены в раздел vendor. При этом не было выделено место для компонентов, относящихся к OEM-производителю и созданных в системе сборки Android. В Android 9 и более поздних версиях есть дополнительные разрешения и функции белого списка, которые применяются к привилегированным приложениям в разных разделах.

Разделы товаров

Многие производители оригинального оборудования настраивают системный образ AOSP, чтобы реализовать собственные функции и требования операторов связи. Однако из-за таких настроек невозможно использовать один образ системы для нескольких SKU программного обеспечения. Каждое изображение должно быть уникальным, чтобы поддерживать настройки, например для разных регионов или операторов связи. Использование отдельного раздела product для хранения настроек позволяет использовать один образ системы для нескольких SKU программного обеспечения. (В разделе system размещен общий код, который можно использовать в разных версиях ПО.) Раздел vendor по-прежнему содержит код BSP для однокристальной системы, который может использоваться на нескольких устройствах с такой системой.

У использования отдельных разделов есть недостатки, например необходимость управлять местом на диске (определенный объем должен быть зарезервирован для будущего роста) и поддерживать стабильный двоичный интерфейс приложения (ABI) между разделами. Прежде чем использовать разделы product, проанализируйте свою реализацию AOSP и возможные способы устранения неполадок. Например, некоторые производители оригинального оборудования переразбивают диск устройства во время беспроводного обновления. Google так не делает. Динамическое разделение – хорошее решение для этой задачи.

Разделы товаров и разрешения

В Android 9 и более поздних версиях изменение разрешений и процесса добавления в белый список влияет на то, как вы предоставляете разрешения для приложений с повышенными привилегиями в разделах `product`. Файл permissions.xml должен находиться в том же разделе, что и приложения с привилегиями. Если поместить файл permissions.xml в раздел system для привилегированных приложений, это не распространит разрешения на привилегированные приложения в разделе product, хотя первый раздел является расширением второго. Подробнее о разрешениях и добавлении в белый список привилегированных разрешений…

Устаревший параметр /oem и параметр /product

В зависимости от принудительного применения интерфейса продукта у раздела product есть два типа атрибутов. Кроме того, раздел product отличается от устаревшего раздела oem:

Раздел Атрибуты
oem
  • Не обновляется. Обычно прошивается один раз на заводе.
  • Созданы с небольшими вариациями, например в брендинге и цвете. Разное содержимое разделов oem не означает, что программное обеспечение продукта отличается.
  • Раздел system не зависит от раздела oem. (Раздел oem используется только при обнаружении в нем определенного файла.)
  • Использует только общедоступный API в разделе system.
product
  • Обновляемый
  • Обновляется вместе с образом системы.
  • Создаются для отдельных продуктов или семейств продуктов.
  • Системный раздел может зависеть от product.
  • Можно использовать закрытые API, поскольку они обновляются одновременно.
product (принудительные интерфейсы)
  • Обновляемый
  • Отделено от системного образа.
  • Создаются для отдельных продуктов или семейств продуктов.
  • Раздел system не зависит от раздела product.
  • Не может использовать скрытые API, а только общедоступные и системные API в разделе system.

По этим причинам в Android 9 поддерживается раздел product, но при этом сохраняется поддержка устаревшего раздела oem для устройств, которые от него зависят. Чтобы отделить раздел product от раздела system, в Android 11 поддерживается принудительное применение интерфейсов product.

/компоненты продукта

Раздел product содержит следующие компоненты:

  • Системные свойства для определенного продукта (/product/build.prop)
  • Правила возврата для определенных товаров (/product/overlay/*.apk)
  • Приложения для определенных продуктов (/product/app/*.apk)
  • Системные приложения для определенных устройств (/product/priv-app/*.apk)
  • Библиотеки для отдельных продуктов (/product/lib/*)
  • Библиотеки Java для отдельных продуктов (/product/framework/*.jar)
  • Системные конфигурации Android Framework для определенных продуктов (/product/etc/sysconfig/* и /product/etc/permissions/*)
  • Медиафайлы для определенных продуктов (/product/media/audio/*)
  • Файлы bootanimation для разных продуктов

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

Вы не можете использовать custom_images. В них не поддерживаются следующие функции:

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

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

Раздел product в Android 9 является расширением раздела system. Между разделами product и system существует слабая совместимость ABI, поэтому их необходимо обновить одновременно. ABI должен быть основан на системном SDK. Если системный SDK не охватывает все поверхности API между product и system, производители оборудования должны поддерживать собственные ABI между двумя разделами.

Разделы product и system могут зависеть друг от друга. Однако тесты с общим образом системы (GSI) должны работать правильно без раздела product.

Когда интерфейсы product принудительно применяются, раздел product отделяется от раздела system. Раздел product использует только разрешенные интерфейсы из раздела system.

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

Как реализовать сегментацию товаров

Прежде чем внедрять новый раздел продукта, ознакомьтесь с изменениями, связанными с разделами продуктов, в AOSP. Затем, чтобы настроить product, добавьте следующие флаги платы или сборки продукта:

  • BOARD_USES_PRODUCTIMAGE
  • BOARD_PRODUCTIMAGE_PARTITION_SIZE
  • BOARD_PRODUCTIMAGE_FILE_SYSTEM_TYPE
  • PRODUCT_PRODUCT_PROPERTIES для аккаунта /product/build.prop. Они должны находиться внутри тега $(call inherit-product path/to/device.mk), как в примере PRODUCT_PRODUCT_PROPERTIES += product.abc=ok.

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

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

  • product_specific: true (Android.bp)
  • LOCAL_PRODUCT_MODULE := true (Android.mk)

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

Чтобы защитить раздел product от вредоносного программного обеспечения, включите для него проверку при запуске (AVB), как и для разделов vendor и system. Чтобы включить AVB, добавьте следующие флаги сборки: BOARD_AVB_PRODUCT_ADD_HASHTREE_FOOTER_ARGS.