Aby obsługiwać zarządzanie energią w przypadku konkretnych pojazdów, Android udostępnia CarPowerManagementServiceusługę i CarPowerManagerinterfejs.
Zmiany stanu są wywoływane przez główną jednostkę sterującą pojazdu (VMCU). Aby komunikować się z VMCU, integratorzy muszą wdrożyć kilka komponentów. Integratorzy odpowiadają za integrację z warstwą abstrakcji sprzętu pojazdu (VHAL) i implementacją jądra. Integratorzy są też odpowiedzialni za wyłączanie źródeł wybudzania i zapewnienie, że wyłączenia nie są odkładane w nieskończoność.
Terminologia
W tym dokumencie używamy tych terminów:
Projekt systemu
W tej sekcji opisujemy, jak AAOS reprezentuje stan zasilania procesora aplikacji i które moduły implementują system zarządzania zasilaniem. Opisuje też, jak te moduły współpracują ze sobą i jak zwykle przebiegają przejścia między stanami.
Stan zasilania samochodu
AAOS używa automatu stanów do reprezentowania stanu zasilania procesora aplikacji. Automat stanowy udostępnia stany przedstawione poniżej:

Rysunek 1. Automat stanu zasilania samochodu.
Najczęstsze przejścia są wyróżnione na niebiesko. Oto stany i typowy przebieg:
- Wstrzymanie do pamięci RAM Pojazd i SoC są wyłączone. Nie jest wykonywany żaden kod. Pamięć RAM SoC jest zasilana.
- Poczekaj na VHAL. Gdy kierowca wejdzie w interakcję z pojazdem, np. otworzy drzwi, VMCU włączy zasilanie SoC. AAOS wznowi działanie z trybu zawieszenia do pamięci RAM i przejdzie do stanu oczekiwania na VHAL, w którym będzie czekać na koordynację z VHAL.
- Włączone VHAL informuje AAOS, że ma przejść w stan włączony. W tym stanie AAOS działa w pełni i wchodzi w interakcje z kierowcą.
- Przygotowanie do wyłączenia Gdy kierowca skończy jazdę, VHAL informuje AAOS o wejściu w fazę przygotowania do wyłączenia, wysyłając
SHUTDOWN_PREPARE. W tym stanie detektory zmian stanu zasilania otrzymują wartośćSTATE_PRE_SHUTDOWN_PREPARE. Jest to wczesne ostrzeżenie o rozpoczęciu wyłączania. - Przygotowanie do wyłączenia Gdy wszyscy odbiorcy zakończą działanie lub upłynie limit czasu przygotowania do wyłączenia, system Android przechodzi do głównej fazy przygotowania do wyłączenia, powiadamiając odbiorców za pomocą
STATE_SHUTDOWN_PREPARE. Wyświetlacz i dźwięk są wyłączone, a AAOS nie wchodzi w interakcję z kierowcą. System Android nadal działa i może wykonywać operacje czyszczenia i aktualizacji, takie jak uruchamianie trybu garażowego. - Poczekaj na zakończenie VHAL. W tym momencie AAOS informuje VHAL, że jest gotowy do wyłączenia. Oczekuje się, że VMCU przełączy SoC w tryb głębokiego uśpienia i odłączy zasilanie procesora aplikacji. AAOS przechodzi wtedy w stan zawieszenia do pamięci RAM, ale nie jest wykonywany żaden kod.
Moduły zarządzania zasilaniem
System zarządzania energią składa się z tych modułów:
| Nazwa modułu | Opis |
|---|---|
| CarPowerManager | interfejs API w języku Java lub C++; |
| CarPowerManagementService | Koordynuje przejścia między stanami zasilania i przekazuje zarządzanie zasadami zasilania do demona CarPowerPolicyDaemon. |
| CarPowerPolicyDaemon | Zarządza zasadami zasilania i komunikuje się z klientami natywnych zasad zasilania. |
| Interfejs HAL pojazdu | Interfejs do VMCU. |
| Bąbelki | Implementacja zawieszenia do pamięci RAM lub na dysk. |
Funkcja głębokiego uśpienia/hibernacji (zawieszanie Androida w pamięci RAM lub na dysku) jest zaimplementowana w jądrze.
Ta funkcja jest udostępniana w przestrzeni użytkownika jako specjalny plik znajdujący się w lokalizacji /sys/power/state. AAOS jest zawieszany przez zapisanie w tym pliku znaku mem lub disk.
CPMS koordynuje stan zasilania z innymi usługami i warstwami HAL. CPMS implementuje opisany powyżej automat stanów i wysyła powiadomienia do każdego obserwatora, gdy następuje przejście do innego stanu zasilania. Ta usługa używa też VHAL do wysyłania wiadomości do sprzętu.
CPPD jest wiarygodnym źródłem informacji o zasadach dotyczących zasilania. Zarządza zasadami zasilania w całym cyklu życia urządzenia i powiadamia CPMS, VHAL i inne natywne odbiorniki o zmianach zasad zasilania. CPMS przekazuje żądania zmiany zasad zasilania do CPPD.
CPMS komunikuje się z VMCU, odczytując i zapisując właściwości VHAL związane ze stanem zasilania, takie jak AP_POWER_STATE_REQ i AP_POWER_STATE_REPORT. Aplikacje mogą używać interfejsu zdefiniowanego w CPM do monitorowania zmian stanu zasilania. Ten interfejs umożliwia też aplikacjom rejestrowanie odbiorców zasad dotyczących zasilania. Ten interfejs API w języku Java jest oznaczony adnotacjami @SystemApi i @hide, co oznacza, że jest dostępny tylko dla aplikacji z uprawnieniami. Zależności między tymi modułami, aplikacjami i usługami zostały zilustrowane poniżej:

Rysunek 2. Schemat komponentów zasilania.
Sekwencja wiadomości
W poprzedniej sekcji opisaliśmy moduły, z których składa się system zarządzania energią. W tej sekcji na przykładach enter deep sleep i exit deep sleep wyjaśniamy, jak moduły i aplikacje komunikują się ze sobą:
Przejście w sen głęboki
Tylko VMCU może zainicjować sen głęboki. Po rozpoczęciu snu głębokiego VMCU wysyła powiadomienie do CPMS za pomocą VHAL. CPMS zmienia stan na SHUTDOWN PREPARE i przesyła tę zmianę stanu do wszystkich obserwatorów (aplikacji i usług, które monitorują CPMS), wywołując metodę onStateChanged() z nowym identyfikatorem stanu dostarczonym przez CPM.
CPM pośredniczy między aplikacjami/usługami a CPMS. Metoda onStateChanged() aplikacji lub usług jest wywoływana synchronicznie w metodzie onStateChanged() CPM. Większość aplikacji i usług musi zakończyć przygotowania przed powrotem z tego wywołania. Usługi uprzywilejowane mogą kontynuować przygotowania asynchronicznie po powrocie do stanu PRE_SHUTDOWN_PREPARE, SUSPEND_ENTER, POST_SUSPEND_ENTER. W tym przypadku usługa uprzywilejowana powinna wywołać funkcję complete() na podanym obiekcie CompletablePowerStateChangeFuture po zakończeniu przygotowania. Pamiętaj, że przygotowanie asynchroniczne nie jest dozwolone w przypadkuSHUTDOWN_PREPARE. Zanim DEEP_SLEEP_ENTRY zostanie wysłany do VHAL, CPMS okresowo wysyła do VHAL żądania odroczenia wyłączenia.
Gdy wszystkie obiekty CPM zakończą przygotowania do wyłączenia, CPMS wysyła do VHAL sygnał AP_POWER_STATE_REPORT, który następnie powiadamia VMCU, że AP jest gotowy do zawieszenia. CPMS wywołuje też metodę zawieszania, która zawiesza jądro.
Opisana powyżej sekwencja jest zilustrowana poniżej:

Rysunek 3. Przejdź w stan głębokiego snu.
Interfejsy programowania udostępniane przez CPM
W tej sekcji opisano interfejs Java API udostępniany przez CPM na potrzeby aplikacji i usług systemowych. Ten interfejs API umożliwia oprogramowaniu systemowemu:
- Monitorowanie zmian stanu zasilania punktu dostępu.
- Stosowanie zasad zasilania.
Aby wywołać interfejsy API udostępniane przez CPM, wykonaj te czynności:
- Aby uzyskać instancję CPM, wywołaj interfejs Car API.
- Wywołaj odpowiednią metodę na obiekcie utworzonym w kroku 1.
Tworzenie obiektu CarPowerManager
Aby utworzyć obiekt CPM, wywołaj metodę getCarManager() obiektu Car. Ta metoda jest fasadą używaną do tworzenia obiektów CPM. Określ android.car.Car.POWER_SERVICE jako argument, aby utworzyć obiekt CPM.
Car car = Car.createCar(this); CarPowerManager powerManager = (CarPowerManager) car.getCarManager(android.car.Car.POWER_SERVICE);
CarPowerStateListener i rejestracja
Aplikacje i usługi systemowe mogą otrzymywać powiadomienia o zmianach stanu zasilania, implementując CarPowerManager.CarPowerStateListener. Ten interfejs definiuje jedną metodę onStateChanged(), która jest funkcją wywołania zwrotnego wywoływaną, gdy zmienia się stan zasilania CPMS. W przykładzie poniżej zdefiniowano nową klasę anonimową, która implementuje interfejs:
private final CarPowerManager.CarPowerStateListener powerListener = new CarPowerManager.CarPowerStateListener () { @Override public void onStateChanged(int state) { Log.i(TAG, "onStateChanged() state = " + state); } };
Aby poinstruować ten obiekt nasłuchujący, aby monitorował przejście stanu zasilania, utwórz nowy wątek wykonawczy i zarejestruj nasłuchującego oraz ten wątek w obiekcie CPM:
executor = new ThreadPerTaskExecutor(); powerManager.setListener(powerListener, executor);
Gdy stan zasilania ulegnie zmianie, metoda onStateChanged() obiektu nasłuchującego zostanie wywołana z wartością reprezentującą nowy stan zasilania. Powiązanie między rzeczywistą wartością a stanem zasilania jest zdefiniowane w CarPowerManager i przedstawione w tej tabeli:
| Nazwa | Opis |
|---|---|
| STATE_ON | Wpisz stan włączenia. System jest w pełni sprawny. |
| STATE_SHUTDOWN_CANCELLED | Zamykanie zostanie anulowane, a stan zasilania wróci do normalnego stanu. |
| STATE_SHUTDOWN_ENTER | aplikacje powinny zwolnić miejsce i być gotowe do wyłączenia. |
| STATE_POST_SHUTDOWN_ENTER | Przygotowania do wyłączenia zostały zakończone i VMCU jest gotowy do wyłączenia. Wprowadź stan wyłączenia. |
| STATE_PRE_SHUTDOWN_PREPARE | Proces wyłączania został zainicjowany, ale CPMS jeszcze go nie rozpoczął. Wyświetlacz i dźwięk są nadal włączone |
| STATE_SHUTDOWN_PREPARE | W tym okresie może być włączony tryb garażowy. |
| STATE_SUSPEND_ENTER | aplikacje powinny zostać wyczyszczone i przygotowane do przejścia w stan wstrzymania do pamięci RAM. |
| STATE_POST_SUSPEND_ENTER | Przygotowania do przejścia w stan wstrzymania do pamięci RAM zostały zakończone, a VMCU jest gotowy do przejścia w ten stan. Wprowadź stan wstrzymania. |
| STATE_SUSPEND_EXIT | Wybudzanie z zawieszenia lub wznawianie działania po anulowaniu zawieszenia. |
| STATE_HIBERNATION_ENTER | aplikacje powinny zwolnić miejsce i przygotować się do hibernacji. |
| STATE_POST_HIBERNATION_ENTER | Przygotowania do hibernacji zostały zakończone, a VMCU jest gotowy do przejścia w stan hibernacji. |
| STATE_HIBERNATION_EXIT | Wznawianie działania po hibernacji lub po anulowaniu hibernacji. |
| STATE_WAIT_FOR_VHAL | System uruchamia się, ale czeka na nawiązanie komunikacji z VHAL, zanim przejdzie w stan ON. |
Wyrejestrowanie CarPowerStateListener
Aby wyrejestrować wszystkie obiekty detektora zarejestrowane w CPM, wywołaj metodę clearListener:
powerManager.clearListener();
Integracja systemów w implementacji na Androida
Integratorzy odpowiadają za:
- Implementowanie interfejsu jądra w celu zawieszenia Androida.
- Implementowanie funkcji VHAL w celu:
- Przekazywanie informacji o rozpoczęciu wstrzymania lub wyłączenia z samochodu do Androida.
- Wysyłanie z Androida do samochodu wiadomości o gotowości do wyłączenia.
- Inicjowanie wyłączenia lub wstrzymania Androida za pomocą interfejsu jądra Linuksa.
- Sprawdź, czy wszystkie źródła wybudzania są wyłączone, gdy urządzenie jest w stanie wstrzymania.
- Upewnij się, że aplikacje wyłączają się wystarczająco szybko, aby nie odraczać w nieskończoność procesu wyłączania.
- Upewnij się, że pakiet BSP włącza (lub wyłącza) komponenty urządzenia zgodnie z zasadami zasilania, aby nie blokować zawieszenia ani hibernacji.
Interfejs jądra: /sys/power/state
AAOS przełącza urządzenie w tryb zawieszenia, gdy aplikacja lub usługa zapisuje w pliku znajdującym się w lokalizacji /sys/power/state wartość mem (w przypadku zawieszenia do pamięci RAM) lub disk (w przypadku zawieszenia do pamięci dyskowej). Integrator musi udostępnić funkcję, która monitoruje ten plik i przełącza system Linux w stan wstrzymania. Ta funkcja może wysłać sygnał GPIO do VMCU, aby powiadomić VMCU, że urządzenie zostało całkowicie wyłączone. Integrator odpowiada też za wyeliminowanie wszelkich warunków wyścigu między wysłaniem przez VHAL ostatecznej wiadomości do VMCU a przejściem systemu w tryb zawieszenia lub wyłączenia.
Odpowiedzialność VHAL
VHAL zapewnia interfejs między siecią pojazdu a Androidem. VHAL:
- Przekazuje do Androida sygnał o rozpoczęciu wstrzymania lub wyłączenia z samochodu.
- Wysyła z Androida do samochodu wiadomość o gotowości do wyłączenia.
- Inicjuje wyłączenie lub zawieszenie Androida za pomocą interfejsu jądra Linuksa.
Gdy CPMS poinformuje VHAL, że jest gotowy do wyłączenia, VHAL wyśle do VMCU komunikat shutdown ready. Zwykle urządzenia peryferyjne na chipie, takie jak UART, SPI i USB, przesyłają wiadomość. Po wysłaniu wiadomości CPMS wywołuje polecenie jądra, aby zawiesić lub wyłączyć urządzenie. Przed tym VHAL lub BSP może przełączyć GPIO, aby poinformować VMCU, że można bezpiecznie odłączyć zasilanie urządzenia.
VHAL musi obsługiwać te właściwości, które kontrolują zarządzanie energią za pomocą VHAL:
| Nazwa | Opis |
|---|---|
| AP_POWER_STATE_REPORT | Android zgłasza przejścia stanów do VMCU za pomocą tej właściwości, używając wartości wyliczeniowych VehicleApPowerStateReport. |
| AP_POWER_STATE_REQ | VMCU używa tej właściwości, aby poinstruować Androida, aby przełączył się na różne stany zasilania, używając wartości wyliczeniowych VehicleApPowerStateReq. |
AP_POWER_STATE_REPORT
Użyj tej właściwości, aby zgłosić bieżący stan zarządzania energią na Androidzie. Ta właściwość zawiera 2 liczby całkowite:
int32Values[0]: wyliczenie VehicleApPowerStateReport bieżącego stanu.int32Values[1]: czas w milisekundach, o który należy odłożyć, uśpić lub wyłączyć urządzenie. Znaczenie tej wartości zależy od pierwszej wartości.
Pierwsza wartość może mieć jedną z tych wartości: VehicleApPowerStateReport.aidl
zawiera bardziej szczegółowe opisy, które są przechowywane w hardware/interfaces/automotive/vehicle/aidl/android/hardware/automotive/vehicle.
| Nazwa wartości | Opis | Druga wartość |
|---|---|---|
| WAIT_FOR_VHAL | AP uruchamia się i musi nawiązać komunikację z VHAL. | |
| DEEP_SLEEP_ENTRY | Punkt dostępu przechodzi w stan głębokiego uśpienia. Po upływie czasu określonego w drugiej wartości VMCU powinien ponownie włączyć AP. | Musi być ustawiony |
| DEEP_SLEEP_EXIT | Procesor aplikacji wychodzi ze stanu głębokiego uśpienia. | |
| HIBERNATION_ENTRY | AP przechodzi w stan hibernacji. Po upływie czasu określonego w drugiej wartości VMCU powinien ponownie włączyć AP. | Musi być ustawiony |
| HIBERNATION_EXIT | Punkt dostępu wychodzi ze stanu hibernacji. | |
| SHUTDOWN_POSTPONE | Android nie jest gotowy do wyłączenia. VMCU powinien odczekać czas określony w drugiej wartości przed wyłączeniem AP. Android może poprosić o dodatkowe odroczenie, wysyłając kolejne raporty SHUTDOWN_POSTPONE. | Musi być ustawiony |
| SHUTDOWN_PREPARE | Android przygotowuje się do wyłączenia. | Musi być ustawiony |
| SHUTDOWN_START | Punkt dostępu jest gotowy do wyłączenia. VMCU powinien ponownie włączyć AP po upływie czasu określonego w drugiej wartości. (VMCU nie musi obsługiwać funkcji włączania z opóźnieniem). | Musi być ustawiony |
| SHUTDOWN_CANCELLED | Android przestaje przygotowywać się do wyłączenia i przechodzi do stanu WAIT_FOR_VHAL. | |
| WŁ. | Android działa normalnie. |
Stan może być ustawiany autonomicznie lub w odpowiedzi na żądanie za pomocą VMCU.
AP_POWER_STATE_REQ
Ta właściwość jest wysyłana przez VMCU, aby przełączyć Androida w inny stan zasilania. Zawiera 2 liczby całkowite:
int32Values[0]: wartość typu wyliczeniowegoVehicleApPowerStateReq, która reprezentuje nowy stan, do którego ma nastąpić przejście.int32Values[1]: wartość wyliczeniowaVehicleApPowerStateShutdownParam. Ta wartość jest wysyłana tylko w przypadku wiadomościSHUTDOWN_PREPAREi przekazuje do Androida zawarte w niej opcje.
Pierwsza wartość całkowita reprezentuje nowy stan, do którego ma przejść Android. Semantyka jest zdefiniowana w VehicleApPowerStateReq.aidl i podana poniżej:
| Nazwa wartości | Opis |
|---|---|
| WŁ. | AP powinien rozpocząć pełną pracę. |
| SHUTDOWN_PREPARE | Punkt dostępu powinien przygotować się do wyłączenia. Druga wartość wskazuje, czy punkt dostępu może odłożyć wyłączenie i czy powinien oczekiwać wyłączenia zasilania lub przejścia w sen głęboki. |
| CANCEL_SHUTDOWN | Punkt dostępu powinien przestać przygotowywać się do wyłączenia i zacząć przygotowywać się do włączenia. |
| ZAKOŃCZ | Punkt dostępu zostanie teraz wyłączony lub zawieszony. |
VehicleApPowerStateShutdownParam jest zdefiniowany w VehicleApPowerStateShutdownParam.aidl. Ten wyliczenie ma te elementy:
| Nazwa wartości | Opis |
|---|---|
| CAN_SLEEP | Punkt dostępu może przejść w stan głębokiego uśpienia zamiast całkowicie się wyłączyć. Przekładanie jest dozwolone. |
| CAN_HIBERNATE | AP może przejść w stan hibernacji zamiast całkowicie się wyłączyć. Przekładanie jest dozwolone. |
| SHUTDOWN_ONLY | Punkt dostępu powinien się wyłączyć. Przekładanie jest dozwolone. Sen głęboki jest niedozwolony. |
| SLEEP_IMMEDIATELY | AP może przejść w stan głębokiego uśpienia, ale musi natychmiast przejść w stan uśpienia lub wyłączyć się. Przekładanie terminów jest niedozwolone. |
| HIBERNATE_IMMEDIATELY | AP może przejść w stan wstrzymania na dysku, ale musi natychmiast przejść w stan hibernacji lub wyłączyć się. Przekładanie terminów jest niedozwolone. |
| SHUTDOWN_IMMEDIATELY | Punkt dostępu musi zostać natychmiast wyłączony. Przekładanie nie jest dozwolone. Sen głęboki jest niedozwolony. |
Źródła wybudzania
Gdy urządzenie jest w trybie zawieszenia, integrator musi wyłączyć odpowiednie źródła wybudzania. Typowe źródła wybudzania to bicie serca, modem, Wi-Fi i Bluetooth. Jedynym prawidłowym źródłem wybudzania musi być przerwanie z VMCU, które wybudza SoC. Zakłada się, że VMCU może nasłuchiwać modemu pod kątem zdarzeń zdalnego wybudzania (takich jak zdalne uruchomienie silnika). Jeśli ta funkcja jest przekazywana do procesora aplikacji, należy dodać kolejne źródło wybudzania, aby obsługiwać modem.
Aplikacje
Producenci OEM muszą pisać aplikacje w taki sposób, aby można je było szybko wyłączyć i nie opóźniać procesu w nieskończoność.
Dodatek
Katalogi w drzewie kodu źródłowego
| Treść | Katalog |
|---|---|
| kod związany z CarPowerManager. | packages/services/Car/car-lib/src/android/car/hardware/power |
| CarPowerManagementService itp. | packages/services/Car/service/src/com/android/car/power |
usługi związane z VHAL, takie jak VehicleHal i HAlClient; |
packages/services/Car/service/src/com/android/car/hal |
| Interfejs VHAL i definicje właściwości. | hardware/interfaces/automotive/vehicle/aidl/android/hardware/automotive/vehicle/ |
Przykładowa aplikacja, która daje wyobrażenie o usłudze CarPowerManager |
packages/services/Car/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink |
Diagram klas
Ten diagram klas przedstawia klasy i interfejsy Javy w systemie zarządzania energią:

Rysunek 4. Diagram klasy mocy.
Relacja między obiektami
Rysunek 5 pokazuje, które obiekty mają odwołania do innych obiektów. Krawędź oznacza, że obiekt źródłowy zawiera odwołanie do obiektu docelowego. Na przykład VehicleHAL ma odwołanie do obiektu PropertyHalService.

Rysunek 5. Diagram referencyjny obiektu.