Aby zapewnić selektywne włączanie i wyłączanie komponentów sprzętowych i oprogramowania (takich jak wyświetlacz, dźwięk i interakcja głosowa) w razie potrzeby, AAOS udostępnia zasadę dotyczącą zasilania, która składa się z zestawu oczekiwanych stanów włączenia i wyłączenia komponentów sprzętowych i oprogramowania. VHAL lub usługi dostawcy z uprawnieniami systemowymi mogą zastosować nową zasadę dotyczącą zasilania, gdy zmieni się stan zasilania Androida lub gdy zostaną spełnione warunki, na które czekają.
Stosowanie zasady dotyczącej zasilania jest dozwolone w stanach Wait for VHAL i On (czasami z pewnymi ograniczeniami). W stanie Shutdown Prepare działa tryb garażowy, którego nie powinna zakłócać zmiana stanu zasilania. W stanie Shutdown Prepare nie można zastosować zwykłej zasady dotyczącej zasilania, ale można zastosować specjalną zasadę dotyczącą zasilania, czyli zasadę systemową o nazwie no user interaction.
Stan zasilania AAOS
Urządzenia AAOS działają zgodnie z tym diagramem stanu zasilania:

Rysunek 1. Diagram stanu zasilania AAOS.
Każdy stan zasilania jest opisany poniżej:
| Wartość | Opis |
|---|---|
| Wył. |
|
| Czekaj na VHAL |
|
| Wł. |
|
| Przygotowanie do wyłączenia |
|
| Czekaj na zakończenie VHAL |
|
| Suspend-to-RAM (STR) |
|
| Suspend-to-disk (STD) |
|
Jak definiuje się zasadę dotyczącą zasilania?
Implementatorzy definiują zasady dotyczące zasilania w pliku /vendor/etc/automotive/power_policy.xml,
który:
- definiuje zasadę dotyczącą zasilania,
- definiuje grupy zasad dotyczących zasilania, które obejmują domyślną zasadę dotyczącą zasilania i są automatycznie stosowane, gdy zmienia się stan zasilania,
- zastępuje zasadę systemową dotyczącą zasilania.
Zasada dotycząca zasilania
Zasada dotycząca zasilania składa się z zestawu oczekiwanych stanów zasilania komponentów sprzętowych i oprogramowania. AAOS obsługuje te komponenty w zasadzie dotyczącej zasilania:
|
AUDIO MEDIA DISPLAY BLUETOOTH |
WIFI CELLULAR ETHERNET PROJECTION |
NFC INPUT VOICE_INTERACTION VISUAL_INTERACTION |
TRUSTED_DEVICE_DETECTION LOCATION MICROPHONE CPU |
Dostawcy mogą też definiować własne niestandardowe komponenty zasilania do użycia z zasadami dotyczącymi zasilania. Zdefiniuj niestandardowe komponenty zasilania w tym samym pliku XML co zasady dotyczące zasilania, jak w tym przykładzie:
<customComponents>CUSTOM_COMPONENT_1000 CUSTOM_COMPONENT_SPECIAL_SENSOR CUSTOM_COMPONENT_AUX_INPUT </customComponents>
Grupa zasad dotyczących zasilania
Grupa zasad dotyczących zasilania określa domyślną zasadę dotyczącą zasilania, która ma być automatycznie stosowana podczas zmiany stanu zasilania. Dostawcy mogą zdefiniować domyślną zasadę dotyczącą zasilania dla stanów Wait For VHAL, On i Wait for VHAL Finish (Deep Sleep Entry lub Shutdown Start).
Zasady systemowe dotyczące zasilania
AAOS obsługuje 2 zasady systemowe dotyczące zasilania: no user interaction i suspend prep. Zasada systemowa dotycząca zasilania jest stosowana, gdy urządzenie przechodzi w tryb cichy, tryb garażowy, tryb Suspend-to-RAM lub tryb Suspend-to-disk.
W tabelach poniżej znajdziesz informacje o działaniu każdego komponentu w zasadzie systemowej dotyczącej zasilania.
Implementatorzy mogą zastąpić Bluetooth, NFC i wykrywanie zaufanych urządzeń w
zasadzie systemowej dotyczącej zasilania no user interaction. Zastąpienia są stosowane w
/vendor/etc/power_policy.xml.
no user interaction
Działanie zasady systemowej dotyczącej zasilania no user interaction jest zdefiniowane w tej tabeli:
| Komponenty | Stan zasilania | Można konfigurować |
|---|---|---|
| Audio | Wył. | Nie |
| Multimedia | Wył. | Nie |
| Wyświetlacz | Wył. | Nie |
| Bluetooth | Wył. | Tak |
| Wi-Fi | Wł. | Nie |
| Sieć komórkowa | Wł. | Nie |
| Ethernet | Wł. | Nie |
| Odwzorowanie | Wył. | Nie |
| NFC | Wył. | Tak |
| Dane wejściowe | Wył. | Nie |
| Asystent | Wył. | Nie |
| Interakcja | Wył. | Nie |
| Wykrywanie zaufanych urządzeń na potrzeby logowania użytkownika | Wł. | Tak |
| Lokalizacja | Wył. | Nie |
| Mikrofon | Wył. | Nie |
| CPU | Wł. | Nie |
suspend prep
Działanie zasady systemowej dotyczącej zasilania suspend prep jest zdefiniowane w tej tabeli:
| Komponenty | Stan zasilania | Można konfigurować |
|---|---|---|
| Audio | Wył. | Nie |
| Multimedia | Nie dotyczy | Nie |
| Wyświetlacz | Nie dotyczy | Nie |
| Bluetooth | Wył. | Nie |
| Wi-Fi | Wył. | Nie |
| Sieć komórkowa | Nie dotyczy | Nie |
| Ethernet | Nie dotyczy | Nie |
| Odwzorowanie | Nie dotyczy | Nie |
| NFC | Nie dotyczy | Nie |
| Dane wejściowe | Nie dotyczy | Nie |
| Asystent | Nie dotyczy | Nie |
| Interakcja | Nie dotyczy | Nie |
| Wykrywanie zaufanych urządzeń na potrzeby logowania użytkownika | Nie dotyczy | Nie |
| Lokalizacja | Wył. | Nie |
| Mikrofon | Wył. | Nie |
| CPU | Wył. | Nie |
Interakcja z VHAL
Demon zasad dotyczących zasilania samochodu działający w warstwie systemowej subskrybuje 2 właściwości, aby nasłuchiwać żądań z VHAL:
POWER_POLICY_REQ– VHAL zapisuje identyfikator zasady dotyczącej zasilania w tej właściwości.POWER_POLICY_GROUP_REQ– VHAL zapisuje identyfikator grupy zasad dotyczących zasilania w tej właściwości.
Bieżącą zasadę dotyczącą zasilania w systemie mogą zmieniać moduły inne niż VHAL. W takim przypadku,
demon zasad dotyczących zasilania samochodu aktualizuje właściwość CURRENT_POWER_POLICY, aby powiadomić
VHAL o zmianie.
Interakcja z procesami natywnymi
CarPowerManagementService (CPMS) deleguje zarządzanie zasadami dotyczącymi zasilania do demona zasad dotyczących zasilania samochodu. Demon jest jedynym źródłem wiarygodnych danych dotyczących zasad dotyczących zasilania w systemie. Demon zasad dotyczących zasilania samochodu zarządza stanem zasad dotyczących zasilania i powiadamia CPMS, VHAL oraz innych klientów natywnych o zmianach.
Demon zasad dotyczących zasilania samochodu eksportuje interfejsy AIDL do użytku przez HAL i inne procesy natywne. Mogą one otrzymywać powiadomienia o zmianie nowej zasady dotyczącej zasilania. Innymi słowy, gdy każdy z nich musi zmienić swój stan zasilania.
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);
}
Interakcja z modułami Java
CarPowerManager udostępnia metody umożliwiające zarządzanie zasadami dotyczącymi zasilania:
- Pobieranie bieżącej zasady dotyczącej zasilania
- Stosowanie nowej zasady dotyczącej zasilania
- Ustawianie nowej grupy zasad dotyczących zasilania
Z tych metod mogą korzystać tylko moduły z uprawnieniami systemowymi. Moduły, które chcą otrzymywać informacje o zastosowaniu zasady dotyczącej zasilania, mogą zarejestrować odbiorcę zmian zasad dotyczących zasilania w
CarPowerManager.