Para garantir que os componentes de hardware e software (como tela, áudio e interação por voz) sejam ativados e desativados seletivamente conforme necessário, o AAOS fornece uma política de energia, que consiste em um conjunto de estados de ativação e desativação esperados para componentes de hardware e software. A VHAL, ou serviços de fornecedor com privilégios do sistema, pode aplicar uma nova política de energia quando o estado de energia do Android muda ou quando as condições esperadas são atendidas.
A aplicação de uma política de energia é permitida nos estados de "Aguardar VHAL" e "Ligado" (às vezes com algumas restrições). No modo "Preparação para desligamento", o modo Garagem está em execução e não pode ser interrompido por uma mudança no estado de energia. Embora uma política de energia normal não possa ser aplicada, uma política de energia especial, que é a política de energia do sistema nomeada em nenhuma interação do usuário, é aplicada no Shutdown Prepare.
Estado de energia do AAOS
Os dispositivos AAOS seguem este diagrama de estado de energia:
Figura 1. Diagrama de estado de energia do AAOS.
Cada estado de energia é descrito abaixo:
Valor | Descrição |
---|---|
Desativado |
|
Aguardar VHAL |
|
Ativado |
|
Preparação para a desativação |
|
Aguarde a conclusão do VHAL |
|
Suspensão para RAM (STR, na sigla em inglês) |
|
Suspensão no disco (STD, na sigla em inglês) |
|
Como a política de energia é definida?
Os implementadores definem políticas de energia em /vendor/etc/automotive/power_policy.xml
,
que:
- Define a política de energia.
- Define grupos de políticas de energia, que incluem a política de energia padrão e são aplicados automaticamente quando ocorrem transições de estado de energia.
- Substitui a política de energia do sistema.
Política de energia
A política de energia consiste em um conjunto de estados de energia esperados de componentes de hardware e software. O AAOS oferece suporte aos seguintes componentes na política de energia:
ÁUDIO MÍDIA TELA BLUETOOTH |
WIFI CELULAR ETHERNET PROJEÇÃO |
NFC INPUT VOICE_INTERACTION VISUAL_INTERACTION |
TRUSTED_DEVICE_DETECTION LOCATION MICROPHONE CPU |
Os fornecedores também podem definir os próprios componentes de energia personalizados para uso com as políticas de energia. Defina componentes de energia personalizados no mesmo arquivo XML que as políticas de energia, como neste exemplo:
<customComponents>CUSTOM_COMPONENT_1000 CUSTOM_COMPONENT_SPECIAL_SENSOR CUSTOM_COMPONENT_AUX_INPUT </customComponents>
Grupo de políticas de energia
A política de energia padrão é aplicada automaticamente quando a transição do estado de energia é especificada no grupo de políticas de energia. Os fornecedores podem definir a política de energia padrão para "Aguardar VHAL", "Ligado" e "Aguardar VHAL terminar" (entrada em suspensão profunda ou início do desligamento).
Políticas de energia do sistema
O AAOS oferece suporte a duas políticas de energia do sistema, que são sem interação do usuário e suspensão de preparação. A política de energia do sistema é aplicada quando o dispositivo entra no modo silencioso, no modo garagem, no modo de suspensão para RAM ou no modo de suspensão para disco.
As tabelas a seguir listam o comportamento de cada componente na política de energia do sistema.
Os implementadores podem substituir a detecção de Bluetooth, NFC e dispositivos confiáveis na
política de energia do sistema sem interação do usuário. As substituições são aplicadas em
/vendor/etc/power_policy.xml
.
nenhuma interação do usuário
O comportamento da política de energia do sistema sem interação do usuário é definido nesta tabela:
Componentes | Estado de energia | Configurável |
---|---|---|
Áudio | Desativado | Não |
Mídia | Desativado | Não |
Tela | Desativado | Não |
Bluetooth | Desativado | Sim |
Wi-Fi | Ativado | Não |
Rede celular | Ativado | Não |
Ethernet | Ativado | Não |
Projeção | Desativado | Não |
NFC | Desativado | Sim |
Entrada | Desativado | Não |
Google Assistente | Desativado | Não |
Interação do usuário | Desativado | Não |
Detecção de dispositivo confiável para login do usuário | Ativado | Sim |
Local | Desativado | Não |
Microfone | Desativado | Não |
CPU | Ativado | Não |
suspender a preparação
O comportamento da política de energia do sistema suspend prep é definido nesta tabela:
Componentes | Estado de energia | Configurável pelo OEM |
---|---|---|
Áudio | Desativado | Não |
Mídia | N/A | Não |
Tela | N/A | Não |
Bluetooth | Desativado | Não |
Wi-Fi | Desativado | Não |
Rede celular | N/A | Não |
Ethernet | N/A | Não |
Projeção | N/A | Não |
NFC | N/A | Não |
Entrada | N/A | Não |
Google Assistente | N/A | Não |
Interação do usuário | N/A | Não |
Detecção de dispositivo confiável para login do usuário | N/A | Não |
Local | Desativado | Não |
Microfone | Desativado | Não |
CPU | Desativado | Não |
Interação com o VHAL
O daemon de política de energia do carro em execução na camada do sistema assina duas propriedades para detectar solicitações do VHAL:
POWER_POLICY_REQ
o VHAL grava o ID da política de energia nessa propriedade.POWER_POLICY_GROUP_REQ
o VHAL grava o ID do grupo de política de energia nesta propriedade.
A política de energia atual no sistema pode ser alterada por módulos diferentes do VHAL. Nesse caso,
o daemon de política de energia do carro atualiza a propriedade CURRENT_POWER_POLICY
para notificar a
mudança ao VHAL.
Interação com processos nativos
Como mencionado acima, o daemon de política de energia do carro é executado na camada do sistema e, em termos de gerenciamento de políticas de energia, oferece quase a mesma funcionalidade que o CPMS executado na camada do framework. Além disso, suponha que o daemon de política de energia do carro e o CPMS estejam totalmente sincronizados.
O daemon de política de energia do carro exporta interfaces AIDL para uso por HALs e outros processos nativos. Eles podem receber uma notificação quando uma nova política de energia for alterada. Em outras palavras, quando cada um precisa mudar o estado de energia.
ICarPowerPolicyServer.aidl
package android.frameworks.automotive.powerpolicy; import android.frameworks.automotive.powerpolicy.CarPowerPolicy; import android.frameworks.automotive.powerpolicy.CarPowerPolicyFilter; import android.frameworks.automotive.powerpolicy.ICarPowerPolicyChangeCallback; import android.frameworks.automotive.powerpolicy.PowerComponent; /** * ICarPowerPolicyServer is an interface implemented by the power policy daemon. * VHAL changes the power policy and the power policy daemon notifies the change to * registered subscribers. When subscribing to policy changes, a filter can be specified so * that the registered callbacks can listen only to a specific power component's change. */ @VintfStability interface ICarPowerPolicyServer { /** * Gets the current power policy. * @throws IllegalStateException if the current policy is not set. */ CarPowerPolicy getCurrentPowerPolicy(); /** * Gets whether the power component is turned on or off. * * @param componentId Power component ID defined in PowerComponent.aidl to check power * state. * @return True if the component's power state is on. * @throws IllegalArgumentException if the componentId is invalid. */ boolean getPowerComponentState(in PowerComponent componentId); /** * Subscribes to power policy change. * Notification is sent to the registered callback when the power policy changes and the * power state of the components which the callback is interested in changes. * * @param callback Callback that is invoked when the power policy changes. * @param filter The list of components which the callback is interested in. * @throws IllegalArgumentException if the callback is already registered. * @throws IllegalStateException if the callback is dead. */ void registerPowerPolicyChangeCallback(in ICarPowerPolicyChangeCallback callback, in CarPowerPolicyFilter filter); /** * Unsubscribes from power policy change. * * @param callback Callback that doesn't want to receive power policy change. * @throws IllegalArgumentException if the callback is not registered. */ void unregisterPowerPolicyChangeCallback(in ICarPowerPolicyChangeCallback callback); /** * Applies the power policy. * *{@code policyId} should be one of power policy IDs defined in * {@code /vendor/etc/automotive/power_policy.xml} or predefined system power policies. * * @param policyId ID of power policy. * @throws IllegalArgumentException if {@code policyId} is invalid. */ void applyPowerPolicy(in @utf8InCpp String policyId); /** * Sets the current power policy group. * *
{@code policyGroupId} should be one of power policy group IDs defined in * {@code /vendor/etc/automotive/power_policy.xml}. * * @param policyGroupId ID of power policy group. * @throws IllegalArgumentException if {@code policyGroupId} is invalid. */ void setPowerPolicyGroup(in @utf8InCpp String policyGroupId); }
ICarPowerPolicyChangeCallback.aidl
package android.frameworks.automotive.powerpolicy; import android.frameworks.automotive.powerpolicy.CarPowerPolicy; /** * ICarPowerPolicyChangeCallback is notified when a power policy changes. */ @VintfStability oneway interface ICarPowerPolicyChangeCallback { /** * Called when a power policy is fully changed. * * @param policy The current policy. */ void onPolicyChanged(in CarPowerPolicy policy); }
Interação com módulos Java
O CarPowerManager
fornece métodos para ativar o gerenciamento de políticas de energia:
- Acessar a política de energia atual
- Aplicar uma nova política de energia
- Definir um novo grupo de políticas de energia
Somente módulos com privilégios do sistema podem usar os métodos. Os módulos que querem ser
informados quando uma política de energia é aplicada podem registrar um listener de mudança de política de energia em
CarPowerManager
.