Aby zapewnić selektywne włączanie i wyłączanie komponentów sprzętowych i programowych (takich jak wyświetlacz, dźwięk i interakcja głosowa) w razie potrzeby, AAOS udostępnia zasady zasilania, które składają się z zestawu oczekiwanych stanów włączenia i wyłączenia komponentów sprzętowych i programowych. VHAL lub usługi dostawcy z uprawnieniami systemowymi mogą zastosować nowe zasady zasilania, gdy zmieni się stan zasilania Androida lub zostaną spełnione warunki, na które czekają.
Zastosowanie zasady zasilania jest dozwolone w stanach Oczekiwanie na VHAL, Włączone i Przygotowanie do wyłączenia (czasami z pewnymi ograniczeniami). W odróżnieniu od stanów Wait for VHAL i On, w grupie zasad zasilania nie można skonfigurować domyślnej zasady zasilania dla stanu Pre Shutdown Prepare. W podstawowej fazie przygotowania do wyłączenia tryb garażowy jest uruchomiony i nie powinien być zakłócany przez zmianę stanu zasilania. Chociaż nie można zastosować zwykłej zasady dotyczącej zasilania, w fazie przygotowania do wyłączenia systemu stosowana jest specjalna zasada dotycząca zasilania, która jest zasadą dotyczącą zasilania systemu o nazwie brak interakcji z użytkownikiem.
Stan zasilania AAOS
Urządzenia z AAOS działają zgodnie z tym diagramem stanu zasilania:
Rysunek 1. Schemat stanu zasilania AAOS.
Poniżej opisujemy poszczególne stany zasilania:
| Wartość | Opis |
|---|---|
| Wyłączono |
|
| Czekaj na VHAL |
|
| Włączono |
|
| Przygotowanie do wyłączenia |
|
| Poczekaj na zakończenie działania VHAL |
|
| Suspend-to-RAM (STR) |
|
| zawieszenie na dysku (STD), |
|
Jak definiowane są zasady dotyczące zasilania?
Implementujący definiują zasady zasilania w pliku /vendor/etc/automotive/power_policy.xml, który:
- Definiuje zasady dotyczące zasilania.
- Definiuje grupy zasad zasilania, które obejmują domyślne zasady zasilania i są automatycznie stosowane, gdy następuje zmiana stanu zasilania.
- Zastępuje zasady zasilania systemu.
Zasady dotyczące zasilania
Zasady zasilania składają się z zestawu oczekiwanych stanów zasilania komponentów sprzętowych i oprogramowania. AAOS obsługuje te komponenty w zasadach dotyczących zasilania:
|
AUDIO MEDIA DISPLAY BLUETOOTH |
WI-FI KOMÓRKOWA ETHERNET PROJEKCJA |
NFC INPUT VOICE_INTERACTION VISUAL_INTERACTION |
WYKRYWANIE ZAUFANYCH URZĄDZEŃ LOKALIZACJA MIKROFON PROCESOR |
Dostawcy mogą też definiować własne niestandardowe komponenty zasilania do użycia z zasadami zasilania. Zdefiniuj niestandardowe komponenty zasilania w tym samym pliku XML co zasady 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 zasilania określa domyślną zasadę zasilania, która ma być automatycznie stosowana przy zmianach stanu zasilania. Dostawcy mogą określić domyślne zasady zasilania dla stanów „Oczekiwanie na VHAL” i „Włączone”.
Domyślna zasada zasilania dla stanu Oczekiwanie na VHAL lub Włączone jest stosowana przy każdym przejściu do tego stanu, w tym po anulowaniu wyłączenia i powrocie Androida do stanu Oczekiwanie na VHAL. Jeśli dla danego stanu w bieżącej grupie zasad zasilania nie zdefiniowano domyślnej zasady zasilania, demon zasad zasilania samochodu stosuje wbudowaną zasadę zasilania. Wyjątkiem jest sytuacja, gdy system jest w trybie cichym: demon zasad zasilania samochodu zapisuje bieżące lub żądane zwykłe zasady zasilania jako oczekujące, blokuje zmiany zwykłych zasad zasilania i stosuje zasady zasilania systemu bez interakcji z użytkownikiem. Zastosowanie zasady dotyczącej zasilania zmienia tylko komponenty, które są objęte zasadą, pozostawiając nieobjęte komponenty w ich obecnym stanie.
Zasady systemowe dotyczące zasilania
AAOS obsługuje 2 zasady zasilania systemu: brak interakcji z użytkownikiem i przygotowanie do zawieszenia. Zasady zasilania systemu są stosowane, gdy urządzenie przechodzi w tryb cichy, tryb garażowy, tryb uśpienia z zapisem w pamięci RAM lub tryb uśpienia z zapisem na dysku.
W poniższych tabelach opisano zachowanie poszczególnych komponentów w ramach systemowych zasad zasilania.
Implementujący mogą zastąpić wykrywanie Bluetooth, NFC i zaufanych urządzeń w zasadach zasilania systemu bez interakcji użytkownika. Zastąpienia są stosowane w /vendor/etc/automotive/power_policy.xml.
brak interakcji użytkownika
Sposób działania zasady zasilania systemu brak interakcji użytkownika jest opisany w tej tabeli:
| Komponenty | Stan zasilania | Można konfigurować |
|---|---|---|
| Dźwięk | Wyłączono | Nie |
| Multimedia | Wyłączono | Nie |
| Wyświetlacz | Wyłączono | Nie |
| Bluetooth | Wyłączono | Tak |
| Wi-Fi | Włączono | Nie |
| Sieć komórkowa | Włączono | Nie |
| Ethernet | Włączono | Nie |
| Odwzorowanie | Wyłączono | Nie |
| NFC | Wyłączono | Tak |
| Dane wejściowe | Wyłączono | Nie |
| Asystent | Wyłączono | Nie |
| Interakcja użytkownika | Wyłączono | Nie |
| Wykrywanie zaufanych urządzeń podczas logowania użytkownika | Włączono | Tak |
| Lokalizacja | Wyłączono | Nie |
| Mikrofon | Wyłączono | Nie |
| CPU | Włączono | Nie |
zawieszenie przygotowania
Działanie zasady zasilania systemu przygotowanie do zawieszenia jest opisane w tej tabeli:
| Komponenty | Stan zasilania | Możliwość konfiguracji przez producenta OEM |
|---|---|---|
| Dźwięk | Wyłączono | Nie |
| Multimedia | Nie dotyczy | Nie |
| Wyświetlacz | Nie dotyczy | Nie |
| Bluetooth | Wyłączono | Nie |
| Wi-Fi | Wyłączono | 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 użytkownika | Nie dotyczy | Nie |
| Wykrywanie zaufanych urządzeń podczas logowania użytkownika | Nie dotyczy | Nie |
| Lokalizacja | Wyłączono | Nie |
| Mikrofon | Wyłączono | Nie |
| CPU | Wyłączono | Nie |
Interakcja z VHAL
Demon zasad zasilania samochodu działający w warstwie systemowej subskrybuje 2 właściwości, aby nasłuchiwać żądań z VHAL:
POWER_POLICY_REQVHAL zapisuje identyfikator zasad zasilania w tej właściwości.POWER_POLICY_GROUP_REQVHAL zapisuje identyfikator grupy zasad zasilania w tej właściwości.
Bieżące zasady zasilania w systemie mogą być zmieniane przez moduły inne niż VHAL. W takim przypadku demon zasad zasilania samochodu aktualizuje właściwość CURRENT_POWER_POLICY, aby powiadomić VHAL o zmianie.
Interakcja z procesami natywnymi
CarPowerManagementService (CPMS) przekazuje zarządzanie zasadami zasilania do demona zasad zasilania samochodu. Demon jest jedynym źródłem wiarygodnych danych dotyczących zasad zasilania w systemie. Demon zasad zasilania samochodu zarządza stanem zasad zasilania i powiadamia CPMS, VHAL i inne klienty natywne o zmianach.
Demon zasad zasilania samochodu eksportuje interfejsy AIDL do użytku przez HAL i inne procesy natywne. Można ich powiadomić o zmianie nowych zasad zasilania. Inaczej mówiąc, kiedy każde z nich musi zmienić 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żących zasad zasilania
- Stosowanie nowych zasad zasilania
- Ustawianie nowej grupy zasad dotyczących zasilania
Z tych metod mogą korzystać tylko moduły z uprawnieniami systemowymi. Moduły, które mają być informowane o zastosowaniu zasady zasilania, mogą zarejestrować detektor zmian zasad zasilania w CarPowerManager