Android, araca özel güç yönetimini desteklemek için CarPowerManagementService hizmeti ve CarPowerManager arayüzü sağlar.
Durum geçişleri, Araç Ana Kontrol Ünitesi (VMCU) tarafından tetiklenir. VMCU ile iletişim kurmak için entegratörlerin çeşitli bileşenleri uygulaması gerekir. Entegratörler, Araç Donanımı Soyutlama Katmanı (VHAL) ve çekirdek uygulamasıyla entegrasyondan sorumludur. Ayrıca entegrasyon uzmanları, uyandırma kaynaklarını devre dışı bırakmaktan ve kapatmaların süresiz olarak ertelenmemesini sağlamaktan da sorumludur.
Terminoloji
Bu belgede aşağıdaki terimler kullanılmaktadır:
Sistem tasarımı
Bu bölümde, AAOS'nin uygulama işlemcisinin güç durumunu nasıl temsil ettiği ve hangi modüllerin güç yönetim sistemini uyguladığı açıklanmaktadır. Bu materyalde, bu modüllerin birlikte nasıl çalıştığı ve durum geçişlerinin genellikle nasıl gerçekleştiği de açıklanmaktadır.
Aracın güç durumu makinesi
AAOS, AP'nin güç durumunu temsil etmek için durum makinesi kullanır. Durum makinesi, aşağıda gösterilen durumları sağlar:

Şekil 1. Aracın güç durumu makinesi.
En yaygın geçişler mavi renkle vurgulanır. Eyaletler ve yaygın geçişler şunlardır:
- RAM'e askıya alma. Araç ve SoC kapalıdır. Kod yürütülmüyordur. SoC RAM'e güç sağlanmaya devam eder.
- VHAL'nin gelmesini bekleyin. Sürücü, araçla etkileşime girdiğinde (ör. bir kapıyı açarak) VMCU, SoC'ye güç uygular. AAOS, askıya alma modundan RAM'e devam eder ve VHAL ile koordinasyonun beklendiği VHAL'yi Bekle moduna girer.
- Açık VHAL, AAOS'a Açık durumuna geçmesini söyler. Bu durumda, AAOS tamamen çalışır ve sürücüyle etkileşim kurar.
- Kapatmaya Hazırlanma Sürücü sürüşü bitirdiğinde VHAL, AAOS'a Kapatmaya Hazırlanma moduna girmesini söyler. Bu durumda ekran ve ses kapalıdır ve AAOS sürücüyle etkileşimde bulunmaz. Android sistemi çalışmaya devam eder ve uygulamaları ve Android sistemini güncellemek için ücretsizdir. Güncellemeler tamamlandığında Android sistemi, VHAL'in bitmesini bekler.
- VHAL'nin tamamlanmasını bekleyin. Bu noktada AAOS, VHAL'ye kapatılmaya hazır olduğunu bildirir. VMCU'nun SoC'yi derin uyku moduna alması ve uygulama işlemcisinin gücünü kesmesi beklenir. Ardından AAOS, askıya alıp RAM'e alma durumunda olur ancak kod yürütülmez.
Güç yönetimi modülleri
Güç yönetim sistemi şu modüllerden oluşur:
| Modül adı | Açıklama |
|---|---|
| CarPowerManager | Java veya C++ API'si. |
| CarPowerManagementService | Güç durumu geçişlerini koordine eder ve güç politikası yönetimini CarPowerPolicyDaemon'a devreder. |
| CarPowerPolicyDaemon | Güç politikalarını yönetir ve yerel güç politikası istemcileriyle iletişim kurar. |
| Araç HAL'si | VMCU ile arayüz oluşturma. |
| Çekirdek | RAM'e veya diske askıya alma uygulaması. |
Derin uyku/hazırda bekleme özelliği (Android'i RAM/diske askıya alma) çekirdekte uygulanır.
Bu özellik, kullanıcı alanına /sys/power/state konumunda bulunan özel bir dosya olarak sunulur. AAOS, bu dosyaya mem veya disk yazılarak askıya alınır.
CPMS, güç durumunu diğer hizmetler ve HAL'lerle koordine eder. CPMS, yukarıda açıklanan durum makinesini uygular ve bir güç durumu geçişi gerçekleştiğinde her gözlemciye bildirim gönderir. Bu hizmet, donanıma mesaj göndermek için VHAL'yi de kullanır.
CPPD, güç politikaları için doğruluk kaynağıdır. Cihazın kullanım ömrü boyunca güç politikalarını yönetir ve CPMS, VHAL ve diğer yerel dinleyicileri güç politikası değişiklikleri konusunda bilgilendirir. CPMS, güç politikası değişikliği isteklerini CPPD'ye devreder.
CPMS, AP_POWER_STATE_REQ ve AP_POWER_STATE_REPORT gibi güç durumuyla ilgili VHAL özelliklerini okuyup yazarak VMCU ile iletişim kurar. Uygulamalar, güç durumu değişikliklerini izlemek için CPM'de tanımlanan arayüzü kullanabilir. Bu arayüz, uygulamaların güç politikası dinleyicilerini kaydetmesine de olanak tanır. Bu Java API'si @SystemApi ve @hide ile açıklama eklenmiş olduğundan yalnızca ayrıcalıklı uygulamalar tarafından kullanılabilir. Bu modüller, uygulamalar ve hizmetler arasındaki ilişki aşağıda gösterilmiştir:

Şekil 2. Güç bileşenleri referans şeması.
Mesaj sırası
Önceki bölümde, güç yönetim sistemini oluşturan modüller açıklanmıştır. Bu bölümde, modüllerin ve uygulamaların nasıl iletişim kurduğunu açıklamak için enter deep sleep (derin uykuya gir) ve exit deep sleep (derin uykudan çık) örnekleri kullanılmaktadır:
Derin uykuya girme
Derin uyku yalnızca VMCU tarafından başlatılabilir. Derin uyku başlatıldıktan sonra VMCU, VHAL aracılığıyla CPMS'ye bir bildirim gönderir. CPMS, durumu SHUTDOWN PREPARE olarak değiştirir ve CPM tarafından sağlanan yeni bir durum kimliğiyle onStateChanged() yöntemini çağırarak bu durum geçişini tüm gözlemcilere (CPMS'yi izleyen uygulamalar ve hizmetler) yayınlar.
ÇMY, uygulamalar/hizmetler ile ÇMY'ler arasında aracılık yapar. Uygulamalar/hizmetler için onStateChanged() yöntemi, ÇMY'nin onStateChanged() yönteminde eşzamanlı olarak çağrılır. Çoğu uygulama ve hizmetin, bu çağrıdan döndürülmeden önce hazırlıklarını tamamlaması gerekir. Ayrıcalıklı hizmetlerin, PRE_SHUTDOWN_PREPARE, SUSPEND_ENTER, POST_SUSPEND_ENTER için döndürüldükten sonra hazırlıklarına eşzamansız olarak devam etmesine izin verilir. Bu durumda, ayrıcalıklı hizmetin hazırlığını tamamladığında sağlanan CompletablePowerStateChangeFuture nesnesinde complete() yöntemini çağırması gerekir. Eşzamansız hazırlığa SHUTDOWN_PREPARE için izin verilmediğini unutmayın. DEEP_SLEEP_ENTRY, VHAL'ye gönderilmeden önce ÇMY'ler, VHAL'ye kapatmayı erteleme isteklerini düzenli olarak gönderir.
Tüm BGBM nesneleri kapatma hazırlıklarını tamamladığında CPMS, VHAL'ye AP_POWER_STATE_REPORT gönderir. VHAL ise VMCU'ya AP'nin askıya alınmaya hazır olduğunu bildirir. CPMS, çekirdeği askıya alan askıya alma yöntemini de çağırır.
Yukarıda açıklanan sıra aşağıda gösterilmektedir:

Şekil 3. Derin uyku moduna girer.
CPM tarafından sağlanan programlama arayüzleri
Bu bölümde, sistem uygulamaları ve hizmetleri için CPM tarafından sağlanan Java API'si açıklanmaktadır. Bu API, sistem yazılımının şunları yapmasını sağlar:
- AP'deki güç durumu değişikliklerini izleyin.
- Güç politikaları uygulayabilirsiniz.
CPM tarafından sağlanan API'leri çağırmak için aşağıdaki adımları uygulayın:
- BGBM örneğini edinmek için Car API'yi çağırın.
- 1. adımda oluşturulan nesnede uygun yöntemi çağırın.
CarPowerManager nesnesi oluşturma
Bir BGBM nesnesi oluşturmak için Car nesnesinin getCarManager() yöntemini çağırın. Bu yöntem, BGBM nesneleri oluşturmak için kullanılan bir cephedir. BGBM nesnesi oluşturmak için android.car.Car.POWER_SERVICE öğesini bağımsız değişken olarak belirtin.
Car car = Car.createCar(this); CarPowerManager powerManager = (CarPowerManager) car.getCarManager(android.car.Car.POWER_SERVICE);
CarPowerStateListener ve kayıt
Sistem uygulamaları ve hizmetleri, CarPowerManager.CarPowerStateListener uygulayarak güç durumu değişikliği bildirimleri alabilir. Bu arayüz, CPMS'nin güç durumu değiştiğinde çağrılan bir geri çağırma işlevi olan bir yöntemi tanımlar
onStateChanged(). Aşağıdaki örnekte, arayüzü uygulayan yeni bir anonim sınıf tanımlanmaktadır:
private final CarPowerManager.CarPowerStateListener powerListener = new CarPowerManager.CarPowerStateListener () { @Override public void onStateChanged(int state) { Log.i(TAG, "onStateChanged() state = " + state); } };
Bu dinleyici nesnesine güç durumu geçişini izlemesi talimatını vermek için yeni bir yürütme iş parçacığı oluşturun ve dinleyiciyi ve bu iş parçacığını CPM nesnesine kaydedin:
executor = new ThreadPerTaskExecutor(); powerManager.setListener(powerListener, executor);
Güç durumu değiştiğinde, dinleyici nesnesinin onStateChanged() yöntemi, yeni güç durumunu temsil eden bir değerle çağrılır. Gerçek değer ile güç durumu arasındaki ilişki CarPowerManager içinde tanımlanır ve aşağıdaki tabloda gösterilir:
| Ad | Açıklama |
|---|---|
| STATE_ON | Açık durumunu girin. Sistem tamamen çalışır durumdadır. |
| STATE_SHUTDOWN_CANCELLED | Kapatma işlemi iptal edilir ve güç durumu normal duruma döner. |
| STATE_SHUTDOWN_ENTER | uygulamaların temizlenmesi ve kapatılmaya hazır olması beklenir. |
| STATE_POST_SHUTDOWN_ENTER | Kapatma hazırlıkları tamamlandı ve VMCU kapatılmaya hazır. Kapatma durumuna girin. |
| STATE_PRE_SHUTDOWN_PREPARE | Kapatma işlemi isteniyor ancak CPMS henüz işlemi başlatmadı. Ekran ve ses hala açık. |
| STATE_SHUTDOWN_PREPARE | Bu süre zarfında Garaj Modu çalışabilir. |
| STATE_SUSPEND_ENTER | uygulamaların temizlenmesi ve RAM'e askıya alma işlemine hazır olması beklenir. |
| STATE_POST_SUSPEND_ENTER | RAM'e askıya alma hazırlıkları tamamlandı ve VMCU, RAM'e askıya alma işlemine hazır. Askıya alma durumuna girin. |
| STATE_SUSPEND_EXIT | Askıya alma durumundan çıkma veya iptal edilen askıya alma işlemine devam etme |
| STATE_HIBERNATION_ENTER | uygulamaların temizlenmesi ve hazırda bekletmeye alınmaya hazır olması beklenir. |
| STATE_POST_HIBERNATION_ENTER | Hazırda bekletme hazırlıkları tamamlandı ve VMCU hazırda bekletmeye hazır. Hazırda bekletme durumuna girin. |
| STATE_HIBERNATION_EXIT | Hazırda bekleme modundan çıkma veya iptal edilen hazırda bekleme moduna devam etme |
| STATE_WAIT_FOR_VHAL | Sistem başlatılıyor ancak AÇIK duruma geçmeden önce VHAL ile iletişim kurulmasını bekliyor. |
CarPowerStateListener kaydını kaldırma
BGBM'ye kaydedilen tüm dinleyici nesnelerinin kaydını silmek için clearListener yöntemini çağırın:
powerManager.clearListener();
Android uygulamanızda sistem entegrasyonu
Entegrasyon uzmanları aşağıdaki öğelerden sorumludur:
- Android'i askıya almak için çekirdek arayüzünü uygulama.
- VHAL işlevlerini kullanarak:
- Askıya alma veya kapatma işleminin başlatılmasını arabadan Android'e yayma
- Android'den arabaya kapatılmaya hazır mesajı gönderilir.
- Linux çekirdek arayüzü üzerinden Android'i kapatma veya askıya alma işlemlerini başlatın.
- Cihaz askıya alındığında tüm uyandırma kaynaklarının devre dışı olduğundan emin olun.
- Uygulamaların, kapatma sürecini süresiz olarak ertelemeyecek kadar hızlı bir şekilde kapatıldığından emin olun.
- BSP'nin, askıya alma veya hazırda bekletme işlemlerini engellememek için cihaz bileşenlerini güç politikasına göre açtığından (veya kapattığından) emin olun.
Çekirdek arayüzü: /sys/power/state
AAOS, bir uygulama veya hizmet /sys/power/state konumundaki bir dosyaya RAM'e askıya alma için mem ya da diske askıya alma için disk yazdığında cihazı askıya alma moduna geçirir. Entegratör, bu dosyayı izleyen ve Linux'u askıya alma güç durumuna geçiren bir işlev sağlamalıdır. Bu işlev, cihazın tamamen kapandığını VMCU'ya bildirmek için VMCU'ya bir GPIO gönderebilir. Entegratör, VHAL'in son mesajı VMCU'ya göndermesi ile sistemin askıya alma veya kapatma moduna girmesi arasındaki yarış durumlarını kaldırmaktan da sorumludur.
VHAL'nin sorumluluğu
VHAL, araç ağı ile Android arasında bir arayüz sağlar. VHAL:
- Askıya alma veya kapatma işleminin başlatılmasını arabadan Android'e yayar.
- Android'den arabaya kapatılmaya hazır mesajı gönderir.
- Linux çekirdek arayüzü üzerinden Android'in kapatılmasını veya askıya alınmasını başlatır.
CPMS, VHAL'ye kapanmaya hazır olduğunu bildirdiğinde VHAL, VMCU'ya kapanmaya hazır mesajını gönderir. Genellikle UART, SPI ve USB gibi çip üzerindeki çevre birimleri mesajı iletir. Mesaj gönderildikten sonra CPMS, cihazı askıya almak veya kapatmak için çekirdek komutunu çağırır. Bunu yapmadan önce VHAL veya BSP, VMCU'ya cihazdan güç kaldırmanın güvenli olduğunu bildirmek için bir GPIO'yu değiştirebilir.
VHAL, VHAL üzerinden güç yönetimini kontrol eden aşağıdaki özellikleri desteklemelidir:
| Ad | Açıklama |
|---|---|
| AP_POWER_STATE_REPORT | Android raporları, VehicleApPowerStateReport enum değerlerini kullanarak bu özellik ile VMCU'ya durum geçişlerini bildirir. |
| AP_POWER_STATE_REQ | VMCU, Android'e VehicleApPowerStateReq enum değerlerini kullanarak farklı güç durumlarına geçmesini bildirmek için bu özelliği kullanır. |
AP_POWER_STATE_REPORT
Android'in mevcut güç yönetimi durumunu bildirmek için bu özelliği kullanın. Bu özellik iki tam sayı içerir:
int32Values[0]: Geçerli durumun VehicleApPowerStateReport numaralandırması.int32Values[1]: Erteleme, uyutma veya kapatma için milisaniye cinsinden süre. Bu değerin anlamı, ilk değere bağlıdır.
İlk değer aşağıdaki değerlerden birini alabilir. VehicleApPowerStateReport.aidl
daha ayrıntılı açıklamalar içerir ve bunlar
hardware/interfaces/automotive/vehicle/aidl/android/hardware/automotive/vehicle içinde saklanır.
| Değer adı | Açıklama | İkinci değer |
|---|---|---|
| WAIT_FOR_VHAL | AP başlatılıyor ve VHAL ile iletişim kurması gerekiyor. | |
| DEEP_SLEEP_ENTRY | AP, derin uyku durumuna giriyor. VMCU, ikinci değerde belirtilen sürenin ardından AP'yi tekrar açmalıdır. | Ayarlanmalıdır |
| DEEP_SLEEP_EXIT | AP, derin uyku durumundan çıkıyor. | |
| HIBERNATION_ENTRY | AP, hazırda bekleme durumuna giriyor. VMCU, ikinci değerde belirtilen sürenin ardından AP'yi tekrar açmalıdır. | Ayarlanmalıdır |
| HIBERNATION_EXIT | AP, hazırda bekleme durumundan çıkıyor. | |
| SHUTDOWN_POSTPONE | Android kapatılmaya hazır değil. VMCU, AP'yi kapatmadan önce ikinci değerde belirtilen süre kadar beklemelidir. Android, ek SHUTDOWN_POSTPONE raporları yayınlayarak ek erteleme isteyebilir. | Ayarlanmalıdır |
| SHUTDOWN_PREPARE | Android kapatılmaya hazırlanıyor. | Ayarlanmalıdır |
| SHUTDOWN_START | AP kapatılmaya hazır. VMCU, ikinci değerde belirtilen sürenin ardından AP'yi tekrar açmalıdır. (VMCU'nun zamanlanmış açma özelliğini desteklemesi gerekmez.) | Ayarlanmalıdır |
| SHUTDOWN_CANCELLED | Android, kapatılmaya hazırlanmayı durduruyor ve WAIT_FOR_VHAL'e geçiyor. | |
| AÇIK | Android normal şekilde çalışıyor. |
Durum, VMCU aracılığıyla bağımsız olarak veya bir isteğe yanıt olarak ayarlanabilir.
AP_POWER_STATE_REQ
Bu özellik, VMCU tarafından Android'i farklı bir güç durumuna geçirmek için gönderilir ve iki tam sayı içerir:
int32Values[0]: Geçiş yapılacak yeni durumu temsil edenVehicleApPowerStateReqnumaralandırma değeri.int32Values[1]:VehicleApPowerStateShutdownParamnumaralandırma değeri. Bu değer yalnızcaSHUTDOWN_PREPAREmesajı için gönderilir ve içerdiği seçenekleri Android'e iletir.
İlk tam sayı değeri, Android'in geçiş yapacağı yeni durumu temsil eder. Anlamsal yapı VehicleApPowerStateReq.aidl içinde tanımlanır ve aşağıda verilmiştir:
| Değer adı | Açıklama |
|---|---|
| AÇIK | AP tam olarak çalışmaya başlamalıdır. |
| SHUTDOWN_PREPARE | AP, kapatılmaya hazırlanmalıdır. İkinci değer, AP'nin kapatmayı erteleyip erteleyemeyeceğini ve AP'nin kapanmayı mı yoksa derin uykuya girmeyi mi bekleyeceğini gösterir. |
| CANCEL_SHUTDOWN | AP, kapatılmaya hazırlanmayı durdurmalı ve AÇILMAYA hazırlanmalıdır. |
| TAMAMLANDI | AP artık kapatılacak veya askıya alınacak. |
VehicleApPowerStateShutdownParam, VehicleApPowerStateShutdownParam.aidl içinde tanımlanır. Bu enum şu öğeleri içerir:
| Değer adı | Açıklama |
|---|---|
| CAN_SLEEP | AP, tamamen kapanmak yerine derin uykuya geçebilir. Ertelemeye izin verilir. |
| CAN_HIBERNATE | AP tamamen kapanmak yerine hazırda bekletme moduna girebilir. Ertelemeye izin verilir. |
| SHUTDOWN_ONLY | AP kapatılmalıdır. Ertelemeye izin verilir. Derin uykuya izin verilmez. |
| SLEEP_IMMEDIATELY | AP derin uykuya girebilir ancak hemen uyku moduna geçmeli veya kapatılmalıdır. Ertelemeye izin verilmez. |
| HIBERNATE_IMMEDIATELY | AP, disk askıya alma moduna girebilir ancak hemen hazırda bekletme veya kapatma moduna geçmelidir. Ertelemeye izin verilmez. |
| SHUTDOWN_IMMEDIATELY | AP hemen kapatılmalıdır. Ertelemeye izin verilmez. Derin uykuya izin verilmez. |
Uyandırma kaynakları
Entegratör, cihaz askıya alma modundayken uygun uyandırma kaynaklarını devre dışı bırakmalıdır. Yaygın uyandırma kaynakları arasında kalp atışları, modem, kablosuz ve Bluetooth bulunur. Tek geçerli uyandırma kaynağı, SoC'yi uyandırmak için VMCU'dan gelen bir kesme olmalıdır. Bu, VMCU'nun uzaktan uyandırma etkinlikleri (ör. uzaktan motor çalıştırma) için modemi dinleyebildiğini varsayar. Bu işlev AP'ye gönderilirse modeme hizmet verecek başka bir uyandırma kaynağı eklenmelidir.
Uygulamalar
OEM'ler, uygulamaları hızlıca kapatılabilecek ve süreci süresiz olarak ertelemeyecek şekilde yazmaya özen göstermelidir.
Ek
Kaynak kodu ağacındaki dizinler
| İçerik | Dizin |
|---|---|
| CarPowerManager ile ilgili kod. | packages/services/Car/car-lib/src/android/car/hardware/power |
| CarPowerManagementService vb. | packages/services/Car/service/src/com/android/car/power |
VHAL ile ilgili hizmetler (ör. VehicleHal ve HAlClient). |
packages/services/Car/service/src/com/android/car/hal |
| VHAL arayüzü ve özellik tanımları. | hardware/interfaces/automotive/vehicle/aidl/android/hardware/automotive/vehicle/ |
CarPowerManager hakkında fikir edinmenizi sağlayacak örnek uygulama |
packages/services/Car/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink |
Sınıf diyagramı
Bu sınıf diyagramı, güç yönetimi sistemindeki Java sınıflarını ve arayüzlerini gösterir:

Şekil 4. Güç sınıfı diyagramı.
Nesne ilişkisi
Şekil 5, hangi nesnelerin diğer nesnelere referans verdiğini gösterir. Bir kenar, kaynak nesnenin hedef nesneye referans içerdiği anlamına gelir. Örneğin, VehicleHAL, PropertyHalService nesnesine referans içerir.

Şekil 5. Nesne referans şeması.