Untuk mendukung pengelolaan daya khusus kendaraan, Android menyediakan layanan
CarPowerManagementService dan antarmuka
CarPowerManager.
Transisi status dipicu oleh Unit Kontrol Utama Kendaraan (VMCU). Untuk berkomunikasi dengan VMCU, integrator harus menerapkan beberapa komponen. Integrator bertanggung jawab untuk berintegrasi dengan lapisan abstraksi hardware kendaraan (VHAL) dan implementasi kernel. Integrator juga bertanggung jawab untuk menonaktifkan sumber aktif dan memastikan bahwa penonaktifan tidak ditunda tanpa batas waktu.
Terminologi
Istilah berikut digunakan di seluruh dokumen ini:
Desain sistem
Bagian ini menjelaskan cara AAOS merepresentasikan status daya prosesor aplikasi dan modul yang menerapkan sistem pengelolaan daya. Materi ini juga menjelaskan cara kerja modul ini bersama-sama dan cara transisi status biasanya terjadi.
Mesin status daya mobil
AAOS menggunakan mesin status untuk merepresentasikan status daya AP. Mesin status menyediakan status yang diilustrasikan di bawah:

Gambar 1. Mesin status daya mobil.
Transisi yang paling umum ditandai dengan warna biru. Berikut adalah status dan transisi umum:
- Tidur ke RAM. Kendaraan dan SoC nonaktif. Tidak ada kode yang sedang dieksekusi. Daya dipertahankan ke RAM SoC.
- Tunggu VHAL. Saat pengemudi berinteraksi dengan kendaraan, misalnya, dengan membuka pintu, VMCU akan menerapkan daya ke SoC. AAOS dilanjutkan dari Suspend-to-RAM dan memasuki Wait for VHAL, tempatnya menunggu koordinasi dengan VHAL.
- Aktif. VHAL memberi tahu AAOS untuk memasuki status Aktif. Dalam status ini, AAOS berjalan sepenuhnya dan berinteraksi dengan pengemudi.
- Persiapan Penutupan. Setelah pengemudi selesai mengemudi, VHAL akan memberi tahu AAOS untuk memasuki Shutdown Prepare. Dalam status ini, layar dan audio nonaktif dan AAOS tidak berinteraksi dengan pengemudi. Sistem Android masih berjalan dan bebas mengupdate aplikasi dan sistem Android. Setelah update selesai, sistem Android akan memasuki status Wait for VHAL Finish.
- Tunggu hingga VHAL Selesai. Pada tahap ini, AAOS memberi tahu VHAL bahwa sistem siap dimatikan. VMCU diharapkan menempatkan SoC dalam Deep Sleep dan menghilangkan daya dari prosesor aplikasi. AAOS kemudian berada dalam status Suspend-to-RAM, meskipun tidak ada kode yang sedang dieksekusi.
Modul pengelolaan daya
Sistem pengelolaan daya terdiri dari modul berikut:
| Nama modul | Deskripsi |
|---|---|
| CarPowerManager | Java atau C++ API. |
| CarPowerManagementService | Mengoordinasikan transisi status daya dan mendelegasikan pengelolaan kebijakan daya ke CarPowerPolicyDaemon. |
| CarPowerPolicyDaemon | Mengelola kebijakan daya dan berkomunikasi dengan klien kebijakan daya native. |
| HAL Kendaraan | Antarmuka ke VMCU. |
| Kernel | Implementasi penangguhan ke RAM atau disk. |
Fitur tidur nyenyak/hibernasi (menangguhkan Android ke RAM/disk) diimplementasikan di kernel.
Fitur ini diekspos ke ruang pengguna sebagai file khusus yang terletak di
/sys/power/state. AAOS ditangguhkan dengan menulis mem atau disk
ke file ini.
CPMS mengoordinasikan status daya dengan layanan dan HAL lainnya. CPMS mengimplementasikan mesin status yang dijelaskan di atas dan mengirimkan notifikasi ke setiap pengamat saat transisi status daya terjadi. Layanan ini juga menggunakan VHAL untuk mengirim pesan ke hardware.
CPPD adalah sumber tepercaya untuk kebijakan daya. Layanan ini mengelola kebijakan daya di seluruh siklus proses perangkat dan memberi tahu CPMS, VHAL, dan pendengar native lainnya tentang perubahan kebijakan daya. CPMS mendelegasikan permintaan perubahan kebijakan daya ke CPPD.
CPMS berkomunikasi dengan VMCU dengan membaca dan menulis properti VHAL yang terkait dengan status daya, seperti AP_POWER_STATE_REQ dan AP_POWER_STATE_REPORT. Aplikasi dapat menggunakan antarmuka yang ditentukan dalam CPM untuk memantau perubahan status daya. Antarmuka ini juga memungkinkan aplikasi mendaftarkan pemroses kebijakan daya. Java API ini diberi anotasi dengan @SystemApi dan @hide, sehingga hanya tersedia untuk aplikasi dengan hak istimewa. Hubungan antara modul, aplikasi, dan layanan ini diilustrasikan di bawah:

Gambar 2. Diagram referensi komponen daya.
Urutan pesan
Bagian sebelumnya menjelaskan modul yang membentuk sistem pengelolaan daya. Bagian ini menggunakan contoh masuk ke fase tidur dalam dan keluar dari fase tidur dalam untuk menjelaskan cara modul dan aplikasi berkomunikasi:
Masuk ke fase tidur dalam
Hanya VMCU yang dapat memulai fase tidur dalam. Setelah fase tidur dalam dimulai, VMCU mengirimkan notifikasi ke CPMS melalui VHAL. CPMS mengubah status menjadi SHUTDOWN PREPARE dan menyiarkan transisi status ini ke semua pengamat (aplikasi dan layanan yang memantau CPMS) dengan memanggil metode onStateChanged() dengan ID status baru yang disediakan oleh CPM.
CPM memediasi antara aplikasi/layanan dan CPMS. Metode
onStateChanged() untuk aplikasi/layanan dipanggil secara sinkron dalam
metode onStateChanged() CPM. Sebagian besar aplikasi dan layanan harus menyelesaikan
persiapan sebelum kembali dari panggilan ini. Layanan istimewa diizinkan untuk melanjutkan
persiapan secara asinkron setelah kembali untuk PRE_SHUTDOWN_PREPARE,
SUSPEND_ENTER, POST_SUSPEND_ENTER. Dalam hal ini, layanan istimewa seharusnya memanggil complete() pada objek CompletablePowerStateChangeFuture yang disediakan saat selesai melakukan persiapannya. Perhatikan bahwa persiapan asinkron tidak diizinkan untuk
SHUTDOWN_PREPARE. Sebelum DEEP_SLEEP_ENTRY dikirim ke VHAL, CPMS
secara berkala mengirim permintaan penundaan penonaktifan ke VHAL.
Setelah semua objek CPM menyelesaikan persiapan penonaktifan, CPMS akan mengirimkan
AP_POWER_STATE_REPORT ke VHAL, yang kemudian memberi tahu VMCU bahwa AP siap
ditangguhkan. CPMS juga memanggil metode penangguhannya, yang menangguhkan kernel.
Urutan yang dijelaskan di atas diilustrasikan di bawah ini:

Gambar 3. Masuk ke mode tidur nyenyak.
Antarmuka pemrograman yang disediakan oleh CPM
Bagian ini menjelaskan Java API yang disediakan oleh CPM untuk aplikasi dan layanan sistem. API ini memungkinkan software sistem untuk:
- Memantau perubahan status daya di AP.
- Menerapkan kebijakan daya.
Gunakan langkah-langkah berikut untuk memanggil API yang disediakan oleh CPM:
- Untuk mendapatkan instance CPM, panggil Car API.
- Panggil metode yang sesuai pada objek yang dibuat di Langkah 1.
Buat objek CarPowerManager
Untuk membuat objek CPM, panggil metode getCarManager() objek Car. Metode ini adalah
fasad yang digunakan untuk membuat objek CPM. Tentukan android.car.Car.POWER_SERVICE sebagai argumen untuk membuat objek CPM.
Car car = Car.createCar(this); CarPowerManager powerManager = (CarPowerManager) car.getCarManager(android.car.Car.POWER_SERVICE);
CarPowerStateListener dan pendaftaran
Aplikasi dan layanan sistem dapat menerima notifikasi perubahan status daya dengan menerapkan
CarPowerManager.CarPowerStateListener. Antarmuka ini menentukan satu metode
onStateChanged(), yang merupakan fungsi callback yang dipanggil saat status daya CPMS
berubah. Contoh berikut menentukan class anonim baru yang mengimplementasikan antarmuka:
private final CarPowerManager.CarPowerStateListener powerListener = new CarPowerManager.CarPowerStateListener () { @Override public void onStateChanged(int state) { Log.i(TAG, "onStateChanged() state = " + state); } };
Untuk menginstruksikan objek pemroses ini agar memantau transisi status daya, buat thread eksekusi baru dan daftarkan pemroses dan thread ini ke objek CPM:
executor = new ThreadPerTaskExecutor(); powerManager.setListener(powerListener, executor);
Saat status daya diubah, metode onStateChanged() objek pendengar
dipanggil dengan nilai untuk merepresentasikan status daya baru. Asosiasi antara nilai sebenarnya dan
status daya ditentukan dalam CarPowerManager dan ditampilkan dalam
tabel berikut:
| Nama | Deskripsi |
|---|---|
| STATE_ON | Memasuki status aktif. Sistem beroperasi sepenuhnya. |
| STATE_SHUTDOWN_CANCELLED | Penonaktifan dibatalkan dan status daya dikembalikan ke status normal. |
| STATE_SHUTDOWN_ENTER | Aplikasi diharapkan dibersihkan dan siap untuk dimatikan. |
| STATE_POST_SHUTDOWN_ENTER | Persiapan untuk mematikan telah selesai dan VMCU siap untuk dimatikan. Masuk ke status dimatikan. |
| STATE_PRE_SHUTDOWN_PREPARE | Proses penonaktifan diminta, tetapi CPMS belum memulai prosesnya. Layar dan audio masih aktif |
| STATE_SHUTDOWN_PREPARE | Mode Garasi dapat berjalan selama periode tersebut. |
| STATE_SUSPEND_ENTER | Aplikasi diharapkan membersihkan dan siap untuk penangguhan ke RAM. |
| STATE_POST_SUSPEND_ENTER | Persiapan untuk suspend-to-RAM telah selesai dan VMCU siap untuk suspend-to-RAM. Memasuki status ditangguhkan. |
| STATE_SUSPEND_EXIT | Membangunkan dari penangguhan atau melanjutkan dari penangguhan yang dibatalkan. |
| STATE_HIBERNATION_ENTER | Aplikasi diharapkan dibersihkan dan siap untuk hibernasi. |
| STATE_POST_HIBERNATION_ENTER | Persiapan untuk hibernasi telah selesai dan VMCU siap untuk memasuki status hibernasi. |
| STATE_HIBERNATION_EXIT | Membangunkan perangkat dari hibernasi atau melanjutkan dari hibernasi yang dibatalkan. |
| STATE_WAIT_FOR_VHAL | Sistem sedang dimulai, tetapi menunggu untuk menjalin komunikasi dengan VHAL sebelum beralih ke status AKTIF. |
Pembatalan pendaftaran CarPowerStateListener
Untuk membatalkan pendaftaran semua objek pemroses yang terdaftar ke CPM, panggil metode clearListener:
powerManager.clearListener();
Integrasi sistem pada penerapan Android Anda
Integrator bertanggung jawab atas item berikut:
- Menerapkan antarmuka kernel untuk menangguhkan Android.
- Menerapkan fungsi VHAL untuk:
- Menyebarkan inisiasi penangguhan atau penonaktifan dari mobil ke Android.
- Kirim pesan siap dimatikan dari Android ke mobil.
- Memulai penonaktifan atau penangguhan Android melalui antarmuka kernel Linux.
- Pastikan semua sumber aktif dinonaktifkan saat perangkat dalam mode ditangguhkan.
- Pastikan aplikasi dimatikan dengan cukup cepat agar tidak menunda proses penonaktifan tanpa batas waktu.
- Pastikan BSP mengaktifkan (atau menonaktifkan) komponen perangkat sesuai dengan kebijakan daya agar tidak memblokir penangguhan atau hibernasi
Antarmuka kernel: /sys/power/state
AAOS menempatkan perangkat ke mode ditangguhkan saat aplikasi atau layanan menulis mem untuk
tunda ke RAM atau disk untuk tunda ke disk ke dalam file yang terletak di
/sys/power/state. Integrator harus menyediakan fungsi yang memantau file ini dan
menempatkan Linux ke status daya ditangguhkan. Fungsi ini dapat mengirim GPIO ke VMCU untuk memberi tahu VMCU bahwa perangkat telah dimatikan sepenuhnya. Integrator juga bertanggung jawab untuk menghilangkan kondisi persaingan (race condition) antara VHAL yang mengirimkan pesan akhir ke VMCU dan sistem yang masuk ke mode ditangguhkan atau dimatikan.
Tanggung jawab VHAL
VHAL menyediakan antarmuka antara jaringan kendaraan dan Android. VHAL:
- Menyebarkan inisiasi penangguhan atau penonaktifan dari mobil ke Android.
- Mengirim pesan siap mematikan sistem dari Android ke mobil.
- Memulai shutdown atau penangguhan Android melalui antarmuka kernel Linux.
Saat CPMS memberi tahu VHAL bahwa CPMS siap dimatikan, VHAL akan mengirimkan pesan siap dimatikan ke VMCU. Biasanya, periferal on-chip seperti UART, SPI, dan USB mengirimkan pesan. Setelah pesan dikirim, CPMS memanggil perintah kernel untuk menangguhkan atau mematikan perangkat. Sebelum melakukannya, VHAL atau BSP dapat mengalihkan GPIO untuk menginstruksikan VMCU bahwa perangkat aman untuk dicabut dayanya.
VHAL harus mendukung properti berikut, yang mengontrol pengelolaan daya melalui VHAL:
| Nama | Deskripsi |
|---|---|
| AP_POWER_STATE_REPORT | Android melaporkan transisi status ke VMCU dengan properti ini, menggunakan nilai enum VehicleApPowerStateReport. |
| AP_POWER_STATE_REQ | VMCU menggunakan properti ini untuk menginstruksikan Android bertransisi ke status daya yang berbeda, menggunakan nilai enum VehicleApPowerStateReq. |
AP_POWER_STATE_REPORT
Gunakan properti ini untuk melaporkan status pengelolaan daya Android saat ini. Properti ini berisi dua bilangan bulat:
int32Values[0]: enum VehicleApPowerStateReport dari status saat ini.int32Values[1]: Waktu dalam milidetik untuk menunda, menidurkan, atau mematikan. Arti nilai ini bergantung pada nilai pertama.
Nilai pertama dapat menggunakan salah satu nilai berikut. VehicleApPowerStateReport.aidl
berisi deskripsi yang lebih spesifik, yang disimpan di
hardware/interfaces/automotive/vehicle/aidl/android/hardware/automotive/vehicle.
| Nama nilai | Deskripsi | Nilai kedua |
|---|---|---|
| WAIT_FOR_VHAL | AP dimulai dan perlu menjalin komunikasi dengan VHAL. | |
| DEEP_SLEEP_ENTRY | AP memasuki status tidur total. VMCU harus mengaktifkan kembali AP setelah waktu yang ditentukan dalam nilai kedua. | Harus ditetapkan |
| DEEP_SLEEP_EXIT | AP keluar dari status tidur total. | |
| HIBERNATION_ENTRY | AP memasuki status hibernasi. VMCU harus mengaktifkan kembali AP setelah waktu yang ditentukan dalam nilai kedua. | Harus ditetapkan |
| HIBERNATION_EXIT | AP keluar dari status hibernasi. | |
| SHUTDOWN_POSTPONE | Android belum siap dimatikan. VMCU harus menunggu waktu yang ditentukan dalam nilai kedua sebelum mematikan AP. Android dapat meminta penundaan tambahan dengan mengeluarkan laporan SHUTDOWN_POSTPONE tambahan. | Harus ditetapkan |
| SHUTDOWN_PREPARE | Android sedang bersiap untuk dimatikan. | Harus ditetapkan |
| SHUTDOWN_START | AP siap dimatikan. VMCU harus mengaktifkan kembali AP setelah waktu yang ditentukan dalam nilai kedua. (VMCU tidak diperlukan untuk mendukung fitur pengaktifan terjadwal.) | Harus ditetapkan |
| SHUTDOWN_CANCELLED | Android berhenti bersiap untuk dimatikan dan akan melanjutkan ke WAIT_FOR_VHAL. | |
| AKTIF | Android berjalan normal. |
Status dapat ditetapkan secara mandiri atau sebagai respons terhadap permintaan melalui VMCU.
AP_POWER_STATE_REQ
Properti ini dikirim oleh VMCU untuk mentransisikan Android ke status daya yang berbeda dan berisi dua bilangan bulat:
int32Values[0]: Nilai enumVehicleApPowerStateReq, yang merepresentasikan status baru yang akan ditransisikan.int32Values[1]: Nilai enumVehicleApPowerStateShutdownParam. Nilai ini dikirim hanya untuk pesanSHUTDOWN_PREPAREdan mengirimkan opsi yang dikandungnya ke Android.
Nilai bilangan bulat pertama mewakili status baru yang akan ditransisikan Android. Semantik
ditentukan dalam VehicleApPowerStateReq.aidl dan disediakan di bawah:
| Nama nilai | Deskripsi |
|---|---|
| AKTIF | AP harus memulai operasi penuh. |
| SHUTDOWN_PREPARE | AP harus bersiap untuk dimatikan. Nilai kedua menunjukkan apakah AP diizinkan untuk menunda penonaktifan dan apakah AP harus bersiap untuk dimatikan atau memasuki mode tidur lelap. |
| CANCEL_SHUTDOWN | AP akan berhenti bersiap untuk dimatikan dan bersiap untuk AKTIF. |
| SELESAI | AP akan dimatikan atau ditangguhkan. |
VehicleApPowerStateShutdownParam ditentukan di
VehicleApPowerStateShutdownParam.aidl. Enum ini memiliki elemen berikut:
| Nama nilai | Deskripsi |
|---|---|
| CAN_SLEEP | AP dapat memasuki mode tidur nyenyak, bukan dimatikan sepenuhnya. Penundaan diizinkan. |
| CAN_HIBERNATE | AP dapat memasuki hibernasi, bukan dimatikan sepenuhnya. Penundaan diizinkan. |
| SHUTDOWN_ONLY | AP harus dimatikan. Penundaan diizinkan. Fase tidur dalam tidak diizinkan. |
| SLEEP_IMMEDIATELY | AP dapat memasuki tidur nyenyak, tetapi harus segera tidur atau dimatikan. Penundaan tidak diizinkan. |
| HIBERNATE_IMMEDIATELY | AP dapat memasuki suspend-to-disk, tetapi harus segera dihibernasi atau dimatikan. Penundaan tidak diizinkan. |
| SHUTDOWN_IMMEDIATELY | AP harus segera dimatikan. Penundaan tidak diizinkan. Fase tidur dalam tidak diizinkan. |
Sumber wake
Integrator harus menonaktifkan sumber aktif yang sesuai saat perangkat dalam mode ditangguhkan. Sumber aktif umum mencakup detak jantung, modem, Wi-Fi, dan Bluetooth. Satu-satunya sumber aktif yang valid harus berupa interupsi dari VMCU untuk mengaktifkan SoC. Hal ini mengasumsikan bahwa VMCU dapat memantau modem untuk peristiwa aktif jarak jauh (seperti menghidupkan mesin dari jarak jauh). Jika fungsi ini didorong ke AP, maka sumber aktif lainnya untuk melayani modem harus ditambahkan.
Aplikasi
OEM harus berhati-hati dalam menulis aplikasi agar dapat dimatikan dengan cepat dan tidak menunda proses tanpa batas waktu.
Lampiran
Direktori di pohon kode sumber
| Konten | Direktori |
|---|---|
| Kode terkait CarPowerManager. | packages/services/Car/car-lib/src/android/car/hardware/power |
| CarPowerManagementService, dan sebagainya. | packages/services/Car/service/src/com/android/car/power |
Layanan yang menangani VHAL, seperti VehicleHal dan HAlClient. |
packages/services/Car/service/src/com/android/car/hal |
| Definisi properti dan antarmuka VHAL. | hardware/interfaces/automotive/vehicle/aidl/android/hardware/automotive/vehicle/ |
Aplikasi contoh untuk memberikan beberapa ide tentang CarPowerManager |
packages/services/Car/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink |
Diagram class
Diagram class ini menampilkan class dan antarmuka Java dalam sistem pengelolaan daya:

Gambar 4. Diagram class daya.
Hubungan objek
Gambar 5 mengilustrasikan objek mana yang memiliki referensi ke objek lain. Edge berarti bahwa objek sumber menyimpan referensi ke objek target. Misalnya, VehicleHAL memiliki referensi ke objek PropertyHalService.

Gambar 5. Diagram referensi objek.