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 wake dan memastikan bahwa penonaktifan tidak ditangguhkan secara tidak terbatas.
Terminologi
Istilah berikut digunakan di seluruh dokumen ini:
suspend()
dan shutdown()
.Desain sistem
Bagian ini menjelaskan cara AAOS merepresentasikan status daya prosesor aplikasi dan modul mana yang menerapkan sistem pengelolaan daya. Materi ini juga menjelaskan cara kerja modul ini bersama-sama dan bagaimana 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:
- Menangguhkan ke RAM. Kendaraan dan SoC nonaktif. Tidak ada kode yang dieksekusi. Daya dipertahankan ke RAM SoC.
- Tunggu VHAL. Saat pengemudi berinteraksi dengan kendaraan, misalnya, dengan membuka pintu, VMCU akan menerapkan daya ke SoC. AAOS akan 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 driver.
- Penyiapan Penonaktifan. Saat pengemudi selesai mengemudi, VHAL akan memberi tahu AAOS untuk memasuki Persiapan Penonaktifan. Dalam status ini, layar dan audio nonaktif dan AAOS tidak berinteraksi dengan pengemudi. Sistem Android masih berjalan dan bebas mengupdate aplikasi serta sistem Android. Saat update, jika ada, selesai, sistem Android akan memasuki Tunggu VHAL Finish.
- Tunggu hingga VHAL Selesai. Pada tahap ini, AAOS memberi tahu VHAL bahwa VHAL siap dimatikan. VMCU diharapkan menempatkan SoC dalam Deep Sleep dan untuk menghapus 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 | Mengkoordinasikan transisi status daya. |
CarPowerPolicyDaemon | Berkomunikasi dengan klien kebijakan daya native. |
HAL Kendaraan | Antarmuka ke VMCU. |
Biji Jagung Meletup | Menjeda ke implementasi RAM atau disk. |
Fitur tidur nyenyak/hibernasi (menangguhkan Android ke RAM/disk) diterapkan di kernel.
Fitur ini ditampilkan 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 menerapkan mesin status yang dijelaskan di atas dan mengirimkan notifikasi ke setiap observer saat transisi status daya terjadi. Layanan ini juga menggunakan VHAL untuk mengirim pesan ke hardware.
CPPD mengelola kebijakan daya hingga CPMS mengambil alih. Fitur ini juga mengirimkan notifikasi perubahan kebijakan daya ke pemroses native.
Beberapa properti ditentukan di VHAL. Untuk berkomunikasi dengan VMCU, CPMS membaca dan menulis properti ini. aplikasi dapat menggunakan antarmuka yang ditentukan dalam CPM untuk memantau perubahan status daya. Antarmuka ini juga memungkinkan aplikasi mendaftarkan pemroses kebijakan daya. API ini dapat dipanggil dari Java dan dianotasi dengan @hide / @System API, yang berarti API ini tersedia untuk aplikasi dengan hak istimewa saja. 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 enter deep sleep dan exit deep sleep untuk menjelaskan cara modul dan aplikasi berkomunikasi:
Masuk ke fase tidur nyenyak
Hanya VMCU yang dapat memulai deep sleep. Setelah tidur dalam dimulai, VMCU akan mengirimkan
notifikasi ke CPMS melalui VHAL. CPMS mengubah status menjadi SHUTDOWN PREPARE dan
menyiarkan transisi status ini ke semua observer (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 diwajibkan untuk menyelesaikan
persiapannya sebelum kembali dari panggilan ini. Layanan dengan hak istimewa diizinkan untuk melanjutkan
persiapannya secara asinkron setelah kembali untuk PRE_SHUTDOWN_PREPARE
,
SUSPEND_ENTER
, POST_SUSPEND_ENTER
. Dalam hal ini, layanan dengan hak istimewa
harus memanggil complete() pada objek CompletablePowerStateChangeFuture
yang disediakan
saat menyelesaikan persiapannya. Perhatikan bahwa persiapan asinkron tidak diizinkan untuk
SHUTDOWN_PREPARE
. Sebelum DEEP_SLEEP_ENTRY
dikirim ke VHAL, CPMS
secara berkala mengirimkan permintaan penundaan penonaktifan ke VHAL.
Saat semua objek CPM telah menyelesaikan persiapan penonaktifan, CPMS akan mengirim
AP_POWER_STATE_REPORT
ke VHAL, yang kemudian memberi tahu VMCU bahwa AP siap
dijeda. CPMS juga memanggil metode penangguhannya, yang menangguhkan kernel.
Urutan yang dijelaskan di atas diilustrasikan di bawah ini:
Gambar 3. Masuk ke fase 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.
- Terapkan 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.
Membuat objek CarPowerManager
Untuk membuat objek CPM, panggil metode getCarManager()
objek Mobil. Metode ini adalah
facade 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 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()
dari objek pemroses
akan dipanggil dengan nilai untuk mewakili status daya baru. Asosiasi antara nilai sebenarnya dan
status daya ditentukan dalam CarPowerManager
dan ditampilkan dalam
tabel berikut:
Nama | Deskripsi |
---|---|
STATE_ON | Masukkan status aktif. Sistem beroperasi sepenuhnya. |
STATE_SHUTDOWN_CANCELLED | Penonaktifan dibatalkan dan status daya dikembalikan ke status normal. |
STATE_SHUTDOWN_ENTER | aplikasi diharapkan akan dibersihkan dan siap dimatikan. |
STATE_POST_SHUTDOWN_ENTER | Persiapan untuk mematikan telah selesai dan VMCU siap dimatikan. Masukkan status penonaktifan. |
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 akan dibersihkan dan siap untuk ditangguhkan ke RAM. |
STATE_POST_SUSPEND_ENTER | Persiapan untuk suspend-to-RAM telah selesai dan VMCU siap untuk suspend-to-RAM. Masukkan status penangguhan. |
STATE_SUSPEND_EXIT | Bangun dari penangguhan atau lanjutkan dari penangguhan yang dibatalkan. |
STATE_HIBERNATION_ENTER | aplikasi diharapkan untuk membersihkan dan siap untuk hibernasi. |
STATE_POST_HIBERNATION_ENTER | Persiapan untuk hibernasi telah selesai dan VMCU siap untuk hibernasi. Masuk ke status hibernasi. |
STATE_HIBERNATION_EXIT | Bangun dari hibernasi atau lanjutkan dari hibernasi yang dibatalkan. |
STATE_WAIT_FOR_VHAL | Sistem sedang dimulai, tetapi menunggu untuk membangun 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 implementasi Android Anda
Integrator bertanggung jawab atas item berikut:
- Mengimplementasikan antarmuka kernel untuk menangguhkan Android.
- Mengimplementasikan fungsi VHAL untuk:
- Memperluas 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 aktivasi 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 penangguhan saat aplikasi atau layanan menulis mem
untuk
penangguhan ke RAM atau disk
untuk penangguhan ke disk ke dalam file yang terletak di
/sys/power/state
. Integrator harus menyediakan fungsi yang memantau file ini dan
menempatkan Linux ke dalam status daya penangguhan. Fungsi ini dapat mengirim GPIO ke VMCU untuk memberi tahu
VMCU bahwa perangkat telah dimatikan sepenuhnya. Integrator juga bertanggung jawab untuk menghapus
kondisi perlombaan antara VHAL yang mengirim pesan akhir ke VMCU dan sistem yang masuk ke
mode penangguhan atau penonaktifan.
Tanggung jawab VHAL
VHAL menyediakan antarmuka antara jaringan kendaraan dan Android. VHAL:
- Memperluas inisialisasi penangguhan atau penonaktifan dari mobil ke Android.
- Mengirim pesan siap dimatikan dari Android ke mobil.
- Memulai penonaktifan atau penangguhan Android melalui antarmuka kernel Linux.
Saat CPMS memberi tahu VHAL bahwa CPMS siap dimatikan, VHAL akan mengirimkan pesan siap penonaktifan ke VMCU. Biasanya, periferal on-chip seperti UART, SPI, dan USB mengirimkan pesan. Setelah pesan dikirim, CPMS akan memanggil perintah kernel untuk menangguhkan atau menonaktifkan perangkat. Sebelum melakukannya, VHAL atau BSP dapat mengalihkan GPIO untuk memberi tahu VMCU bahwa aman untuk mencabut daya dari perangkat.
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 agar 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 atau tidur atau menonaktifkan. 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 membangun komunikasi dengan VHAL. | |
DEEP_SLEEP_ENTRY | AP memasuki status tidur dalam. VMCU akan mengaktifkan kembali AP setelah waktu yang ditentukan dalam nilai kedua. | Harus ditetapkan |
DEEP_SLEEP_EXIT | AP keluar dari status tidur nyenyak. | |
HIBERNATION_ENTRY | AP memasuki status hibernasi. VMCU akan 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 menonaktifkan AP. Android dapat meminta penundaan tambahan dengan menerbitkan 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 diwajibkan untuk mendukung fitur pengaktifan berjangka waktu.) | Harus ditetapkan |
SHUTDOWN_CANCELLED | Android berhenti bersiap untuk dimatikan dan akan melanjutkan ke WAIT_FOR_VHAL. | |
AKTIF | Android berjalan normal. |
Status dapat ditetapkan secara otonom 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 mewakili status baru yang akan ditransisikan.int32Values[1]
: Nilai enumVehicleApPowerStateShutdownParam
. Nilai ini hanya dikirim untuk pesanSHUTDOWN_PREPARE
dan mengirimkan opsi yang dikandungnya ke Android.
Nilai bilangan bulat pertama mewakili status baru yang akan ditransisikan Android. Semantik
ditentukan di VehicleApPowerStateReq.aidl
dan diberikan di bawah:
Nama nilai | Deskripsi |
---|---|
AKTIF | AP akan mulai beroperasi sepenuhnya. |
SHUTDOWN_PREPARE | AP akan bersiap untuk dimatikan. Nilai kedua menunjukkan apakah AP diizinkan untuk menunda penonaktifan dan apakah AP akan dinonaktifkan atau memasuki mode tidur dalam. |
CANCEL_SHUTDOWN | AP akan berhenti bersiap untuk dimatikan dan bersiap untuk AKTIF. |
SELESAI | AP sekarang akan dimatikan atau ditangguhkan. |
VehicleApPowerStateShutdownParam
ditentukan dalam
VehicleApPowerStateShutdownParam.aidl
. Enum ini memiliki elemen berikut:
Nama nilai | Deskripsi |
---|---|
CAN_SLEEP | AP dapat memasuki mode tidur dalam, bukan dimatikan sepenuhnya. Penundaan diizinkan. |
CAN_HIBERNATE | AP dapat memasuki hibernasi, bukan dimatikan sepenuhnya. Penundaan diizinkan. |
SHUTDOWN_ONLY | AP akan mati. Penundaan diizinkan. Fase tidur dalam tidak diizinkan. |
SLEEP_IMMEDIATELY | AP dapat memasuki mode tidur nyenyak, tetapi harus segera tidur atau mati. Penundaan tidak diizinkan. |
HIBERNATE_IMMEDIATELY | AP dapat memasuki mode suspend-to-disk, tetapi harus segera melakukan hibernasi 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 pengaktifan yang sesuai saat perangkat dalam mode ditangguhkan. Sumber aktivasi umum meliputi detak jantung, modem, Wi-Fi, dan Bluetooth. Satu-satunya sumber aktivasi yang valid harus merupakan interupsi dari VMCU untuk mengaktifkan SoC. Hal ini mengasumsikan bahwa VMCU dapat memproses modem untuk peristiwa aktivasi jarak jauh (seperti mulai mesin jarak jauh). Jika fungsi ini didorong ke AP, sumber wake lain 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 dalam hierarki 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 |
Antarmuka dan definisi properti 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 objek sumber menyimpan referensi ke objek target. Misalnya, VehicleHAL memiliki referensi ke objek PropertyHalService.
Gambar 5. Diagram referensi objek.