ConfigStore HAL

В Android 10 ConfigStore HAL использует флаги сборки для хранения значений конфигурации в разделе vendor , а служба в system разделе получает доступ к этим значениям с помощью HIDL (это также верно для Android 9). Однако из-за высокого потребления памяти и сложности использования ConfigStore HAL был признан устаревшим.

HAL ConfigStore остается в AOSP для поддержки устаревших разделов от производителя. На устройствах под управлением Android 10 или более поздней версии surfaceflinger сначала считывает системные свойства; если для элемента конфигурации в `SurfaceFlingerProperties.sysprop` не определено ни одно системное свойство, `surfaceflinger` возвращается к HAL ConfigStore.

В Android 8.0 монолитная ОС Android разделена на общие ( system.img ) и аппаратно-специфичные ( vendor.img и odm.img ) разделы. В результате этого изменения необходимо удалить условную компиляцию из модулей, устанавливаемых в системный раздел, и такие модули должны определять конфигурацию системы во время выполнения (и вести себя по-разному в зависимости от этой конфигурации).

HAL-интерфейс ConfigStore предоставляет набор API для доступа к элементам конфигурации, доступным только для чтения и используемым для настройки платформы Android. На этой странице описывается структура HAL-интерфейса ConfigStore (и почему для этой цели не использовались системные свойства); на других страницах этого раздела подробно описывается интерфейс HAL , реализация сервиса и использование на стороне клиента , все на примере surfaceflinger . Для получения справки по классам интерфейса ConfigStore см. раздел «Добавление классов и элементов интерфейса» .

Почему бы не использовать системные свойства?

Мы рассматривали возможность использования свойств системы, но обнаружили несколько фундаментальных проблем, в том числе:

  • Ограничения на длину значений. Системные свойства имеют жесткие ограничения на длину своих значений (92 байта). Кроме того, поскольку эти ограничения напрямую доступны приложениям Android в виде макросов на языке C, увеличение длины может вызвать проблемы с обратной совместимостью.
  • Отсутствует поддержка типов. Все значения по сути являются строками, и API просто преобразуют строку в int или bool . Другие составные типы данных (например, массив и структура) должны кодироваться/декодироваться клиентами (например, "aaa,bbb,ccc" можно закодировать как массив из трех строк).
  • Перезапись. Поскольку системные свойства, доступные только для чтения, реализованы как свойства, допускающие однократную запись, поставщики/ODM, желающие переопределить определенные в AOSP значения, доступные только для чтения, должны импортировать свои собственные значения, доступные только для чтения, до импорта значений, определенных в AOSP. Это, в свою очередь, приводит к тому, что значения, определенные поставщиком и допускающие перезапись, переопределяются значениями, определенными в AOSP.
  • Требования к адресному пространству. Свойства системы занимают относительно большой объем адресного пространства в каждом процессе. Свойства системы группируются в блоки prop_area фиксированного размера 128 КБ, и все это пространство выделяется для адресного пространства процесса, даже если осуществляется доступ только к одному свойству системы. Это может вызвать проблемы на 32-битных устройствах, где адресное пространство имеет решающее значение.

Мы попытались преодолеть эти ограничения, не жертвуя совместимостью, но по-прежнему беспокоились о том, что системные свойства не предназначены для доступа к элементам конфигурации, доступным только для чтения. В конце концов мы решили, что системные свойства лучше подходят для обмена несколькими динамически обновляемыми элементами по всему Android в режиме реального времени, и что существует необходимость в новой системе, предназначенной для доступа к элементам конфигурации, доступным только для чтения.

Проектирование ConfigStore HAL

Базовая конструкция проста:

Проектирование Configstore HAL

Рисунок 1. Схема HAL ConfigStore.

  • Опишите флаги сборки (в настоящее время используемые для условной компиляции фреймворка) в языке HIDL.
  • Производители и OEM-производители предоставляют значения флагов сборки, специфичные для SoC и устройства, путем реализации сервиса HAL.
  • Измените структуру платформы, чтобы она использовала службу HAL для определения значения элемента конфигурации во время выполнения.

Элементы конфигурации, на которые в настоящее время ссылается фреймворк, включены в версионированный пакет HIDL ( android.hardware.configstore@1.0 ). Производители/OEM предоставляют значения для элементов конфигурации, реализуя интерфейсы в этом пакете, и фреймворк использует эти интерфейсы, когда ему необходимо получить значение для элемента конфигурации.

Вопросы безопасности

Флаги сборки, определенные в одном и том же интерфейсе, подчиняются одной и той же политике SELinux. Если один или несколько флагов сборки должны иметь разные политики SELinux, их необходимо вынести в отдельный интерфейс . Это может потребовать серьезной доработки android.hardware.configstore package поскольку разделенные интерфейсы больше не будут обратно совместимы.