Для поддержки управления питанием, специфичного для конкретного автомобиля, Android предоставляет службу CarPowerManagementService и интерфейс CarPowerManager .
Переходы состояний инициируются главным блоком управления транспортным средством (VMCU). Для связи с VMCU интеграторы должны реализовать несколько компонентов. Интеграторы отвечают за интеграцию с уровнем аппаратной абстракции транспортного средства (VHAL) и реализацией ядра. Интеграторы также отвечают за отключение источников пробуждения и обеспечение того, чтобы выключения не откладывались на неопределенный срок.
Терминология
В данном документе используются следующие термины:
Проектирование системы
В этом разделе описывается, как AAOS представляет состояние питания процессора приложения и какие модули реализуют систему управления питанием. Также описывается, как эти модули взаимодействуют друг с другом и как обычно происходят переходы между состояниями.
Автомобильный энергетический конечный автомат
AAOS использует конечный автомат для представления состояния питания точки доступа. Конечный автомат предоставляет состояния, показанные ниже:

Рисунок 1. Условный автомат управления автомобилем.
Наиболее распространенные переходы выделены синим цветом. Вот состояния и наиболее распространенные переходы:
- Режим приостановки работы с сохранением данных в ОЗУ. Автомобиль и SoC выключены. Код не выполняется. Питание ОЗУ SoC поддерживается.
- Ожидание VHAL. Когда водитель взаимодействует с транспортным средством, например, открывая дверь, VMCU подает питание на SoC. AAOS возобновляет работу из состояния Suspend-to-RAM и переходит в режим ожидания VHAL, где ожидает координации с VHAL.
- Включено. VHAL дает команду AAOS перейти в состояние «Включено». В этом состоянии AAOS работает в полном объеме и взаимодействует с драйвером.
- Подготовка к выключению. Когда водитель заканчивает движение, VHAL дает команду AAOS перейти в состояние подготовки к выключению. В этом состоянии дисплей и звук выключены, и AAOS не взаимодействует с водителем. Система Android продолжает работать и может обновлять приложения и саму систему Android. После завершения обновлений, если таковые имеются, система Android переходит в состояние ожидания завершения работы VHAL.
- Дождитесь завершения работы VHAL. В этот момент AAOS сообщает VHAL о готовности к завершению работы. Ожидается, что VMCU переведет SoC в режим глубокого сна и отключит питание процессора приложений. Затем AAOS переходит в состояние приостановки в ОЗУ, хотя никакой код не выполняется.
модули управления питанием
Система управления питанием состоит из следующих модулей:
| Название модуля | Описание |
|---|---|
| CarPowerManager | API на Java или C++. |
| CarPowerManagementService | Координирует переходы состояний питания и делегирует управление политикой энергопотребления демону CarPowerPolicyDaemon. |
| CarPowerPolicyDaemon | Управляет политиками энергоснабжения и взаимодействует с клиентами, использующими собственные политики энергоснабжения. |
| Транспортное средство HAL | Интерфейс для подключения к VMCU. |
| Ядро | Приостановка работы с сохранением данных в ОЗУ или на диск. |
Функция глубокого сна/гибернации (приостановка работы Android с сохранением данных в ОЗУ/на диск) реализована в ядре. Эта функция доступна пользователю в виде специального файла, расположенного по адресу /sys/power/state . Приостановка работы AAOS осуществляется путем записи данных в этот файл mem или disk .
CPMS координирует состояние питания с другими службами и HAL. CPMS реализует описанный выше конечный автомат и отправляет уведомления каждому наблюдателю при переходе состояния питания. Эта служба также использует VHAL для отправки сообщений оборудованию.
CPPD является источником достоверной информации о политиках управления питанием. Он управляет политиками управления питанием на протяжении всего жизненного цикла устройства и уведомляет CPMS, VHAL и другие собственные обработчики об изменениях в политиках управления питанием. CPMS делегирует запросы на изменение политик управления питанием CPPD.
Модуль CPMS взаимодействует с VMCU, считывая и записывая свойства VHAL, связанные с состоянием питания, такие как AP_POWER_STATE_REQ и AP_POWER_STATE_REPORT . Приложения могут использовать интерфейс, определенный в CPM, для мониторинга изменений состояния питания. Этот интерфейс также позволяет приложениям регистрировать слушатели политик питания . Данный Java API аннотирован аннотациями @SystemApi и @hide , что делает его доступным только для привилегированных приложений. Взаимосвязь между этими модулями, приложениями и службами показана ниже:

Рисунок 2. Схема расположения силовых компонентов.
Последовательность сообщений
В предыдущем разделе были описаны модули, составляющие систему управления питанием. В этом разделе на примерах перехода в режим глубокого сна и выхода из него объясняется, как модули и приложения взаимодействуют друг с другом:
Погрузитесь в глубокий сон
Только VMCU может инициировать глубокий сон. После инициирования глубокого сна VMCU отправляет уведомление в CPMS через VHAL. CPMS изменяет состояние на SHUTDOWN PREPARE и передает информацию об этом переходе всем наблюдателям (приложениям и службам, которые отслеживают CPMS), вызывая метод onStateChanged() с новым идентификатором состояния, предоставленным CPM.
CPM выступает посредником между приложениями/сервисами и CPMS. Метод onStateChanged() для приложений/сервисов вызывается синхронно в методе onStateChanged() CPM. Большинству приложений и сервисов необходимо завершить подготовку перед возвратом из этого вызова. Привилегированным сервисам разрешено продолжать подготовку асинхронно после возврата для PRE_SHUTDOWN_PREPARE , SUSPEND_ENTER , POST_SUSPEND_ENTER . В этом случае привилегированный сервис должен вызвать complete() для предоставленного объекта CompletablePowerStateChangeFuture после завершения подготовки. Обратите внимание, что асинхронная подготовка не допускается для SHUTDOWN_PREPARE . Перед отправкой DEEP_SLEEP_ENTRY в VHAL, CPMS периодически отправляет запросы на отсрочку завершения работы в VHAL.
Когда все объекты CPM завершают подготовку к выключению, CPMS отправляет AP_POWER_STATE_REPORT в VHAL, который затем уведомляет VMCU о готовности точки доступа к приостановке. CPMS также вызывает свой метод suspend, который приостанавливает работу ядра.
Описанная выше последовательность действий проиллюстрирована ниже:

Рисунок 3. Погружение в глубокий сон.
Программные интерфейсы, предоставляемые CPM
В этом разделе описывается Java API, предоставляемый CPM для системных приложений и служб. Этот API позволяет системному программному обеспечению:
- Отслеживайте изменения состояния питания точки доступа.
- Применяйте политику в области энергетики.
Выполните следующие шаги для вызова API, предоставляемых CPM:
- Для получения экземпляра CPM вызовите Car API.
- Вызовите соответствующий метод для объекта, созданного на шаге 1.
Создайте объект CarPowerManager.
Для создания объекта CPM вызовите метод getCarManager() объекта Car. Этот метод является фасадом, используемым для создания объектов CPM. В качестве аргумента для создания объекта CPM укажите android.car.Car.POWER_SERVICE .
Car car = Car.createCar(this); CarPowerManager powerManager = (CarPowerManager) car.getCarManager(android.car.Car.POWER_SERVICE);
CarPowerStateListener и регистрация
Системные приложения и службы могут получать уведомления об изменении состояния питания, реализуя интерфейс CarPowerManager.CarPowerStateListener . Этот интерфейс определяет один метод onStateChanged() , который является функцией обратного вызова, вызываемой при изменении состояния питания CPMS. В следующем примере определяется новый анонимный класс, реализующий этот интерфейс:
private final CarPowerManager.CarPowerStateListener powerListener = new CarPowerManager.CarPowerStateListener () { @Override public void onStateChanged(int state) { Log.i(TAG, "onStateChanged() state = " + state); } };
Чтобы указать этому объекту-слушателю отслеживать переход состояния питания, создайте новый поток выполнения и зарегистрируйте слушатель и этот поток в объекте CPM:
executor = new ThreadPerTaskExecutor(); powerManager.setListener(powerListener, executor);
При изменении состояния питания вызывается метод onStateChanged() объекта-слушателя со значением, представляющим новое состояние питания. Связь между фактическим значением и состоянием питания определяется в CarPowerManager и показана в следующей таблице:
| Имя | Описание |
|---|---|
| STATE_ON | Переведите систему в положение «включено». Система полностью работоспособна. |
| ОТМЕНЕНО ГОСУДАРСТВЕННОЕ_ПРЕКРАЩЕНИЕ_РАБОТЫ | Выключение отменяется, и состояние питания возвращается в нормальное состояние. |
| STATE_SHUTDOWN_ENTER | Предполагается, что приложения будут очищены и готовы к завершению работы. |
| STATE_POST_SHUTDOWN_ENTER | Подготовка к выключению завершена, и VMCU готов к выключению. Переходим в состояние выключения. |
| STATE_PRE_SHUTDOWN_PREPARE | Запрошен процесс выключения, но CPMS пока не запускается. Дисплей и звук остаются включенными. |
| STATE_SHUTDOWN_PREPARE | В этот период может быть включен режим гаража. |
| STATE_SUSPEND_ENTER | Ожидается, что приложения будут выполнять очистку и будут готовы к сохранению данных в оперативную память после приостановки работы. |
| STATE_POST_SUSPEND_ENTER | Подготовка к сохранению данных в ОЗУ завершена, и VMCU готов к сохранению данных в ОЗУ. Переход в состояние приостановки. |
| STATE_SUSPEND_EXIT | Пробудиться после приостановки или возобновить работу после отмененной приостановки. |
| STATE_HIBERNATION_ENTER | Ожидается, что приложения будут приведены в порядок и готовы к переходу в спящий режим. |
| STATE_POST_HIBERNATION_ENTER | Подготовка к переходу в спящий режим завершена, и VMCU готов к переходу в спящий режим. |
| ВЫХОД ИЗ ГОСУДАРСТВЕННОЙ СПЯЩЕННОСТИ | Пробудитесь от спячки или возобновите прерванную спячку. |
| STATE_WAIT_FOR_VHAL | Система запускается, но ожидает установления связи с VHAL, прежде чем перейти в состояние «ВКЛ». |
CarPowerStateListener unregistration
Чтобы отменить регистрацию всех объектов-слушателей, зарегистрированных в CPM, вызовите метод clearListener :
powerManager.clearListener();
Интеграция системы в вашу Android-реализацию
Интеграторы несут ответственность за следующие пункты:
- Реализация интерфейса ядра для приостановки работы Android.
- Реализация функций VHAL для:
- Передайте инициирование приостановки или выключения системы с автомобиля на Android.
- Отправить сообщение о готовности к выключению с Android на автомобиль.
- Инициируйте выключение или приостановку работы Android через интерфейс ядра Linux.
- Убедитесь, что все источники пробуждения отключены, когда устройство находится в режиме ожидания.
- Убедитесь, что приложения завершают работу достаточно быстро, чтобы не приходилось бесконечно откладывать процесс выключения.
- Убедитесь, что BSP включает (или выключает) компоненты устройства в соответствии с политикой электропитания, чтобы не блокировать режимы приостановки или гибернации.
Интерфейс ядра: /sys/power/state
AAOS переводит устройство в режим приостановки, когда приложение или служба записывает данные в mem для режима приостановки — в disk , для режима приостановки — на диск) в файл, расположенный по адресу /sys/power/state . Интегратор должен предоставить функцию, которая отслеживает этот файл и переводит Linux в состояние приостановки питания. Эта функция может отправлять GPIO на VMCU, чтобы уведомить его о полном выключении устройства. Интегратор также отвечает за устранение любых состояний гонки между отправкой VHAL последнего сообщения на VMCU и переходом системы в режим приостановки или выключения.
ответственность VHAL
VHAL обеспечивает интерфейс между автомобильной сетью и Android. VHAL:
- Передает информацию о начале приостановки или выключения системы с автомобиля на Android.
- Отправляет сообщение о готовности к выключению с Android в автомобиль.
- Инициирует выключение или приостановку работы Android через интерфейс ядра Linux.
Когда CPMS сообщает VHAL о готовности к выключению, VHAL отправляет сообщение о готовности к выключению в VMCU. Как правило, это сообщение передают встроенные периферийные устройства, такие как UART, SPI и USB. После отправки сообщения CPMS вызывает команду ядра для приостановки или выключения устройства. Перед этим VHAL или BSP могут переключить вывод GPIO, чтобы дать указание VMCU о безопасном отключении питания устройства.
VHAL должен поддерживать следующие свойства, которые управляют питанием через VHAL:
| Имя | Описание |
|---|---|
| AP_POWER_STATE_REPORT | Android передает информацию о переходах состояний в VMCU с помощью этого свойства, используя значения перечисления VehicleApPowerStateReport. |
| AP_POWER_STATE_REQ | VMCU использует это свойство для того, чтобы дать Android команду переходить в различные режимы энергопотребления, используя значения перечисления VehicleApPowerStateReq. |
AP_POWER_STATE_REPORT
Используйте это свойство для отображения текущего состояния управления питанием Android. Это свойство содержит два целых числа:
-
int32Values[0]: VehicleApPowerStateReport перечисление текущего состояния. -
int32Values[1]: Время в миллисекундах, на которое нужно отложить выполнение, перейти в спящий режим или завершить работу. Значение этого параметра зависит от первого параметра.
Первое значение может принимать одно из следующих значений. VehicleApPowerStateReport.aidl содержит более подробные описания, которые хранятся в каталоге hardware/interfaces/automotive/vehicle/aidl/android/hardware/automotive/vehicle .
| Название значения | Описание | Второе значение |
|---|---|---|
| WAIT_FOR_VHAL | Автопилот запускается и ему необходимо установить связь с VHAL. | |
| DEEP_SLEEP_ENTRY | Точка доступа переходит в режим глубокого сна. VMCU должна снова включить точку доступа по истечении времени, указанного во втором значении. | Необходимо установить |
| DEEP_SLEEP_EXIT | АП выходит из состояния глубокого сна. | |
| ВСТУПЛЕНИЕ В СПЯЧКУ | Точка доступа переходит в режим гибернации. VMCU должна снова включить точку доступа по истечении времени, указанного во втором значении. | Необходимо установить |
| ВЫХОД ИЗ СПЯЧКИ | AP выходит из состояния спячки. | |
| ОТЛОЖИТЬ ВЫКЛЮЧЕНИЕ | Android не готов к выключению. VMCU должен подождать время, указанное во втором значении, прежде чем выключать точку доступа. Android может запросить дополнительную отсрочку, отправив дополнительные отчеты SHUTDOWN_POSTPONE. | Необходимо установить |
| ПОДГОТОВКА К ОТКЛЮЧЕНИЮ | Android готовится к завершению работы. | Необходимо установить |
| SHUTDOWN_START | Точка доступа готова к выключению. VMCU должен снова включить точку доступа по истечении времени, указанного во втором значении. (Поддержка функции включения по таймеру не является обязательной для VMCU.) | Необходимо установить |
| ОТМЕНЕНО ОТКЛЮЧЕНИЕ | Android прекращает подготовку к завершению работы и перейдет в состояние WAIT_FOR_VHAL. | |
| НА | Android работает в обычном режиме. |
Состояние может быть установлено автономно или в ответ на запрос через VMCU.
AP_POWER_STATE_REQ
Это свойство отправляется модулем VMCU для перевода Android в другое состояние энергопотребления и содержит два целых числа:
-
int32Values[0]: Значение перечисленияVehicleApPowerStateReq, представляющее новое состояние, в которое следует перейти. -
int32Values[1]: Значение перечисленияVehicleApPowerStateShutdownParam. Это значение отправляется только для сообщенияSHUTDOWN_PREPAREи передает Android содержащиеся в нем параметры.
Первое целочисленное значение представляет собой новое состояние, в которое должен перейти Android. Семантика определена в VehicleApPowerStateReq.aidl и приведена ниже:
| Название значения | Описание |
|---|---|
| НА | Точка доступа должна начать полноценную работу. |
| ПОДГОТОВКА К ОТКЛЮЧЕНИЮ | Точка доступа должна быть готова к выключению. Второе значение указывает, разрешено ли точке доступа откладывать выключение и следует ли ожидать выключения или перехода в режим глубокого сна. |
| ОТМЕНА_ОТКЛЮЧЕНИЯ | Агентству скорой помощи следует прекратить подготовку к отключению и начать работу. |
| ЗАКОНЧЕННЫЙ | Теперь работа AP будет приостановлена или отключена. |
VehicleApPowerStateShutdownParam определен в файле VehicleApPowerStateShutdownParam.aidl . Этот перечислимый тип содержит следующие элементы:
| Название значения | Описание |
|---|---|
| CAN_SLEEP | Система AP может переходить в режим глубокого сна вместо полного отключения. Допускается отсрочка. |
| CAN_HIBERNATE | Точка доступа может перейти в спящий режим вместо полного отключения. Допускается отсрочка. |
| ТОЛЬКО ДЛЯ ОТКЛЮЧЕНИЯ | AP следует отключить. Отложить отключение разрешено. Режим глубокого сна не допускается. |
| СПАТЬ НЕМЕДЛЕННО | Аппарат может перейти в фазу глубокого сна, но должен либо немедленно перейти в спящий режим, либо отключиться. Откладывать это решение не допускается. |
| Впасть в спячку немедленно | AP может перейти в режим приостановки с сохранением данных на диск, но должен либо немедленно перейти в режим гибернации, либо выключиться. Откладывать это действие не допускается. |
| НЕМЕДЛЕННО ОТКЛЮЧИТЕСЬ | Точка доступа должна быть немедленно отключена. Откладывать это нельзя. Режим глубокого сна запрещен. |
Источники пробуждения
Интегратор должен отключить соответствующие источники пробуждения, когда устройство находится в режиме ожидания. К распространенным источникам пробуждения относятся сигналы активности, модем, Wi-Fi и Bluetooth. Единственным допустимым источником пробуждения должно быть прерывание от VMCU для пробуждения SoC. Это предполагает, что VMCU может отслеживать события удаленного пробуждения от модема (например, удаленный запуск двигателя). Если эта функциональность передается на точку доступа, необходимо добавить еще один источник пробуждения для обслуживания модема.
Приложения
Производителям оборудования необходимо тщательно продумывать дизайн приложений, чтобы их можно было быстро отключить, а не откладывать этот процесс на неопределенный срок.
Приложение
Каталоги в дереве исходного кода
| Содержание | Каталог |
|---|---|
| Код, относящийся к CarPowerManager. | packages/services/Car/car-lib/src/android/car/hardware/power |
| CarPowerManagementService и так далее. | packages/services/Car/service/src/com/android/car/power |
Сервисы, работающие с VHAL, такие как VehicleHal и HAlClient . | packages/services/Car/service/src/com/android/car/hal |
| Определения интерфейса и свойств VHAL. | hardware/interfaces/automotive/vehicle/aidl/android/hardware/automotive/vehicle/ |
Пример приложения, дающий представление о CarPowerManager | packages/services/Car/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink |
Диаграмма классов
На этой диаграмме классов отображаются Java-классы и интерфейсы в системе управления питанием:

Рисунок 4. Диаграмма классов мощности.
Объектные отношения
На рисунке 5 показано, какие объекты имеют ссылки на другие объекты. Ребро означает, что исходный объект содержит ссылку на целевой объект. Например, объект VehicleHAL имеет ссылку на объект PropertyHalService.

Рисунок 5. Схема расположения объектов.