Para oferecer suporte ao gerenciamento de energia específico do veículo, o Android fornece um serviço CarPowerManagementService
e uma interface CarPowerManager
.
As transições de estado são acionadas pela Unidade de Controle Mestre do Veículo (VMCU). Para se comunicar com o VMCU, os integradores devem implementar vários componentes. Os integradores são responsáveis pela integração com a camada de abstração de hardware do veículo (VHAL) e a implementação do kernel. Os integradores também são responsáveis por desabilitar fontes de ativação e garantir que os desligamentos não sejam adiados indefinidamente.
Terminologia
Estes termos são usados ao longo deste documento:
suspend()
e shutdown()
.Projeto de sistema
Esta seção descreve como o AAOS representa o estado de energia do processador do aplicativo e quais módulos implementam o sistema de gerenciamento de energia. Este material também descreve como esses módulos funcionam juntos e como as transições de estado normalmente ocorrem.
Máquina de estado de energia do carro
AAOS usa uma máquina de estado para representar o estado de energia do AP. A máquina de estado fornece os estados ilustrados abaixo:
Figura 1. Máquina de estado de energia do carro
As transições mais comuns são destacadas em azul. Estes são os estados e transições comuns:
- Suspender para RAM. O veículo e o SoC estão desligados. Nenhum código está sendo executado. A energia é mantida na RAM do SoC.
- Aguarde VHAL. Quando o motorista interage com o veículo, por exemplo, abrindo uma porta, a VMCU alimenta o SoC. AAOS recomeça de Suspend-to-RAM e entra em Wait for VHAL, onde aguarda a coordenação com o VHAL.
- Sobre. O VHAL diz ao AAOS para entrar no estado On. Nesse estado, o AAOS está totalmente em execução e interagindo com o driver.
- Preparação para desligamento. Quando o motorista termina de dirigir, o VHAL diz ao AAOS para entrar no Shutdown Prepare. Nesse estado, a tela e o áudio estão desligados e o AAOS não está interagindo com o driver. O sistema Android ainda está em execução e é gratuito para atualizar aplicativos e o sistema Android. Quando as atualizações, se houver, forem concluídas, o sistema Android entrará em Wait for VHAL Finish.
- Aguarde o término do VHAL. Neste ponto, o AAOS informa ao VHAL que está pronto para desligar. Espera-se que a VMCU coloque o SoC em hibernação profunda e remova a energia do processador de aplicativos. O AAOS está então no estado Suspend-to-RAM, embora nenhum código esteja sendo executado.
Módulos de gerenciamento de energia
O sistema de gerenciamento de energia é composto por estes módulos:
Nome do módulo | Descrição |
---|---|
CarPowerManager | API Java ou C++. |
CarPowerManagementService | Coordena as transições de estado de energia. |
CarPowerPolicyDaemon | Comunica-se com os clientes da política de energia nativa. |
Veículo HAL | Interface com a VMCU. |
Núcleo | Suspender a implementação de RAM ou disco. |
O recurso de suspensão/hibernação profunda (suspendendo o Android para RAM/disco) é implementado no kernel. Esse recurso é exposto ao espaço do usuário como um arquivo especial localizado em /sys/power/state
. O AAOS é suspenso ao gravar mem
ou disk
neste arquivo.
O CPMS coordena o estado de energia com outros serviços e HALs. O CPMS implementa a máquina de estado descrita acima e envia notificações para todos os observadores quando ocorre uma transição de estado de energia. Este serviço também usa o VHAL para enviar mensagens ao hardware.
O CPPD gerencia a política de energia até que o CPMS assuma o controle. Ele também envia notificações de alteração de política de energia para os ouvintes nativos.
Algumas propriedades são definidas no VHAL. Para se comunicar com a VMCU, o CPMS lê e grava essas propriedades. os aplicativos podem usar a interface definida no CPM para monitorar mudanças no estado de energia. Essa interface também permite que os aplicativos registrem ouvintes de política de energia . Essa API pode ser chamada de Java e é anotada com @hide / @System API, o que significa que está disponível apenas para aplicativos privilegiados. A relação entre esses módulos, aplicativos e serviços é ilustrada abaixo:
Figura 2. Diagrama de referência dos componentes de potência
Sequência de mensagens
A seção anterior descreveu os módulos que compõem o sistema de gerenciamento de energia. Esta seção usa os exemplos de entrar em suspensão profunda e sair da suspensão profunda para explicar como os módulos e aplicativos se comunicam:
Entre no sono profundo
Somente a VMCU pode iniciar o sono profundo. Depois que o sono profundo é iniciado, o VMCU envia uma notificação ao CPMS por meio do VHAL. O CPMS altera o estado para SHUTDOWN PREPARE e transmite essa transição de estado para todos os observadores (os aplicativos e serviços que monitoram o CPMS) chamando o método onStateChanged()
com um novo ID de estado fornecido pelo CPM.
O CPM faz a mediação entre os aplicativos/serviços e o CPMS. O método onStateChanged()
para os aplicativos/serviços é chamado de forma síncrona no método onStateChanged()
do CPM. A maioria dos aplicativos e serviços é necessária para concluir sua preparação antes de retornar desta chamada. Os serviços privilegiados podem continuar suas preparações de forma assíncrona após o retorno para PRE_SHUTDOWN_PREPARE
, SUSPEND_ENTER
, POST_SUSPEND_ENTER
. Nesse caso, o serviço privilegiado deve chamar complete() no objeto CompletablePowerStateChangeFuture
fornecido quando terminar sua preparação. Observe que a preparação assíncrona não é permitida para SHUTDOWN_PREPARE
. Antes de DEEP_SLEEP_ENTRY
ser enviado ao VHAL, o CPMS envia periodicamente solicitações de adiamento de desligamento ao VHAL.
Quando todos os objetos CPM concluírem as preparações de desligamento, o CPMS envia AP_POWER_STATE_REPORT
para o VHAL, que então notifica o VMCU de que o AP está pronto para suspender. O CPMS também chama seu método suspend, que suspende o kernel.
A sequência descrita acima é ilustrada abaixo:
Figura 3. Entre no sono profundo
Interfaces de programação fornecidas pelo CPM
Esta seção descreve a API Java fornecida pelo CPM para aplicativos e serviços do sistema. Essa API permite que o software do sistema:
- Monitore as mudanças de estado de energia no AP.
- Aplicar políticas de energia.
Use estas etapas para chamar as APIs fornecidas pelo CPM:
- Para adquirir a instância CPM, chame a API Car.
- Chame o método apropriado no objeto criado na Etapa 1.
Criando um objeto CarPowerManager
Para criar um objeto CPM, chame o método getCarManager()
do objeto Carro. Este método é uma fachada usada para criar objetos CPM. Especifique android.car.Car.POWER_SERVICE
como um argumento para criar um objeto CPM.
Car car = Car.createCar(this); CarPowerManager powerManager = (CarPowerManager) car.getCarManager(android.car.Car.POWER_SERVICE);
CarPowerStateListener e registro
Aplicativos e serviços do sistema podem receber notificações de alteração de estado de energia implementando CarPowerManager.CarPowerStateListener
. Essa interface define um método onStateChanged()
, que é uma função de retorno de chamada invocada quando o estado de energia do CPMS é alterado. O exemplo a seguir define uma nova classe anônima que implementa a interface:
private final CarPowerManager.CarPowerStateListener powerListener = new CarPowerManager.CarPowerStateListener () { @Override public void onStateChanged(int state) { Log.i(TAG, "onStateChanged() state = " + state); } };
Para instruir este objeto ouvinte a monitorar uma transição de estado de energia, crie um novo encadeamento de execução e registre o ouvinte e este encadeamento no objeto CPM:
executor = new ThreadPerTaskExecutor(); powerManager.setListener(powerListener, executor);
Quando o estado de energia é alterado, o método onStateChanged()
do objeto ouvinte é invocado com um valor para representar o novo estado de energia. A associação entre o valor real e o estado de energia é definida no CarPowerManager
e é mostrada na tabela a seguir:
Nome | Descrição |
---|---|
STATE_ON | Digite o estado ligado. O sistema está totalmente operacional. |
STATE_SHUTDOWN_CANCELLED | O desligamento é cancelado e o estado de energia retorna ao estado normal. |
STATE_SHUTDOWN_ENTER | espera-se que os aplicativos sejam limpos e estejam prontos para serem desligados. |
STATE_POST_SHUTDOWN_ENTER | As preparações para desligar foram concluídas e a VMCU está pronta para desligar. Entre no estado de desligamento. |
STATE_PRE_SHUTDOWN_PREPARE | O processo de desligamento é solicitado, mas o CPMS ainda não inicia o processo. A exibição e o áudio ainda estão ativados |
STATE_SHUTDOWN_PREPARE | O Modo Garagem pode funcionar durante o período. |
STATE_SUSPEND_ENTER | espera-se que os aplicativos sejam limpos e estejam prontos para suspender para RAM. |
STATE_POST_SUSPEND_ENTER | As preparações para suspender para RAM foram concluídas e a VMCU está pronta para suspender para RAM. Entre no estado de suspensão. |
STATE_SUSPEND_EXIT | Acorde da suspensão ou retome de uma suspensão cancelada. |
STATE_HIBERNATION_ENTER | espera-se que os aplicativos sejam limpos e estejam prontos para a hibernação. |
STATE_POST_HIBERNATION_ENTER | As preparações para hibernação foram concluídas e a VMCU está pronta para hibernação Entre no estado de hibernação. |
STATE_HIBERNATION_EXIT | Acorde da hibernação ou retome de uma hibernação cancelada. |
STATE_WAIT_FOR_VHAL | O sistema está inicializando, mas aguardando estabelecer comunicação com o VHAL antes de passar para o estado ON. |
Cancelamento de registro do CarPowerStateListener
Para cancelar o registro de todos os objetos ouvintes registrados no CPM, chame o método clearListener
:
powerManager.clearListener();
Integração do sistema na sua implementação Android
Os integradores são responsáveis pelos seguintes itens:
- Implementando a interface do kernel para suspender o Android.
- Implementando as funções VHAL para:
- Propagar o início da suspensão ou desligamento do carro para o Android.
- Envie a mensagem de desligamento pronto do Android para o carro.
- Inicie o desligamento ou suspensão do Android por meio da interface do kernel do Linux.
- Certifique-se de que todas as fontes de ativação estejam desativadas quando o dispositivo estiver em suspensão.
- Certifique-se de que os aplicativos sejam encerrados com rapidez suficiente para não adiar indefinidamente o processo de desligamento.
- Certifique-se de que o BSP liga (ou desliga) os componentes do dispositivo de acordo com a política de energia para não bloquear a suspensão ou hibernação
Interface do kernel: /sys/power/state
AAOS coloca um dispositivo no modo de suspensão quando um aplicativo ou serviço grava mem
para suspender para RAM ou disk
para suspender para disco em um arquivo localizado em /sys/power/state
. O integrador deve fornecer uma função que monitore esse arquivo e coloque o Linux no estado de suspensão de energia. Esta função pode enviar um GPIO para a VMCU para notificar a VMCU de que o dispositivo foi completamente desligado. O Integrador também é responsável por remover quaisquer condições de corrida entre VHAL enviando a mensagem final para a VMCU e o sistema entrando em modo de suspensão ou desligamento.
responsabilidade VHAL
O VHAL fornece uma interface entre a rede do veículo e o Android. O VHAL:
- Propaga o início da suspensão ou desligamento do carro para o Android.
- Envia a mensagem de desligamento pronto do Android para o carro.
- Inicia o desligamento ou suspensão do Android por meio da interface do kernel do Linux.
Quando o CPMS informa ao VHAL que está pronto para desligar, o VHAL envia a mensagem de desligamento pronto para o VMCU. Normalmente, os periféricos no chip, como UART, SPI e USB, transmitem a mensagem. Depois que a mensagem é enviada, o CPMS chama o comando do kernel para suspender ou desligar o dispositivo. Antes de fazer isso, o VHAL ou BSP pode alternar um GPIO para instruir a VMCU de que é seguro remover a energia do dispositivo.
O VHAL deve suportar as seguintes propriedades, que controlam o gerenciamento de energia por meio do VHAL:
Nome | Descrição |
---|---|
AP_POWER_STATE_REPORT | O Android relata transições de estado para a VMCU com essa propriedade, usando valores de enumeração VehicleApPowerStateReport. |
AP_POWER_STATE_REQ | A VMCU usa essa propriedade para instruir o Android a fazer a transição para diferentes estados de energia, usando valores de enumeração VehicleApPowerStateReq. |
AP_POWER_STATE_REPORT
Use esta propriedade para relatar o estado atual do gerenciamento de energia do Android. Esta propriedade contém dois números inteiros:
-
int32Values[0]
: enumeração VehicleApPowerStateReport do estado atual. -
int32Values[1]
: Tempo em milissegundos para adiar, dormir ou desligar. O significado desse valor depende do primeiro valor.
O primeiro valor pode assumir um dos seguintes valores. VehicleApPowerStateReport.aidl
contém descrições mais específicas, que são armazenadas em hardware/interfaces/automotive/vehicle/aidl/android/hardware/automotive/vehicle
.
Nome do valor | Descrição | segundo valor |
---|---|---|
WAIT_FOR_VHAL | O AP está iniciando e precisa estabelecer comunicação com o VHAL. | |
DEEP_SLEEP_ENTRY | O AP está entrando no estado de hibernação profunda. A VMCU deve ligar o AP novamente após o tempo especificado no segundo valor. | Deve ser definido |
DEEP_SLEEP_EXIT | O AP está saindo do estado de hibernação profunda. | |
HIBERNATION_ENTRY | O AP está entrando no estado de hibernação. A VMCU deve ligar o AP novamente após o tempo especificado no segundo valor. | Deve ser definido |
HIBERNATION_EXIT | O AP está saindo do estado de hibernação. | |
SHUTDOWN_POSTPONE | O Android não está pronto para desligar. A VMCU deve aguardar o tempo especificado no segundo valor antes de desligar o AP. O Android pode solicitar adiamento adicional emitindo relatórios SHUTDOWN_POSTPONE adicionais. | Deve ser definido |
SHUTDOWN_PREPARE | Android está se preparando para desligar. | Deve ser definido |
SHUTDOWN_START | O AP está pronto para desligar. A VMCU deve ligar o AP novamente após o tempo especificado no segundo valor. (A VMCU não é necessária para oferecer suporte ao recurso de ativação programada.) | Deve ser definido |
SHUTDOWN_CANCELLED | O Android está parando de se preparar para desligar e prosseguirá para WAIT_FOR_VHAL. | |
SOBRE | O Android está rodando normalmente. |
O estado pode ser definido de forma autônoma ou em resposta a uma solicitação via VMCU.
AP_POWER_STATE_REQ
Essa propriedade é enviada pela VMCU para fazer a transição do Android para um estado de energia diferente e contém dois números inteiros:
-
int32Values[0]
: valor enumVehicleApPowerStateReq
, que representa o novo estado para o qual fazer a transição. -
int32Values[1]
: Valor de enumVehicleApPowerStateShutdownParam
. Este valor é enviado apenas para uma mensagemSHUTDOWN_PREPARE
e transmite ao Android as opções que contém.
O primeiro valor inteiro representa o novo estado para o qual o Android transitará. A semântica é definida em VehicleApPowerStateReq.aidl
e fornecida abaixo:
Nome do valor | Descrição |
---|---|
SOBRE | AP deve começar a operação completa. |
SHUTDOWN_PREPARE | O AP deve se preparar para desligar. O segundo valor indica se o AP pode adiar o desligamento e se o AP deve esperar desligar ou entrar em hibernação profunda. |
CANCEL_SHUTDOWN | O AP deve parar de se preparar para desligar e se preparar para ON. |
FINALIZADO | O AP agora será desligado ou suspenso. |
VehicleApPowerStateShutdownParam
é definido em VehicleApPowerStateShutdownParam.aidl
. Este enum tem estes elementos:
Nome do valor | Descrição |
---|---|
PODE DORMIR | O AP pode entrar em suspensão profunda em vez de desligar completamente. O adiamento é permitido. |
CAN_HIBERNATE | O AP pode entrar em hibernação em vez de desligar completamente. O adiamento é permitido. |
SHUTDOWN_ONLY | AP deve desligar. O adiamento é permitido. O sono profundo não é permitido. |
SLEEP_IMMEDIATELY | O AP pode entrar em hibernação profunda, mas deve dormir ou desligar imediatamente. Não é permitido adiar. |
HIBERNATE_IMMEDIATELY | O AP pode entrar em suspensão no disco, mas deve hibernar ou desligar imediatamente. Não é permitido adiar. |
SHUTDOWN_IMMEDIATELY | O AP deve desligar imediatamente. Não é permitido adiar. O sono profundo não é permitido. |
Fontes de ativação
O integrador deve desabilitar as fontes de ativação apropriadas quando o dispositivo estiver no modo de suspensão. Fontes de ativação comuns incluem pulsações, modem, Wi-Fi e Bluetooth. A única fonte de ativação válida deve ser uma interrupção da VMCU para ativar o SoC. Isso pressupõe que a VMCU pode ouvir o modem para eventos de ativação remota (como partida remota do motor). Se essa funcionalidade for enviada para o AP, outra fonte de ativação para atender o modem deverá ser adicionada.
aplicativos
Os OEMs devem ter o cuidado de escrever aplicativos para que possam ser encerrados rapidamente e não adiar o processo indefinidamente.
Apêndice
Diretórios na árvore de código-fonte
Contente | Diretório |
---|---|
Código relacionado ao CarPowerManager. | packages/services/Car/car-lib/src/android/car/hardware/power |
CarPowerManagementService e assim por diante. | packages/services/Car/service/src/com/android/car/power |
Serviços que lidam com o VHAL, como VehicleHal e HAlClient . | packages/services/Car/service/src/com/android/car/hal |
Interface VHAL e definições de propriedade. | hardware/interfaces/automotive/vehicle/aidl/android/hardware/automotive/vehicle/ |
Aplicativo de amostra para fornecer uma ideia sobre o CarPowerManager | packages/services/Car/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink |
diagrama de classes
Este diagrama de classes exibe as classes e interfaces Java no sistema de gerenciamento de energia:
Figura 5. Diagrama de classe de potência
relacionamento de objeto
O gráfico a seguir ilustra quais objetos têm referências a outros objetos. Uma aresta significa que o objeto de origem contém uma referência ao objeto de destino. Por exemplo, VehicleHAL tem uma referência a um objeto PropertyHalService.
Figura 6. Diagrama de referência do objeto