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 Mestre de Controle do Veículo (VMCU). Para se comunicarem com a 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 pela 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 normalmente ocorrem as transições de estado.
Máquina de estado de potência do carro
AAOS usa uma máquina de estado para representar o estado de energia do AP. A máquina de estados fornece os estados ilustrados abaixo:
Figura 1. Máquina de estado de potência do carro.
As transições mais comuns estã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 SoC.
- Aguarde VHAL. Quando o motorista interage com o veículo, por exemplo, abrindo uma porta, o VMCU aplica energia ao SoC. AAOS retoma 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. Neste 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 entra em Aguardar VHAL Finish.
- Aguarde o término do VHAL. Neste ponto, a AAOS informa ao VHAL que está pronto para desligar. Espera-se que a VMCU coloque o SoC em suspensão profunda e remova a energia do processador do aplicativo. O AAOS está então no estado Suspenso para 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 de política de energia nativa. |
Veículo HAL | Interface com o VMCU. |
Núcleo | Suspender para implementação de RAM ou disco. |
O recurso de suspensão/hibernação profunda (suspendendo o Android para RAM/disco) é implementado no kernel. Este recurso é exposto ao espaço do usuário como um arquivo especial localizado em /sys/power/state
. AAOS é suspenso gravando 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 estados descrita acima e envia notificações a todos os observadores quando ocorre uma transição de estado de energia. Este serviço também utiliza o VHAL para enviar mensagens ao hardware.
O CPPD gere a política energética até que o CPMS assuma o controlo. Ele também envia notificações de alteração de política de energia aos ouvintes nativos.
Algumas propriedades são definidas no VHAL. Para se comunicar com o VMCU, o CPMS lê e grava essas propriedades. os aplicativos podem usar a interface definida no CPM para monitorar alterações no estado de energia. Essa interface também permite que os aplicativos registrem ouvintes de políticas 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 entrada em suspensão profunda e saída de suspensão profunda para explicar como os módulos e aplicativos se comunicam:
Entre no sono profundo
Somente o VMCU pode iniciar o sono profundo. Uma vez iniciado o sono profundo, o VMCU envia uma notificação ao CPMS através 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 aplicativos/serviços é invocado de forma síncrona no método onStateChanged()
do CPM. A maioria dos aplicativos e serviços precisam concluir a preparação antes de retornar desta chamada. Os serviços privilegiados podem continuar seus preparativos de forma assíncrona após retornarem 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íram os preparativos de desligamento, o CPMS envia AP_POWER_STATE_REPORT
para o VHAL, que então notifica o VMCU 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. Esta API permite que o software do sistema:
- Monitore as alterações do 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.
Crie 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 argumento para criar um objeto CPM.
Car car = Car.createCar(this); CarPowerManager powerManager = (CarPowerManager) car.getCarManager(android.car.Car.POWER_SERVICE);
CarPowerStateListener e registro
Os aplicativos e serviços do sistema podem receber notificações de alteração do estado de energia implementando CarPowerManager.CarPowerStateListener
. Esta 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 esse objeto ouvinte a monitorar uma transição de estado de energia, crie um novo encadeamento de execução e registre o ouvinte e esse 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 |
---|---|
ESTADO_ON | Entre no estado ligado. O sistema está totalmente operacional. |
ESTADO_SHUTDOWN_CANCELLED | O desligamento é cancelado e o estado de energia retorna ao estado normal. |
ESTADO_SHUTDOWN_ENTER | espera-se que os aplicativos sejam limpos e estejam prontos para serem encerrados. |
STATE_POST_SHUTDOWN_ENTER | Os preparativos para o encerramento foram concluídos e o VMCU está pronto para o encerramento. Entre no estado de desligamento. |
ESTADO_PRE_SHUTDOWN_PREPARE | O processo de desligamento é solicitado, mas o CPMS ainda não inicia o processo. A tela e o áudio ainda estão ativados |
ESTADO_SHUTDOWN_PREPARE | O Modo Garagem pode funcionar durante o período. |
ESTADO_SUSPEND_ENTER | espera-se que os aplicativos sejam limpos e estejam prontos para suspensão na RAM. |
STATE_POST_SUSPEND_ENTER | Os preparativos para suspensão para RAM foram concluídos e o VMCU está pronto para suspensão para RAM. Entre no estado de suspensão. |
ESTADO_SUSPEND_EXIT | Acorde da suspensão ou retome de uma suspensão cancelada. |
ESTADO_HIBERNATION_ENTER | espera-se que os aplicativos sejam limpos e estejam prontos para a hibernação. |
STATE_POST_HIBERNATION_ENTER | Os preparativos para a hibernação foram concluídos e o VMCU está pronto para a hibernação. Entre no estado de hibernação. |
ESTADO_HIBERNATION_EXIT | Acorde da hibernação ou retome de uma hibernação cancelada. |
ESTADO_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 de CarPowerStateListener
Para cancelar o registro de todos os objetos listener 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:
- Propague 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 Linux.
- Certifique-se de que todos os wakesources estejam desabilitados quando o dispositivo estiver suspenso.
- 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 ligue (ou desligue) 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 suspensão na RAM ou disk
para suspensão no 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 ao VMCU para notificar o VMCU de que o dispositivo foi completamente desligado. O integrador também é responsável por remover quaisquer condições de corrida entre o VHAL enviando a mensagem final para o VMCU e o sistema entrando no 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 Linux.
Quando o CPMS informa ao VHAL que está pronto para desligar, o VHAL envia a mensagem de desligamento pronto para o VMCU. Normalmente, periféricos no chip, como UART, SPI e USB, transmitem a mensagem. Assim que a mensagem for enviada, o CPMS chama o comando do kernel para suspender ou desligar o dispositivo. Antes de fazer isso, o VHAL ou o BSP podem alternar um GPIO para instruir o VMCU de que é seguro remover a energia do dispositivo.
O VHAL deve suportar as seguintes propriedades, que controlam o gerenciamento de energia através do VHAL:
Nome | Descrição |
---|---|
AP_POWER_STATE_REPORT | O Android relata transições de estado para o VMCU com essa propriedade, usando valores enum 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 enum VehicleApPowerStateReq. |
AP_POWER_STATE_REPORT
Use esta propriedade para relatar o estado atual de gerenciamento de energia do Android. Esta propriedade contém dois inteiros:
-
int32Values[0]
: enum VehicleApPowerStateReport do estado atual. -
int32Values[1]
: Tempo em milissegundos para adiar, suspender ou desligar. O significado deste 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 |
---|---|---|
ESPERE_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 novamente o AP 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 novamente o AP 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 |
DESLIGAR_PREPARE | O Android está se preparando para desligar. | Deve ser definido |
DESLIGAR_START | O AP está pronto para desligar. A VMCU deve ligar novamente o AP após o tempo especificado no segundo valor. (O VMCU não é necessário para oferecer suporte ao recurso de ativação cronometrada.) | Deve ser definido |
DESLIGAMENTO_CANCELADO | O Android está parando de se preparar para desligar e prosseguirá para WAIT_FOR_VHAL. | |
SOBRE | O Android está funcionando normalmente. |
O estado pode ser definido de forma autônoma ou em resposta a uma solicitação via VMCU.
AP_POWER_STATE_REQ
Esta propriedade é enviada pelo 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 enumVehicleApPowerStateShutdownParam
. Este valor é enviado apenas para uma mensagemSHUTDOWN_PREPARE
e transmite ao Android as opções que ela contém.
O primeiro valor inteiro representa o novo estado no qual o Android transitará. A semântica é definida em VehicleApPowerStateReq.aidl
e fornecida abaixo:
Nome do valor | Descrição |
---|---|
SOBRE | O AP deverá iniciar operação plena. |
DESLIGAR_PREPARE | O AP deve se preparar para desligar. O segundo valor indica se o AP tem permissão para adiar o desligamento e se o AP deve esperar desligar ou entrar em suspensão profunda. |
CANCEL_SHUTDOWN | O AP deve parar de se preparar para desligar e se preparar para ligar. |
FINALIZADO | O AP agora será encerrado ou suspenso. |
VehicleApPowerStateShutdownParam
é definido em VehicleApPowerStateShutdownParam.aidl
. Este enum possui estes elementos:
Nome do valor | Descrição |
---|---|
PODE DORMIR | O AP pode entrar em suspensão profunda em vez de desligar completamente. Adiar é permitido. |
CAN_HIBERNATE | O AP pode entrar em hibernação em vez de desligar completamente. Adiar é permitido. |
DESLIGAR_SOMENTE | O AP deve desligar. Adiar é permitido. O sono profundo não é permitido. |
DORMIR_IMMEDIATAMENTE | O AP pode entrar em sono profundo, mas deve dormir ou desligar imediatamente. Adiar não é permitido. |
HIBERNATE_IMMEDIATELY | O AP pode entrar em suspensão para disco, mas deve hibernar ou desligar imediatamente. Adiar não é permitido. |
DESLIGAR_IMMEDIATAMENTE | O AP deve desligar imediatamente. Adiar não é permitido. O sono profundo não é permitido. |
Fontes de despertar
O integrador deve desabilitar as fontes de ativação apropriadas quando o dispositivo estiver no modo de suspensão. As fontes de ativação comuns incluem batimentos cardíacos, 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 possa escutar o modem em busca de eventos de ativação remota (como partida remota do mecanismo). Se esta funcionalidade for enviada ao AP, outra fonte de ativação para atender o modem deverá ser adicionada.
Aplicativos
Os OEMs devem ter cuidado ao escrever aplicativos para que possam ser encerrados rapidamente e não adiar o processo indefinidamente.
Apêndice
Diretórios na árvore do 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 tratam do VHAL, como VehicleHal e HAlClient . | packages/services/Car/service/src/com/android/car/hal |
Interface VHAL e definições de propriedades. | hardware/interfaces/automotive/vehicle/aidl/android/hardware/automotive/vehicle/ |
Aplicativo de exemplo 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 4. Diagrama de classes de potência.
Relacionamento de objeto
A Figura 5 ilustra quais objetos possuem 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 5. Diagrama de referência de objetos.