Смартфоны содержат несколько процессоров, каждый из которых оптимизирован для выполнения различных задач. Однако Android работает только на одном процессоре: процессоре приложений (AP). Точка доступа настроена на обеспечение высокой производительности в случаях использования с включенным экраном, например в играх, но она слишком энергоемка для поддержки функций, которые постоянно требуют частых коротких всплесков обработки, даже когда экран выключен. Меньшие процессоры способны более эффективно справляться с этими рабочими нагрузками, выполняя свои задачи без заметного влияния на срок службы батареи. Однако программная среда в этих процессорах с низким энергопотреблением более ограничена и может сильно различаться, что затрудняет кроссплатформенную разработку.
Среда выполнения Context Hub (CHRE) предоставляет общую платформу для запуска приложений на маломощном процессоре с простым, стандартизированным и удобным для встраивания API. CHRE позволяет OEM-производителям устройств и их доверенным партнерам легко разгружать обработку с точки доступа, экономить заряд батареи и улучшать различные области взаимодействия с пользователем, а также включать класс постоянно включенных, контекстно-зависимых функций, особенно тех, которые связаны с применением машинного обучения для измерения окружающей среды.
Ключевые понятия
CHRE — это программная среда, в которой небольшие собственные приложения, называемые наноприложениями , выполняются на процессоре с низким энергопотреблением и взаимодействуют с базовой системой через общий API-интерфейс CHRE. Чтобы ускорить правильную реализацию API-интерфейсов CHRE, в AOSP включена кросс-платформенная эталонная реализация CHRE. Эталонная реализация включает общий код и абстракции для базового оборудования и программного обеспечения через ряд уровней абстракции платформы (PAL). Наноприложения почти всегда привязаны к одному или нескольким клиентским приложениям , работающим в Android, которые взаимодействуют с CHRE и наноприложениями через системные API ContextHubManager
с ограниченным доступом.
На высоком уровне можно провести параллели между архитектурой CHRE и Android в целом. Однако есть несколько важных отличий:
- CHRE поддерживает запуск только наноприложений, разработанных на собственном коде (C или C++); Java не поддерживается.
- Из-за ограниченности ресурсов и ограничений безопасности CHRE закрыт для использования произвольными сторонними приложениями Android. Только приложения, которым доверяет система, могут получить к нему доступ.
Также следует провести важное различие между концепцией CHRE и сенсорным концентратором. Хотя для реализации концентратора датчиков и CHRE обычно используется одно и то же оборудование, сам CHRE не обеспечивает возможности датчиков, необходимые для Android Sensors HAL . CHRE привязан к HAL Context Hub и действует как клиент системы датчиков для конкретного устройства, получая данные датчиков без участия точки доступа.
Рисунок 1. Архитектура платформы CHRE
Контекстный хаб HAL
Уровень аппаратной абстракции Context Hub (HAL) — это интерфейс между платформой Android и реализацией CHRE устройства, определенный в hardware/interfaces/contexthub
. HAL Context Hub определяет API, с помощью которых платформа Android обнаруживает доступные контекстные концентраторы и их наноприложения, взаимодействует с этими наноприложениями посредством передачи сообщений и позволяет загружать и выгружать наноприложения. Эталонная реализация HAL Context Hub, которая работает с эталонной реализацией CHRE, доступна по адресу system/chre/host
.
В случае конфликта между этой документацией и определением HAL, определение HAL имеет приоритет.
Инициализация
Когда Android загружается, ContextHubService вызывает функцию HAL getHubs()
чтобы определить, доступны ли на устройстве какие-либо концентраторы контекста. Это блокирующий одноразовый вызов, поэтому он должен завершиться быстро, чтобы избежать задержки загрузки, и должен возвращать точный результат, поскольку новые концентраторы контекста не могут быть добавлены позже.
Загрузка и выгрузка наноприложений
Контекстный концентратор может включать в себя набор наноприложений, которые включаются в образ устройства и загружаются при запуске CHRE. Они известны как предварительно загруженные наноприложения и должны быть включены в первый возможный ответ на queryApps()
.
Context Hub HAL также поддерживает динамическую загрузку и выгрузку наноприложений во время выполнения с помощью функций 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 и базовой системой через API CHRE. API CHRE предоставляет набор базовых возможностей, а также средства для доступа к контекстным сигналам, включая датчики, GNSS, Wi-Fi, WWAN и аудио, и его можно расширить за счет дополнительных возможностей, специфичных для конкретного поставщика, для использования наноприложениями, зависящими от конкретного поставщика.
Система сборки
Хотя HAL Context Hub и другие необходимые компоненты на стороне точки доступа создаются вместе с Android, код, работающий в CHRE, может иметь требования, которые делают его несовместимым с системой сборки Android, например необходимость в специализированной цепочке инструментов. Таким образом, проект CHRE в AOSP предоставляет упрощенную систему сборки на основе GNU Make для компиляции наноприложений и, при необходимости, инфраструктуру CHRE в библиотеки, которые можно интегрировать с системой. Производители устройств, добавляющие поддержку CHRE, должны интегрировать поддержку системы сборки для своих целевых устройств в AOSP.
API CHRE написан в соответствии со стандартом языка C99, а эталонная реализация использует ограниченное подмножество C++11, подходящее для приложений с ограниченными ресурсами.
ЧРЕ API
CHRE API — это набор заголовочных файлов C, которые определяют программный интерфейс между nanoapp и системой. Он предназначен для обеспечения совместимости кода наноприложений на всех устройствах, поддерживающих CHRE. Это означает, что исходный код наноприложения не нужно модифицировать для поддержки нового типа устройства, хотя, возможно, его придется перекомпилировать специально для набора инструкций процессора целевого устройства или двоичного интерфейса приложения (ABI). Архитектура CHRE и дизайн API также гарантируют двоичную совместимость наноприложений с различными версиями API CHRE. Это означает, что наноприложение не нужно перекомпилировать для запуска в системе, которая реализует версию CHRE API, отличную от целевого API, для которого компилируется наноприложение. Другими словами, если двоичный файл nanoapp запускается на устройстве, поддерживающем CHRE API v1.3, и это устройство обновляется для поддержки CHRE API v1.4, тот же двоичный файл nanoapp продолжает работать. Аналогичным образом, наноприложение может работать на CHRE API v1.2 и во время выполнения может определять, требуются ли ему возможности API v1.3 для его использования или оно может работать, потенциально с плавным ухудшением функций.
Новые версии CHRE API выпускаются вместе с Android, однако, поскольку реализация CHRE является частью реализации поставщика , версия CHRE API, поддерживаемая на устройстве, не обязательно связана с версией Android.
Сводка версий
Как и схема управления версиями Android HIDL , API CHRE использует семантическое управление версиями . Основная версия указывает на двоичную совместимость, а дополнительная версия увеличивается при появлении функций обратной совместимости. CHRE API включает аннотации исходного кода, позволяющие определить, в какой версии появилась функция или параметр, например @since v1.1
.
Реализация CHRE также предоставляет версию исправления для конкретной платформы через chreGetVersion()
, которая указывает, когда в реализации вносятся исправления ошибок или незначительные обновления.
Версия 1.0 (Андроид 7)
Включает поддержку датчиков и основных возможностей nanoapp, таких как события и таймеры.
Версия 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
- Поддержка локализации и символов Юникода.
- Библиотеки даты и времени
- Функции, которые изменяют обычный ход программы, включая
<setjmp.h>
,<signal.h>
,abort
,std::terminate
- Доступ к среде хоста, включая
system
,getenv
- POSIX и другие библиотеки, не включенные в языковые стандарты C99 или C++11.
Во многих случаях эквивалентные возможности доступны в функциях API CHRE и служебных библиотеках. Например, chreLog
можно использовать для ведения журнала отладки, предназначенного для системы Android logcat, где более традиционная программа может использовать printf
или std::cout
.
Напротив, требуются некоторые возможности стандартной библиотеки. Реализация платформы должна предоставлять их через статические библиотеки для включения в двоичный файл nanoapp или путем динамического связывания между nanoapp и системой. Это включает, но не ограничивается:
- Утилиты для работы со строками и массивами:
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, наноприложения, ссылающиеся на эти функции, должны иметь возможность создавать и загружать.
Датчики
API CHRE предоставляет возможность запрашивать данные от датчиков, включая акселерометр, гироскоп, магнитометр, датчик внешней освещенности и приближения. Эти API предназначены для предоставления набора функций, аналогичного API-интерфейсам датчиков Android, включая поддержку пакетной обработки образцов датчиков для снижения энергопотребления. Обработка данных датчиков в CHRE позволяет обрабатывать сигналы движения с гораздо меньшим энергопотреблением и меньшей задержкой по сравнению с работой на точке доступа.
ГНСС
CHRE предоставляет API для запроса данных о местоположении из глобальной навигационной спутниковой системы (GNSS), включая GPS и другие группировки спутников. Сюда входят запросы на периодическую фиксацию положения, а также необработанные данные измерений, хотя обе возможности являются независимыми. Поскольку CHRE имеет прямую связь с подсистемой GNSS, мощность снижается по сравнению с запросами GNSS на основе точки доступа, поскольку точка доступа может оставаться в спящем режиме в течение всего жизненного цикла сеанса определения местоположения.
Wi-Fi
CHRE обеспечивает возможность взаимодействия с чипом Wi-Fi, в первую очередь для определения местоположения. Хотя GNSS хорошо работает на открытом воздухе, результаты сканирования Wi-Fi могут предоставить точную информацию о местоположении внутри помещений и в развитых районах. Помимо того, что CHRE позволяет избежать затрат на пробуждение точки доступа для сканирования, она может прослушивать результаты сканирования Wi-Fi, выполняемого прошивкой Wi-Fi, для целей подключения, которые обычно не доставляются на точку доступа по причинам, связанным с питанием. Использование сканирования подключений для контекстуальных целей помогает сократить общее количество выполняемых сканирований Wi-Fi, экономя электроэнергию.
Поддержка Wi-Fi была добавлена в CHRE API v1.1, включая возможность отслеживать результаты сканирования и запускать сканирование по требованию. Эти возможности были расширены в версии 1.2 за счет возможности выполнять измерения времени прохождения туда и обратно (RTT) для точек доступа, поддерживающих эту функцию, что обеспечивает точное определение относительного положения.
WWAN
API CHRE предоставляет возможность получать идентификационную информацию обслуживающей соты и ее соседей, которая обычно используется для целей общего определения местоположения.
Аудио
CHRE может обрабатывать пакеты аудиоданных с маломощного микрофона, который обычно использует оборудование, используемое для реализации SoundTrigger HAL. Обработка аудиоданных в CHRE может позволить объединить их с другими данными, например с датчиками движения.
Эталонная реализация
Справочный код для платформы CHRE включен в AOSP в проект system/chre
, реализованный на C++11. Хотя это и не является строго обязательным, рекомендуется, чтобы все реализации CHRE основывались на этой кодовой базе, чтобы обеспечить согласованность и ускорить внедрение новых возможностей. Этот код можно рассматривать как аналог базовой платформы Android, поскольку он представляет собой реализацию API-интерфейсов с открытым исходным кодом, которые используют приложения, и служит основой и стандартом совместимости. Хотя его можно настроить и расширить за счет возможностей конкретного поставщика, рекомендуется поддерживать общий код как можно ближе к эталонному. Подобно HAL Android, эталонная реализация CHRE использует различные абстракции платформы, что позволяет адаптировать ее к любому устройству, отвечающему минимальным требованиям.
Технические подробности и руководство по портированию см. в README , включенном в проект system/chre
.
Смартфоны содержат несколько процессоров, каждый из которых оптимизирован для выполнения различных задач. Однако Android работает только на одном процессоре: процессоре приложений (AP). Точка доступа настроена на обеспечение высокой производительности в случаях использования с включенным экраном, например в играх, но она слишком энергоемка для поддержки функций, которые постоянно требуют частых коротких всплесков обработки, даже когда экран выключен. Меньшие процессоры способны более эффективно справляться с этими рабочими нагрузками, выполняя свои задачи без заметного влияния на срок службы батареи. Однако программная среда в этих процессорах с низким энергопотреблением более ограничена и может сильно различаться, что затрудняет кроссплатформенную разработку.
Среда выполнения Context Hub (CHRE) предоставляет общую платформу для запуска приложений на маломощном процессоре с простым, стандартизированным и удобным для встраивания API. CHRE позволяет OEM-производителям устройств и их доверенным партнерам легко разгружать обработку с точки доступа, экономить заряд батареи и улучшать различные области взаимодействия с пользователем, а также включать класс постоянно включенных, контекстно-зависимых функций, особенно тех, которые связаны с применением машинного обучения для измерения окружающей среды.
Ключевые понятия
CHRE — это программная среда, в которой небольшие собственные приложения, называемые наноприложениями , выполняются на процессоре с низким энергопотреблением и взаимодействуют с базовой системой через общий API-интерфейс CHRE. Чтобы ускорить правильную реализацию API-интерфейсов CHRE, в AOSP включена кросс-платформенная эталонная реализация CHRE. Эталонная реализация включает общий код и абстракции для базового оборудования и программного обеспечения через ряд уровней абстракции платформы (PAL). Наноприложения почти всегда привязаны к одному или нескольким клиентским приложениям , работающим в Android, которые взаимодействуют с CHRE и наноприложениями через системные API ContextHubManager
с ограниченным доступом.
На высоком уровне можно провести параллели между архитектурой CHRE и Android в целом. Однако есть несколько важных отличий:
- CHRE поддерживает запуск только наноприложений, разработанных на собственном коде (C или C++); Java не поддерживается.
- Из-за ограниченности ресурсов и ограничений безопасности CHRE закрыт для использования произвольными сторонними приложениями Android. Только приложения, которым доверяет система, могут получить к нему доступ.
Также следует провести важное различие между концепцией CHRE и сенсорным концентратором. Хотя для реализации концентратора датчиков и CHRE обычно используется одно и то же оборудование, сам CHRE не обеспечивает возможности датчиков, необходимые для Android Sensors HAL . CHRE привязан к HAL Context Hub и действует как клиент системы датчиков для конкретного устройства, получая данные датчиков без участия точки доступа.
Рисунок 1. Архитектура платформы CHRE
Контекстный хаб HAL
Уровень аппаратной абстракции Context Hub (HAL) — это интерфейс между платформой Android и реализацией CHRE устройства, определенный в hardware/interfaces/contexthub
. HAL Context Hub определяет API, с помощью которых платформа Android обнаруживает доступные контекстные концентраторы и их наноприложения, взаимодействует с этими наноприложениями посредством передачи сообщений и позволяет загружать и выгружать наноприложения. Эталонная реализация HAL Context Hub, которая работает с эталонной реализацией CHRE, доступна по адресу system/chre/host
.
В случае конфликта между этой документацией и определением HAL, определение HAL имеет приоритет.
Инициализация
Когда Android загружается, ContextHubService вызывает функцию HAL getHubs()
чтобы определить, доступны ли на устройстве какие-либо концентраторы контекста. Это блокирующий одноразовый вызов, поэтому он должен завершиться быстро, чтобы избежать задержки загрузки, и должен возвращать точный результат, поскольку новые концентраторы контекста не могут быть добавлены позже.
Загрузка и выгрузка наноприложений
Контекстный концентратор может включать в себя набор наноприложений, которые включаются в образ устройства и загружаются при запуске CHRE. Они известны как предварительно загруженные наноприложения и должны быть включены в первый возможный ответ на queryApps()
.
Context Hub HAL также поддерживает динамическую загрузку и выгрузку наноприложений во время выполнения с помощью функций 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 и базовой системой через API CHRE. API CHRE предоставляет набор базовых возможностей, а также средства для доступа к контекстным сигналам, включая датчики, GNSS, Wi-Fi, WWAN и аудио, и его можно расширить за счет дополнительных возможностей, специфичных для конкретного поставщика, для использования наноприложениями, зависящими от конкретного поставщика.
Система сборки
Хотя HAL Context Hub и другие необходимые компоненты на стороне точки доступа создаются вместе с Android, код, работающий в CHRE, может иметь требования, которые делают его несовместимым с системой сборки Android, например необходимость в специализированной цепочке инструментов. Таким образом, проект CHRE в AOSP предоставляет упрощенную систему сборки на основе GNU Make для компиляции наноприложений и, при необходимости, инфраструктуру CHRE в библиотеки, которые можно интегрировать с системой. Производители устройств, добавляющие поддержку CHRE, должны интегрировать поддержку системы сборки для своих целевых устройств в AOSP.
API CHRE написан в соответствии со стандартом языка C99, а эталонная реализация использует ограниченное подмножество C++11, подходящее для приложений с ограниченными ресурсами.
ЧРЕ API
CHRE API — это набор заголовочных файлов C, которые определяют программный интерфейс между nanoapp и системой. Он предназначен для обеспечения совместимости кода наноприложений на всех устройствах, поддерживающих CHRE. Это означает, что исходный код наноприложения не нужно модифицировать для поддержки нового типа устройства, хотя, возможно, его придется перекомпилировать специально для набора инструкций процессора целевого устройства или двоичного интерфейса приложения (ABI). Архитектура CHRE и дизайн API также гарантируют двоичную совместимость наноприложений с различными версиями API CHRE. Это означает, что наноприложение не нужно перекомпилировать для запуска в системе, которая реализует версию CHRE API, отличную от целевого API, для которого компилируется наноприложение. Другими словами, если двоичный файл nanoapp запускается на устройстве, поддерживающем CHRE API v1.3, и это устройство обновляется для поддержки CHRE API v1.4, тот же двоичный файл nanoapp продолжает работать. Аналогичным образом, наноприложение может работать на CHRE API v1.2 и во время выполнения может определять, требуются ли ему возможности API v1.3 для его использования или оно может работать, потенциально с плавным ухудшением функций.
Новые версии CHRE API выпускаются вместе с Android, однако, поскольку реализация CHRE является частью реализации поставщика , версия CHRE API, поддерживаемая на устройстве, не обязательно связана с версией Android.
Сводка версий
Как и схема управления версиями Android HIDL , API CHRE использует семантическое управление версиями . Основная версия указывает на двоичную совместимость, а дополнительная версия увеличивается при появлении функций обратной совместимости. CHRE API включает аннотации исходного кода, позволяющие определить, в какой версии появилась функция или параметр, например @since v1.1
.
Реализация CHRE также предоставляет версию исправления для конкретной платформы через chreGetVersion()
, которая указывает, когда в реализации вносятся исправления ошибок или незначительные обновления.
Версия 1.0 (Андроид 7)
Включает поддержку датчиков и основных возможностей nanoapp, таких как события и таймеры.
Версия 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
- Поддержка локализации и символов Юникода.
- Библиотеки даты и времени
- Функции, которые изменяют обычный ход программы, включая
<setjmp.h>
,<signal.h>
,abort
,std::terminate
- Доступ к среде хоста, включая
system
,getenv
- POSIX и другие библиотеки, не включенные в языковые стандарты C99 или C++11.
Во многих случаях эквивалентные возможности доступны в функциях API CHRE и служебных библиотеках. Например, chreLog
можно использовать для ведения журнала отладки, предназначенного для системы Android logcat, где более традиционная программа может использовать printf
или std::cout
.
Напротив, требуются некоторые возможности стандартной библиотеки. Реализация платформы должна предоставлять их через статические библиотеки для включения в двоичный файл nanoapp или путем динамического связывания между nanoapp и системой. Это включает, но не ограничивается:
- Утилиты для работы со строками и массивами:
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, наноприложения, ссылающиеся на эти функции, должны иметь возможность создавать и загружать.
Датчики
API CHRE предоставляет возможность запрашивать данные от датчиков, включая акселерометр, гироскоп, магнитометр, датчик внешней освещенности и приближения. Эти API предназначены для предоставления набора функций, аналогичного API-интерфейсам датчиков Android, включая поддержку пакетной обработки образцов датчиков для снижения энергопотребления. Обработка данных датчиков в CHRE позволяет обрабатывать сигналы движения с гораздо меньшим энергопотреблением и меньшей задержкой по сравнению с работой на точке доступа.
ГНСС
CHRE предоставляет API для запроса данных о местоположении из глобальной навигационной спутниковой системы (GNSS), включая GPS и другие группировки спутников. Сюда входят запросы на периодическую фиксацию положения, а также необработанные данные измерений, хотя обе возможности являются независимыми. Поскольку CHRE имеет прямую связь с подсистемой GNSS, мощность снижается по сравнению с запросами GNSS на основе точки доступа, поскольку точка доступа может оставаться в спящем режиме в течение всего жизненного цикла сеанса определения местоположения.
Wi-Fi
CHRE обеспечивает возможность взаимодействия с чипом Wi-Fi, в первую очередь для определения местоположения. Хотя GNSS хорошо работает на открытом воздухе, результаты сканирования Wi-Fi могут предоставить точную информацию о местоположении внутри помещений и в развитых районах. Помимо того, что CHRE позволяет избежать затрат на пробуждение точки доступа для сканирования, она может прослушивать результаты сканирования Wi-Fi, выполняемого прошивкой Wi-Fi, для целей подключения, которые обычно не доставляются на точку доступа по причинам, связанным с питанием. Использование сканирования подключений для контекстуальных целей помогает сократить общее количество выполняемых сканирований Wi-Fi, экономя электроэнергию.
Поддержка Wi-Fi была добавлена в CHRE API v1.1, включая возможность отслеживать результаты сканирования и запускать сканирование по требованию. Эти возможности были расширены в V1.2 с возможностью выполнять измерения времени в пути к обратном пути (RTT) по точкам доступа, которые поддерживают эту функцию, что позволяет точно определить относительное определение положения.
WWAN
Chre API обеспечивает возможность извлекать информацию идентификации клеток для сервировочной ячейки и ее соседей, которая обычно используется для крупнозернистых целей местоположения.
Аудио
Chre может обрабатывать партии аудиодатчиков из микрофона с низким энергопотреблением, который обычно использует аппаратное обеспечение, используемое для реализации саундтриггера HAL. Обработка аудиоданных в chre может позволить их слиться с другими данными, такими как датчики движения.
Справочная реализация
Справочный код для фреймворка Chre включен в AOSP в проекте system/chre
, реализованный в C ++ 11. Хотя это и не требуется, рекомендуется, чтобы все реализации ChRE были основаны на этой кодовой базе, чтобы обеспечить согласованность и ускорить принятие новых возможностей. Этот код можно рассматривать как аналог основной основы Android в том смысле, что это реализация API с открытым исходным кодом, которые используют приложения, служащие базовой линейкой и стандартом для совместимости. Несмотря на то, что он может быть настроен и расширен с помощью возможностей для конкретных поставщиков, рекомендация состоит в том, чтобы поддерживать общий код как можно ближе к ссылке. Подобно Hals of Android, эталонная реализация CHRE использует различные абстракции платформы, чтобы позволить ее адаптации к любому устройству, отвечающему минимальным требованиям.
Технические детали и руководство по портированию см. Readme , включенный в проект system/chre
.
Смартфоны содержат ряд процессоров, каждый из которых оптимизирован для выполнения разных задач. Тем не менее, Android работает только на одном процессоре: процессор приложений (AP). AP настроена на обеспечение отличной производительности для экранных вариантов использования, таких как игры, но он слишком голоден, чтобы поддерживать функции, которые требуют частых коротких всплесков обработки все время, даже когда экран выключен. Меньшие процессоры могут более эффективно справляться с этими рабочими нагрузками, выполняя свои задачи, не заметив зарядки на срок службы батареи. Тем не менее, программные среды в этих процессорах с низким энергопотреблением более ограничены и могут сильно различаться, что затрудняет кроссплатформенную разработку.
Среда выполнения контекста Hub (CHRE) предоставляет общую платформу для запуска приложений на процессоре с низким энергопотреблением с простым стандартизированным, встроенным API. Chre позволяет легкому OEM-производителям устройств и их доверенным партнерам разгрузить обработку из AP, сохранить батарею и улучшить различные области пользовательского опыта, а также включить класс всегда на контекстно-контекстном знакомстве, особенно тех, которые включают в себя применение машинного обучения к эмбиентному зондированию.
Ключевые понятия
Chre-это программная среда, в которой небольшие собственные приложения, называемые NanoApps , выполняются на процессоре с низким энергопотреблением и взаимодействуют с базовой системой через Common Chre API. Чтобы ускорить надлежащую реализацию API-интерфейсов chre, кроссплатформенная эталонная реализация ChRE включена в AOSP. Справочная реализация включает в себя общий код и абстракции для базового аппаратного и программного обеспечения через серию слоев абстракции платформы (PALS). Наноапп почти всегда привязаны к одному или нескольким клиентским приложениям, работающим в Android, которые взаимодействуют с chre и nanoApps с помощью API системы ContextHubManager
System с ограниченным доступом.
На высоком уровне могут быть проведены параллели между архитектурой Чре и Android в целом. Однако есть несколько важных различий:
- Chre поддерживает запуск только нанопсов, разработанных в собственном коде (C или C ++); Java не поддерживается.
- Из-за ограничений ресурсов и ограничений безопасности Chre не открыт для использования произвольными сторонними приложениями Android. Только приложения, прикрепленные к системе, могут получить к нему доступ.
Существует также важное различие между концепцией Чре и датчиком. Несмотря на то, что для реализации датчика и Chre обычно используется одно и то же оборудование, Chre не предоставляет возможности датчика, требуемых датчиками Android HAL . Chre привязан к контекстному Hub HAL, и он действует как клиент из структуры датчика, специфичной для устройства, для получения данных датчика без участия AP.
Рисунок 1. Архитектура Chre Framework
Контекст Хаб Хэл
Уровень аппаратного абстракции контекстного Hub (HAL) - это интерфейс между платформой Android и реализацией устройства Chre, определяемой на hardware/interfaces/contexthub
. Контекстный Hub Hal определяет API -интерфейсы, с помощью которых Android Framework обнаруживает доступные контекстные центры и их наноапп, взаимодействуют с этими наноппс посредством передачи сообщений и позволяют загружать и выгружать наноппс. Справочная реализация контекстного Hub HAL, которая работает с эталонной реализацией Chre, доступна в system/chre/host
.
В случае конфликта между этой документацией и определением HAL определение HAL имеет приоритет.
Инициализация
Когда Android загружается, ContexThubService вызывает функцию getHubs()
HAL, чтобы определить, доступны ли какие -либо контекстные хабы на устройстве. Это блокировка, одноразовый вызов, поэтому он должен быстро заполнить, чтобы избежать задержки загрузки, и он должен вернуть точный результат, так как новые контекстные центры не могут быть введены впоследствии.
Загружать и выгружать нанопсы
Контекстный центр может включать набор нанопсов, которые включены в изображение устройства и загружаются при запуске Chre. Они известны как предварительно загруженные наноапп и должны быть включены в первый возможный ответ на queryApps()
.
Контекстный Hub Hal также поддерживает загрузку и разгрузку NanoApps динамически во время выполнения, через функции loadNanoApp()
и unloadNanoApp()
. Нанопп предоставляется HAL в бинарном формате, специфичном для аппаратного и программного обеспечения CHRE и программного обеспечения устройства.
Если реализация для загрузки NanoApp включает в себя написание его в нелетуальную память, такую как флэш -хранилище, прикрепленное к процессору, который запускает chre, то реализация Chre всегда должна загружаться с этими динамическими наноапп в отделе отключенного состояния. Это означает, что ни один из кода NanoApp не выполняется до тех пор, пока запрос enableNanoapp()
не будет получен через HAL. Предварительно загруженные наноапп могут инициализировать в состоянии включенного.
Контекст -хаб перезагружается
В то время как Chre не ожидается перезапускать в течение нормальной работы, может быть необходимо восстановиться от неожиданных условий, таких как попытка получить доступ к адресу памяти. В этих ситуациях Чре перезапускается независимо от Android. HAL уведомляет об этом Android через RESTARTED
событие, которое оно должно отправлять только после того, как Chre был повторно повторно, чтобы он мог принять новые запросы, такие как queryApps()
.
Обзор системы chre
Chre разработан вокруг архитектуры, управляемой событиями, где основная единица вычислений представляет собой событие, передаваемое в точку входа в обработку событий NanoApp. В то время как фреймворк Chre может быть многопоточной, данный NanoApp никогда не выполняется из нескольких потоков параллельно. Структура ChRE взаимодействует с данным наноапп через одну из трех точек входа NanoApp ( nanoappStart()
, nanoappHandleEvent()
и nanoappEnd()
) или с помощью обратного вызова, предоставленного в предыдущем вызове Chre API, и наноаппс взаимодействует с рамкой ChRE и низшей системой через API CHRE. Chre API предоставляет набор основных возможностей, а также средства для доступа к контекстуальным сигналам, включая датчики, GNS, Wi-Fi, WWAN и аудио, и он может быть расширен с помощью дополнительных возможностей для конкретных поставщиков для использования с помощью специфических для поставщиков NanoApps.
Система сборки
В то время как контекстный Hub HAL и другие необходимые компоненты AP-Side создаются вместе с Android, код, который работает в пределах ChRE, могут иметь требования, которые делают его несовместимым с системой сборки Android, например, необходимость в специализированном инструментальном положении. Таким образом, проект ChRE в AOSP предоставляет упрощенную систему сборки, основанную на GNU, для компиляции нанопсов, и, опционально, CHRE Framework в библиотеки, которые могут быть интегрированы с системой. Производители устройств, добавляющие поддержку Chre, должны интегрировать поддержку системы сборки для своих целевых устройств в AOSP.
Chre API записывается на языковой стандарт C99, а в эталонной реализации используется ограниченное подмножество C ++ 11 подходящего для приложений с ограниченными ресурсами.
Chre api
Chre API представляет собой набор файлов заголовок C, которые определяют программный интерфейс между NanoApp и системой. Он предназначен для того, чтобы сделать код NanoApps совместимым на всех устройствах, которые поддерживают chre, что означает, что исходный код для NanoApp не необходимо изменять для поддержки нового типа устройства, хотя его, возможно, потребуется перекомплектовать специально для набора инструкций для процессора целевого устройства (ABI). Архитектура chre и дизайн API также гарантирует, что наноплыки являются бинарными совместимыми в разных версиях chre API, что означает, что NanoApp не нужно перекомпилировать для запуска на системе, которая реализует другую версию API CHRE по сравнению с целевым API, с которой NanoApp составляется. Другими словами, если двоичный файл NanoApp работает на устройстве, которое поддерживает Chre API V1.3, и это устройство обновляется для поддержки Chre API V1.4, тот же двоичный файл NanoApp продолжает функционировать. Аналогичным образом, NanoApp может работать на chre api v1.2 и может определять во время выполнения, требуется ли это возможности от API v1.3 для достижения его использования, или может ли он работать, потенциально с изящным деградацией признаков.
Новые версии Chre API выпускаются вместе с Android, однако, поскольку реализация Chre является частью реализации поставщика , версия API Chre, поддерживаемая на устройстве, не обязательно связана с версией Android.
Сводка версии
Как и схема управления Android HIDL , chre API следует за семантической версией . Основная версия указывает на бинарную совместимость, в то время как незначительная версия увеличивается при введении обратных совместимых функций. API CHRE включает аннотации исходного кода, чтобы определить, какая версия введена функция или параметр, например, @since v1.1
.
Реализация ChRE также раскрывает специфичную для платформы версию Patch через chreGetVersion()
, которая указывает, когда в реализации делаются исправления ошибок или незначительные обновления.
Версия 1.0 (Android 7)
Включает поддержку датчиков и основные возможности NanoApp, такие как события и таймеры.
Версия 1.1 (Android 8)
Вводит возможности местоположения через местоположение GNSS и необработанные измерения, сканирование Wi-Fi и информацию о мобильной сети, а также общие усовершенствования, чтобы обеспечить связь NanoApp-to-NanoApp и другие улучшения.
Версия 1.2 (Android 9)
Добавляет поддержку данных из микрофона с низким энергопотреблением, Wi-Fi RTT, уведомлений AP Wake and Sleep и других улучшений.
Версия 1.3 (Android 10)
Увеличивает возможности, связанные с данными калибровки датчиков, добавляет поддержку для промывки пакетных данных датчика по требованию, определяет тип датчика определения шага и расширяет события местоположения GNSS с дополнительными полями точности.
Версия 1.4 (Android 11)
Добавляет поддержку информации о сотовой связи 5G, дамп отладки NanoApp и другие улучшения.
Обязательные системы системы
Хотя источники контекстуальных сигналов, такие как датчики, классифицируются в дополнительных областях функций, несколько основных функций требуются во всех реализациях ChRE. Это включает в себя API -интерфейсы основных систем, например, для установки таймеров, отправка и получения сообщений клиентам на процессоре приложений, ведении журнала и других. Для получения полной информации см. Заголовки API .
В дополнение к основным функциям системы, кодифицированным в API CHRE, также существуют обязательные функции системы системного уровня, указанные на уровне контекстного хаба HAL. Наиболее значимым из них является возможность динамической загрузки и выгрузки нанопсов.
Стандартная библиотека C/C ++
Чтобы минимизировать использование памяти и сложность системы, реализации ChRE необходимы для поддержки только подмножества стандартных библиотек C и C ++ и языковых функций, требующих поддержки времени выполнения. Следуя этим принципам, некоторые функции явно исключены из-за их памяти и обширных зависимостей на уровне ОС, а также другие, потому что они вытеснены более подходящими API-интерфейсами. Хотя это не предназначено для того, чтобы быть исчерпывающим списком, следующие возможности не предназначены для NanoApps:
- 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
Во многих случаях эквивалентные возможности доступны из функций API Chre и библиотек коммунальных услуг. Например, chreLog
может использоваться для ведения журнала отладки, предназначенной для системы Android Logcat, где более традиционная программа может использовать printf
или std::cout
.
Напротив, требуются некоторые стандартные возможности библиотеки. Реализация платформы зависит от того, чтобы разоблачить их через статические библиотеки для включения в бинарное значение NanoApp или путем динамического связывания между NanoApp и системой. Это включает, но не ограничивается:
- Утилиты строк и массива:
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
- Основные операции:
В то время как некоторые базовые платформы поддерживают дополнительные возможности, NanoApp не считается портативным для реализаций ChRE, если только он не ограничивает свои внешние зависимости функциями API CHRE и утвержденными стандартными библиотечными функциями.
Дополнительные функции
Для содействия аппаратному и программному обеспечению API CHRE разделен на области функций, которые считаются необязательными с точки зрения API. Хотя эти функции могут не потребоваться для поддержки совместимой реализации ChRE, они могут потребоваться для поддержки конкретного NanoApp. Даже если платформа не поддерживает заданный набор API, NanoApps, которые ссылаются на эти функции, должны быть в состоянии создавать и загружать.
Датчики
Chre API обеспечивает возможность запросить данные от датчиков, включая акселерометр, гироскоп, магнитометр, датчик окружающего света и близость. Эти API предназначены для предоставления набора функций, аналогичного API -интерфейсам Android Sensors, включая поддержку образцов пакетирования датчиков для снижения энергопотребления. Данные датчика обработки в CHRE обеспечивают гораздо более низкую мощность и более низкую обработку задержек сигналов движения по сравнению с работой на AP.
GNSS
Chre поставляет API для запроса данных о местоположении у глобальной спутниковой системы навигации (GNSS), включая GPS и другие спутниковые созвездия. Это включает в себя запросы на периодические исправления позиции, а также необработанные данные измерения, хотя оба являются независимыми возможностями. Поскольку chre имеет прямую связь с подсистемой GNSS, мощность снижается по сравнению с запросами GNSS на основе AP, поскольку AP может оставаться спать в течение всего жизненного цикла сеанса местоположения.
Wi-Fi
Chre обеспечивает возможность взаимодействовать с чипом Wi-Fi, в первую очередь для целей местоположения. В то время как GNSS хорошо работает для открытых мест, результаты сканирования Wi-Fi могут предоставить точную информацию о местоположении в помещении и в развитых областях. В дополнение к предотвращению стоимости пробуждения AP для сканирования, Chre может прослушать результаты сканирования Wi-Fi, выполняемых прошивкой Wi-Fi для целей подключения, которые обычно не доставляются в AP по причинам питания. Использование сканирования подключения для контекстуальных целей помогает уменьшить общее количество выполненных сканирований Wi-Fi, сберегающая мощность.
Поддержка Wi-Fi была добавлена в Chre API v1.1, включая возможность контролировать результаты сканирования и запуск сканирования по требованию. Эти возможности были расширены в V1.2 с возможностью выполнять измерения времени в пути к обратном пути (RTT) по точкам доступа, которые поддерживают эту функцию, что позволяет точно определить относительное определение положения.
WWAN
Chre API обеспечивает возможность извлекать информацию идентификации клеток для сервировочной ячейки и ее соседей, которая обычно используется для крупнозернистых целей местоположения.
Аудио
Chre может обрабатывать партии аудиодатчиков из микрофона с низким энергопотреблением, который обычно использует аппаратное обеспечение, используемое для реализации саундтриггера HAL. Обработка аудиоданных в chre может позволить их слиться с другими данными, такими как датчики движения.
Справочная реализация
Справочный код для фреймворка Chre включен в AOSP в проекте system/chre
, реализованный в C ++ 11. Хотя это и не требуется, рекомендуется, чтобы все реализации ChRE были основаны на этой кодовой базе, чтобы обеспечить согласованность и ускорить принятие новых возможностей. Этот код можно рассматривать как аналог основной основы Android в том смысле, что это реализация API с открытым исходным кодом, которые используют приложения, служащие базовой линейкой и стандартом для совместимости. Несмотря на то, что он может быть настроен и расширен с помощью возможностей для конкретных поставщиков, рекомендация состоит в том, чтобы поддерживать общий код как можно ближе к ссылке. Подобно Hals of Android, эталонная реализация CHRE использует различные абстракции платформы, чтобы позволить ее адаптации к любому устройству, отвечающему минимальным требованиям.
Технические детали и руководство по портированию см. Readme , включенный в проект system/chre
.
Смартфоны содержат ряд процессоров, каждый из которых оптимизирован для выполнения разных задач. Тем не менее, Android работает только на одном процессоре: процессор приложений (AP). AP настроена на обеспечение отличной производительности для экранных вариантов использования, таких как игры, но он слишком голоден, чтобы поддерживать функции, которые требуют частых коротких всплесков обработки все время, даже когда экран выключен. Меньшие процессоры могут более эффективно справляться с этими рабочими нагрузками, выполняя свои задачи, не заметив зарядки на срок службы батареи. Тем не менее, программные среды в этих процессорах с низким энергопотреблением более ограничены и могут сильно различаться, что затрудняет кроссплатформенную разработку.
Среда выполнения контекста Hub (CHRE) предоставляет общую платформу для запуска приложений на процессоре с низким энергопотреблением с простым стандартизированным, встроенным API. Chre позволяет легкому OEM-производителям устройств и их доверенным партнерам разгрузить обработку из AP, сохранить батарею и улучшить различные области пользовательского опыта, а также включить класс всегда на контекстно-контекстном знакомстве, особенно тех, которые включают в себя применение машинного обучения к эмбиентному зондированию.
Ключевые понятия
Chre-это программная среда, в которой небольшие собственные приложения, называемые NanoApps , выполняются на процессоре с низким энергопотреблением и взаимодействуют с базовой системой через Common Chre API. Чтобы ускорить надлежащую реализацию API-интерфейсов chre, кроссплатформенная эталонная реализация ChRE включена в AOSP. Справочная реализация включает в себя общий код и абстракции для базового аппаратного и программного обеспечения через серию слоев абстракции платформы (PALS). Наноапп почти всегда привязаны к одному или нескольким клиентским приложениям, работающим в Android, которые взаимодействуют с chre и nanoApps с помощью API системы ContextHubManager
System с ограниченным доступом.
На высоком уровне могут быть проведены параллели между архитектурой Чре и Android в целом. Однако есть несколько важных различий:
- Chre поддерживает запуск только нанопсов, разработанных в собственном коде (C или C ++); Java не поддерживается.
- Из-за ограничений ресурсов и ограничений безопасности Chre не открыт для использования произвольными сторонними приложениями Android. Только приложения, прикрепленные к системе, могут получить к нему доступ.
Существует также важное различие между концепцией Чре и датчиком. Несмотря на то, что для реализации датчика и Chre обычно используется одно и то же оборудование, Chre не предоставляет возможности датчика, требуемых датчиками Android HAL . Chre привязан к контекстному Hub HAL, и он действует как клиент из структуры датчика, специфичной для устройства, для получения данных датчика без участия AP.
Рисунок 1. Архитектура Chre Framework
Контекст Хаб Хэл
Уровень аппаратного абстракции контекстного Hub (HAL) - это интерфейс между платформой Android и реализацией устройства Chre, определяемой на hardware/interfaces/contexthub
. Контекстный Hub Hal определяет API -интерфейсы, с помощью которых Android Framework обнаруживает доступные контекстные центры и их наноапп, взаимодействуют с этими наноппс посредством передачи сообщений и позволяют загружать и выгружать наноппс. Справочная реализация контекстного Hub HAL, которая работает с эталонной реализацией Chre, доступна в system/chre/host
.
В случае конфликта между этой документацией и определением HAL определение HAL имеет приоритет.
Инициализация
Когда Android загружается, ContexThubService вызывает функцию getHubs()
HAL, чтобы определить, доступны ли какие -либо контекстные хабы на устройстве. Это блокировка, одноразовый вызов, поэтому он должен быстро заполнить, чтобы избежать задержки загрузки, и он должен вернуть точный результат, так как новые контекстные центры не могут быть введены впоследствии.
Загружать и выгружать нанопсы
Контекстный центр может включать набор нанопсов, которые включены в изображение устройства и загружаются при запуске Chre. Они известны как предварительно загруженные наноапп и должны быть включены в первый возможный ответ на queryApps()
.
Контекстный Hub Hal также поддерживает загрузку и разгрузку NanoApps динамически во время выполнения, через функции loadNanoApp()
и unloadNanoApp()
. Нанопп предоставляется HAL в бинарном формате, специфичном для аппаратного и программного обеспечения CHRE и программного обеспечения устройства.
Если реализация для загрузки NanoApp включает в себя написание его в нелетуальную память, такую как флэш -хранилище, прикрепленное к процессору, который запускает chre, то реализация Chre всегда должна загружаться с этими динамическими наноапп в отделе отключенного состояния. Это означает, что ни один из кода NanoApp не выполняется до тех пор, пока запрос enableNanoapp()
не будет получен через HAL. Предварительно загруженные наноапп могут инициализировать в состоянии включенного.
Контекст -хаб перезагружается
В то время как Chre не ожидается перезапускать в течение нормальной работы, может быть необходимо восстановиться от неожиданных условий, таких как попытка получить доступ к адресу памяти. В этих ситуациях Чре перезапускается независимо от Android. HAL уведомляет об этом Android через RESTARTED
событие, которое оно должно отправлять только после того, как Chre был повторно повторно, чтобы он мог принять новые запросы, такие как queryApps()
.
Обзор системы chre
Chre разработан вокруг архитектуры, управляемой событиями, где основная единица вычислений представляет собой событие, передаваемое в точку входа в обработку событий NanoApp. В то время как фреймворк Chre может быть многопоточной, данный NanoApp никогда не выполняется из нескольких потоков параллельно. Структура ChRE взаимодействует с данным наноапп через одну из трех точек входа NanoApp ( nanoappStart()
, nanoappHandleEvent()
и nanoappEnd()
) или с помощью обратного вызова, предоставленного в предыдущем вызове Chre API, и наноаппс взаимодействует с рамкой ChRE и низшей системой через API CHRE. Chre API предоставляет набор основных возможностей, а также средства для доступа к контекстуальным сигналам, включая датчики, GNS, Wi-Fi, WWAN и аудио, и он может быть расширен с помощью дополнительных возможностей для конкретных поставщиков для использования с помощью специфических для поставщиков NanoApps.
Система сборки
В то время как контекстный Hub HAL и другие необходимые компоненты AP-Side создаются вместе с Android, код, который работает в пределах ChRE, могут иметь требования, которые делают его несовместимым с системой сборки Android, например, необходимость в специализированном инструментальном положении. Таким образом, проект ChRE в AOSP предоставляет упрощенную систему сборки, основанную на GNU, для компиляции нанопсов, и, опционально, CHRE Framework в библиотеки, которые могут быть интегрированы с системой. Производители устройств, добавляющие поддержку Chre, должны интегрировать поддержку системы сборки для своих целевых устройств в AOSP.
Chre API записывается на языковой стандарт C99, а в эталонной реализации используется ограниченное подмножество C ++ 11 подходящего для приложений с ограниченными ресурсами.
Chre api
Chre API представляет собой набор файлов заголовок C, которые определяют программный интерфейс между NanoApp и системой. Он предназначен для того, чтобы сделать код NanoApps совместимым на всех устройствах, которые поддерживают chre, что означает, что исходный код для NanoApp не необходимо изменять для поддержки нового типа устройства, хотя его, возможно, потребуется перекомплектовать специально для набора инструкций для процессора целевого устройства (ABI). Архитектура chre и дизайн API также гарантирует, что наноплыки являются бинарными совместимыми в разных версиях chre API, что означает, что NanoApp не нужно перекомпилировать для запуска на системе, которая реализует другую версию API CHRE по сравнению с целевым API, с которой NanoApp составляется. Другими словами, если двоичный файл NanoApp работает на устройстве, которое поддерживает Chre API V1.3, и это устройство обновляется для поддержки Chre API V1.4, тот же двоичный файл NanoApp продолжает функционировать. Аналогичным образом, NanoApp может работать на chre api v1.2 и может определять во время выполнения, требуется ли это возможности от API v1.3 для достижения его использования, или может ли он работать, потенциально с изящным деградацией признаков.
Новые версии Chre API выпускаются вместе с Android, однако, поскольку реализация Chre является частью реализации поставщика , версия API Chre, поддерживаемая на устройстве, не обязательно связана с версией Android.
Сводка версии
Как и схема управления Android HIDL , chre API следует за семантической версией . Основная версия указывает на бинарную совместимость, в то время как незначительная версия увеличивается при введении обратных совместимых функций. API CHRE включает аннотации исходного кода, чтобы определить, какая версия введена функция или параметр, например, @since v1.1
.
Реализация ChRE также раскрывает специфичную для платформы версию Patch через chreGetVersion()
, которая указывает, когда в реализации делаются исправления ошибок или незначительные обновления.
Версия 1.0 (Android 7)
Включает поддержку датчиков и основные возможности NanoApp, такие как события и таймеры.
Версия 1.1 (Android 8)
Вводит возможности местоположения через местоположение GNSS и необработанные измерения, сканирование Wi-Fi и информацию о мобильной сети, а также общие усовершенствования, чтобы обеспечить связь NanoApp-to-NanoApp и другие улучшения.
Версия 1.2 (Android 9)
Добавляет поддержку данных из микрофона с низким энергопотреблением, Wi-Fi RTT, уведомлений AP Wake and Sleep и других улучшений.
Версия 1.3 (Android 10)
Увеличивает возможности, связанные с данными калибровки датчиков, добавляет поддержку для промывки пакетных данных датчика по требованию, определяет тип датчика определения шага и расширяет события местоположения GNSS с дополнительными полями точности.
Версия 1.4 (Android 11)
Добавляет поддержку информации о сотовой связи 5G, дамп отладки NanoApp и другие улучшения.
Обязательные системы системы
Хотя источники контекстуальных сигналов, такие как датчики, классифицируются в дополнительных областях функций, несколько основных функций требуются во всех реализациях ChRE. Это включает в себя API -интерфейсы основных систем, например, для установки таймеров, отправка и получения сообщений клиентам на процессоре приложений, ведении журнала и других. Для получения полной информации см. Заголовки API .
В дополнение к основным функциям системы, кодифицированным в API CHRE, также существуют обязательные функции системы системного уровня, указанные на уровне контекстного хаба HAL. Наиболее значимым из них является возможность динамической загрузки и выгрузки нанопсов.
Стандартная библиотека C/C ++
Чтобы минимизировать использование памяти и сложность системы, реализации ChRE необходимы для поддержки только подмножества стандартных библиотек C и C ++ и языковых функций, требующих поддержки времени выполнения. Следуя этим принципам, некоторые функции явно исключены из-за их памяти и обширных зависимостей на уровне ОС, а также другие, потому что они вытеснены более подходящими API-интерфейсами. Хотя это не предназначено для того, чтобы быть исчерпывающим списком, следующие возможности не предназначены для NanoApps:
- 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
Во многих случаях эквивалентные возможности доступны из функций API Chre и библиотек коммунальных услуг. Например, chreLog
может использоваться для ведения журнала отладки, предназначенной для системы Android Logcat, где более традиционная программа может использовать printf
или std::cout
.
Напротив, требуются некоторые стандартные возможности библиотеки. Реализация платформы зависит от того, чтобы разоблачить их через статические библиотеки для включения в бинарное значение NanoApp или путем динамического связывания между NanoApp и системой. Это включает, но не ограничивается:
- Утилиты строк и массива:
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
- Основные операции:
В то время как некоторые базовые платформы поддерживают дополнительные возможности, NanoApp не считается портативным для реализаций ChRE, если только он не ограничивает свои внешние зависимости функциями API CHRE и утвержденными стандартными библиотечными функциями.
Дополнительные функции
Для содействия аппаратному и программному обеспечению API CHRE разделен на области функций, которые считаются необязательными с точки зрения API. Хотя эти функции могут не потребоваться для поддержки совместимой реализации ChRE, они могут потребоваться для поддержки конкретного NanoApp. Даже если платформа не поддерживает заданный набор API, NanoApps, которые ссылаются на эти функции, должны быть в состоянии создавать и загружать.
Датчики
The CHRE API provides the ability to request data from sensors including accelerometer, gyroscope, magnetometer, ambient light sensor, and proximity. These APIs are meant to provide a feature set similar to the Android Sensors APIs, including support for batching sensor samples to reduce power consumption. Processing sensor data within CHRE enables much lower power and lower latency processing of motion signals as compared to running on the AP.
GNSS
CHRE supplies APIs for requesting location data from a global navigation satellite system (GNSS), including GPS and other satellite constellations. This includes requests for periodic position fixes, as well as raw measurement data, though both are independent capabilities. As CHRE has a direct link to the GNSS subsystem, power is reduced compared to AP-based GNSS requests, because the AP can stay asleep during the entire lifecycle of a location session.
Wi-Fi
CHRE provides the ability to interact with the Wi-Fi chip, primarily for location purposes. While GNSS works well for outdoor locations, the results of Wi-Fi scans can provide accurate location information indoors and in developed areas. In addition to avoiding the cost of waking the AP for a scan, CHRE can listen to the results of Wi-Fi scans performed by the Wi-Fi firmware for connectivity purposes, which typically aren't delivered to the AP for power reasons. Leveraging connectivity scans for contextual purposes helps to reduce the total number of Wi-Fi scans performed, saving power.
Support for Wi-Fi was added in CHRE API v1.1, including the ability to monitor scan results and trigger scans on demand. These capabilities were extended in v1.2 with the ability to perform Round-Trip Time (RTT) measurements against access points that support the feature, which enables accurate relative position determination.
WWAN
The CHRE API provides the ability to retrieve cell identification information for the serving cell and its neighbors, which is typically used for coarse-grained location purposes.
Аудио
CHRE can process batches of audio data from a low-power microphone, which typically leverages hardware used to implement the SoundTrigger HAL. Processing audio data in CHRE can enable it to be fused with other data, such as motion sensors.
Reference implementation
Reference code for the CHRE framework is included in AOSP in the system/chre
project, implemented in C++11. While not strictly required, it's recommended for all CHRE implementations to be based off of this codebase, to help ensure consistency and accelerate adoption of new capabilities. This code can be seen as an analogue to the core Android framework in that it's an open-source implementation of APIs that apps use, serving as a baseline and standard for compatibility. While it can be customized and extended with vendor-specific capabilities, the recommendation is to maintain the common code as close to the reference as possible. Similar to the HALs of Android, the CHRE reference implementation uses various platform abstractions to enable it to be adapted to any device meeting the minimum requirements.
For technical details and a porting guide, see the README included in the system/chre
project.