Среда выполнения Context Hub (CHRE)

Смартфоны содержат несколько процессоров, каждый из которых оптимизирован для выполнения различных задач. Однако Android работает только на одном процессоре: процессоре приложений (AP). Точка доступа настроена для обеспечения высокой производительности в случаях использования экрана на экране, таких как игры, но она слишком прожорлива для поддержки функций, которые требуют частых коротких всплесков обработки в течение всего времени, даже когда экран выключен. Меньшие процессоры могут более эффективно справляться с этими рабочими нагрузками, выполняя свои задачи без заметного снижения времени работы от батареи. Однако программные среды в этих маломощных процессорах более ограничены и могут сильно различаться, что затрудняет межплатформенную разработку.

Среда выполнения Context Hub (CHRE) предоставляет общую платформу для запуска приложений на маломощном процессоре с простым, стандартизированным, удобным для встраивания API. CHRE упрощает OEM-производителям устройств и их доверенным партнерам разгрузку обработки с точки доступа, экономит заряд батареи и улучшает различные области взаимодействия с пользователем, а также обеспечивает класс постоянно доступных, контекстно-зависимых функций, особенно тех, которые связаны с применением машин. обучение ощущению окружающего мира.

Ключевые понятия

CHRE — это программная среда, в которой небольшие нативные приложения, называемые nanoapps , выполняются на процессоре с низким энергопотреблением и взаимодействуют с базовой системой через общий CHRE API. Для ускорения правильной реализации API CHRE в AOSP включена эталонная межплатформенная реализация CHRE. Эталонная реализация включает в себя общий код и абстракции базового аппаратного и программного обеспечения через ряд уровней абстракции платформы (PAL). Наноприложения почти всегда привязаны к одному или нескольким клиентским приложениям , работающим в Android, которые взаимодействуют с CHRE и наноприложениями через системные API ContextHubManager с ограниченным доступом.

На высоком уровне можно провести параллели между архитектурой CHRE и Android в целом. Однако есть несколько важных отличий:

  • CHRE поддерживает запуск только наноприложений, разработанных в машинном коде (C или C++); Java не поддерживается.
  • Из-за нехватки ресурсов и ограничений безопасности CHRE не открыт для использования произвольными сторонними приложениями Android. Только доверенные системой приложения могут получить к нему доступ.

Также необходимо провести важное различие между концепцией CHRE и концентратором датчиков. Хотя для реализации концентратора датчиков и CHRE обычно используется одно и то же оборудование, сам CHRE не обеспечивает функциональные возможности датчика, необходимые для HAL датчиков Android . CHRE привязан к HAL Context Hub и действует как клиент сенсорной структуры для конкретного устройства, чтобы получать данные датчиков без участия точки доступа.

Структурная архитектура CHRE

Рисунок 1. Структурная архитектура CHRE

Контекстный концентратор HAL

Уровень аппаратной абстракции Context Hub (HAL) — это интерфейс между платформой Android и реализацией CHRE устройства, определенный в hardware/interfaces/contexthub . Контекстный концентратор HAL определяет API-интерфейсы, с помощью которых платформа Android обнаруживает доступные контекстные концентраторы и их наноприложения, взаимодействует с этими наноприложениями посредством передачи сообщений и позволяет загружать и выгружать наноприложения. Эталонная реализация HAL Context Hub, которая работает с эталонной реализацией CHRE, доступна по адресу system/chre/host .

В случае противоречия между этой документацией и определением HAL приоритет имеет определение HAL.

Инициализация

Когда Android загружается, ContextHubService вызывает функцию HAL getHubs() , чтобы определить, доступны ли какие-либо концентраторы контекста на устройстве. Это блокирующий однократный вызов, поэтому он должен выполняться быстро, чтобы избежать задержки загрузки, и должен возвращать точный результат, поскольку новые концентраторы контекста не могут быть введены впоследствии.

Загрузка и выгрузка наноприложений

Контекстный концентратор может включать в себя набор наноприложений, включенных в образ устройства и загружаемых при запуске CHRE. Они известны как предварительно загруженные наноприложения и должны быть включены в первый возможный ответ на queryApps() .

HAL Context Hub также поддерживает динамическую загрузку и выгрузку наноприложений во время выполнения с помощью loadNanoApp() и unloadNanoApp() . Наноприложения предоставляются HAL в двоичном формате, характерном для аппаратной и программной реализации устройства CHRE.

Если реализация загрузки наноприложения включает его запись в энергонезависимую память, например, во флэш-память, подключенную к процессору, на котором выполняется CHRE, то реализация CHRE всегда должна загружаться с этими динамическими наноприложениями в отключенном состоянии. Это означает, что ни один из кодов nanoapp не выполняется до тех пор, пока через HAL не будет получен запрос enableNanoapp() . Предварительно загруженные наноприложения могут инициализироваться во включенном состоянии.

Контекстный концентратор перезапускается

Хотя CHRE не должен перезапускаться в ходе нормальной работы, может потребоваться восстановление после непредвиденных ситуаций, таких как попытка доступа к несопоставленному адресу памяти. В таких случаях CHRE перезапускается независимо от Android. HAL уведомляет Android об этом с помощью события RESTARTED , которое он должен отправить только после повторной инициализации CHRE до такой степени, что он может принимать новые запросы, такие как queryApps() .

Обзор системы CHRE

CHRE разработан на основе архитектуры, управляемой событиями, где основной единицей вычислений является событие, передаваемое в точку входа обработки событий наноприложения. Хотя структура CHRE может быть многопоточной, данное наноприложение никогда не выполняется из нескольких потоков параллельно. Инфраструктура CHRE взаимодействует с данным наноприложением через одну из трех точек входа наноприложений ( nanoappStart() , nanoappHandleEvent() и nanoappEnd() ) или с помощью обратного вызова, предоставленного в предыдущем вызове API CHRE, а наноприложения взаимодействуют с инфраструктурой CHRE и базовой системы через CHRE API. CHRE API предоставляет набор базовых функций, а также средства для доступа к контекстным сигналам, включая датчики, GNSS, Wi-Fi, WWAN и аудио, и может быть расширен за счет дополнительных возможностей конкретного поставщика для использования наноприложениями конкретного поставщика. .

Система сборки

В то время как HAL Context Hub и другие необходимые компоненты на стороне AP создаются вместе с Android, код, который выполняется в CHRE, может иметь требования, которые делают его несовместимым с системой сборки Android, например необходимость в специализированной цепочке инструментов. Таким образом, проект CHRE в AOSP предоставляет упрощенную систему сборки на основе GNU Make для компиляции наноприложений и, при необходимости, структуру CHRE в библиотеки, которые можно интегрировать с системой. Производители устройств, добавляющие поддержку CHRE, должны интегрировать поддержку системы сборки для своих целевых устройств в AOSP.

API CHRE написан в соответствии со стандартом языка C99, а эталонная реализация использует ограниченное подмножество C++11, подходящее для приложений с ограниченными ресурсами.

CHRE API

API CHRE представляет собой набор заголовочных файлов C, определяющих программный интерфейс между наноприложением и системой. Он предназначен для обеспечения совместимости кода наноприложений на всех устройствах, поддерживающих CHRE, а это означает, что исходный код наноприложения не нужно модифицировать для поддержки нового типа устройства, хотя его может потребоваться перекомпилировать специально для процессора целевого устройства. набор инструкций или двоичный интерфейс приложений (ABI). Архитектура CHRE и дизайн API также обеспечивают бинарную совместимость наноприложений с различными версиями API CHRE, а это означает, что наноприложение не нужно перекомпилировать для работы в системе, которая реализует другую версию API CHRE по сравнению с целевой API, с которым компилируется nanoapp. Другими словами, если двоичный файл nanoapp запускается на устройстве, поддерживающем CHRE API версии 1.3, и это устройство обновляется для поддержки CHRE API версии 1.4, тот же самый двоичный файл nanoapp продолжает функционировать. Точно так же наноприложение может работать с CHRE API v1.2 и может во время выполнения определять, требуется ли ему функциональность API v1.3 для достижения его функциональности, или может ли оно работать, потенциально с плавным ухудшением функций.

Новые версии CHRE API выпускаются вместе с Android, однако, поскольку реализация CHRE является частью реализации поставщика , версия CHRE API, поддерживаемая на устройстве, не обязательно связана с версией Android.

Сводка версии

Подобно схеме управления версиями Android HIDL , CHRE API использует семантическое управление версиями . Основная версия указывает на двоичную совместимость, а дополнительная версия увеличивается при добавлении функций обратной совместимости. API CHRE включает аннотации исходного кода, чтобы определить, в какой версии введена функция или параметр, например @since v1.1 .

Реализация CHRE также предоставляет версию исправления для конкретной платформы с помощью chreGetVersion() , которая указывает, когда в реализации выполняются исправления ошибок или незначительные обновления.

Версия 1.0 (Андроид 7)

Включает поддержку датчиков и основные функции наноприложений, такие как события и таймеры.

Версия 1.1 (Андроид 8)

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

Версия 1.2 (Андроид 9)

Добавлена ​​поддержка данных от микрофона с низким энергопотреблением, диапазона Wi-Fi RTT, уведомлений о пробуждении/сне точки доступа и других улучшений.

Версия 1.3 (Андроид 10)

Расширены возможности, связанные с данными калибровки датчика, добавлена ​​поддержка сброса пакетных данных датчика по требованию, определен тип датчика обнаружения шага и добавлены дополнительные поля точности для событий определения местоположения GNSS.

Версия 1.4 (Андроид 11)

Добавлена ​​поддержка информации о ячейках 5G, отладочного дампа nanoapp и других улучшений.

Обязательные функции системы

Хотя источники контекстных сигналов, такие как датчики, классифицируются по дополнительным функциональным областям, во всех реализациях CHRE требуется несколько основных функций. Сюда входят базовые системные API, например, для установки таймеров, отправки и получения сообщений клиентам в процессоре приложений, ведения журналов и т. д. Полную информацию смотрите в заголовках API .

В дополнение к основным системным функциям, кодифицированным в API CHRE, существуют также обязательные функции уровня системы CHRE, указанные на уровне HAL Context Hub. Наиболее важным из них является возможность динамической загрузки и выгрузки наноприложений.

Стандартная библиотека C/C++

Чтобы свести к минимуму использование памяти и сложность системы, реализации CHRE должны поддерживать только подмножество стандартных библиотек C и C++ и языковых функций, требующих поддержки во время выполнения. Следуя этим принципам, некоторые функции явно исключены из-за их памяти и/или обширных зависимостей на уровне ОС, а другие — из-за того, что они заменены более подходящими API-интерфейсами CHRE. Хотя это и не исчерпывающий список, следующие возможности не предназначены для использования в наноприложениях:

  • Исключения C++ и информация о типах времени выполнения (RTTI)
  • Поддержка многопоточности стандартной библиотеки, включая заголовки C++11 <thread> , <mutex> , <atomic> , <future>
  • Стандартные библиотеки ввода/вывода C и C++
  • Стандартная библиотека шаблонов C++ (STL)
  • Библиотека стандартных регулярных выражений C++
  • Динамическое выделение памяти с помощью стандартных функций (например, malloc , calloc , realloc , free , operator new ) и других функций стандартной библиотеки, которые по своей сути используют динамическое выделение памяти, таких как std::unique_ptr
  • Локализация и поддержка символов Unicode
  • Библиотеки даты и времени
  • Функции, изменяющие нормальный ход программы, включая <setjmp.h> , <signal.h> , abort , std::terminate .
  • Доступ к среде хоста, включая system , getenv
  • POSIX и другие библиотеки, не включенные в языковые стандарты C99 или C++11.

Во многих случаях эквивалентная функциональность доступна в функциях CHRE API и/или служебных библиотеках. Например, chreLog можно использовать для ведения журнала отладки, предназначенного для системы Android logcat, где более традиционная программа может использовать printf или std::cout .

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

  • Строковые/массивные утилиты: memcmp , memcpy , memmove , memset , strlen
  • Математическая библиотека: часто используемые функции одинарной точности с плавающей запятой:

    • Основные операции: ceilf , fabsf , floorf , fmaxf , fminf , fmodf , roundf , lroundf , remainderf
    • Экспоненциальные/степенные функции: expf , log2f , powf , sqrtf
    • Тригонометрические/гиперболические функции: sinf , cosf , tanf , asinf , acosf , atan2f , tanhf

Хотя некоторые базовые платформы поддерживают дополнительные функции, наноприложение не считается переносимым между реализациями CHRE, если оно не ограничивает свои внешние зависимости функциями API CHRE и утвержденными стандартными библиотечными функциями.

Дополнительные особенности

Для продвижения аппаратного и программного обеспечения API CHRE разделен на области функций, которые считаются необязательными с точки зрения API. Хотя эти функции могут не потребоваться для поддержки совместимой реализации CHRE, они могут потребоваться для поддержки конкретного наноприложения. Даже если платформа не поддерживает данный набор API, наноприложения, которые ссылаются на эти функции, должны иметь возможность создавать и загружать.

Датчики

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

ГНСС

CHRE предоставляет API для запроса данных о местоположении от глобальной навигационной спутниковой системы (GNSS), включая GPS и другие группировки спутников. Сюда входят запросы на периодические исправления местоположения, а также необработанные данные измерений, хотя обе возможности являются независимыми. Поскольку CHRE имеет прямую связь с подсистемой GNSS, мощность снижается по сравнению с запросами GNSS на основе точки доступа, поскольку точка доступа может оставаться в спящем режиме в течение всего жизненного цикла сеанса определения местоположения.

Wi-Fi

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

В CHRE API v1.1 добавлена ​​поддержка Wi-Fi, включая возможность отслеживать результаты сканирования и запускать сканирование по запросу. Эти возможности были расширены в версии 1.2 за счет возможности измерения времени приема-передачи (RTT) для точек доступа, поддерживающих эту функцию, что позволяет точно определять относительное положение.

WWAN

CHRE API предоставляет возможность получать информацию об идентификации соты для обслуживающей соты и ее соседей, которая обычно используется для крупномасштабных целей определения местоположения.

Аудио

CHRE может обрабатывать пакеты аудиоданных с маломощного микрофона, который обычно использует оборудование, используемое для реализации HAL SoundTrigger. Обработка аудиоданных в CHRE позволяет объединить их с другими данными, такими как датчики движения.

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

Справочный код для платформы CHRE включен в AOSP в проекте system/chre , реализованном на C++11. Хотя это и не является обязательным требованием, рекомендуется, чтобы все реализации CHRE основывались на этой кодовой базе, чтобы обеспечить согласованность и ускорить внедрение новых возможностей. Этот код можно рассматривать как аналог базовой платформы Android, поскольку он представляет собой реализацию API-интерфейсов с открытым исходным кодом, которые используют приложения, выступая в качестве основы и стандарта для совместимости. Хотя его можно настраивать и расширять за счет возможностей конкретного поставщика, рекомендуется поддерживать общий код как можно ближе к эталонному. Подобно HAL Android, эталонная реализация CHRE использует различные абстракции платформы, чтобы ее можно было адаптировать к любому устройству, отвечающему минимальным требованиям.

Технические подробности и руководство по переносу см. в файле README , включенном в проект system/chre .