Android, araca özel güç yönetimini desteklemek için bir CarPowerManagementService
hizmeti ve bir 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örler çeşitli bileşenleri uygulamalıdır. Entegratörler, Araç donanımı soyutlama katmanı (VHAL) ve çekirdek uygulamasıyla entegrasyondan sorumludur. Entegratörler aynı zamanda uyanıklık kaynaklarını devre dışı bırakmaktan ve kapatmaların süresiz olarak ertelenmemesini sağlamaktan da sorumludur.
Terminoloji
Bu terimler bu belgenin tamamında kullanılmaktadır:
suspend()
ve shutdown()
için son çağrıları gerçekleştirir.Sistem tasarımı
Bu bölümde AAOS'un uygulama işlemcisinin güç durumunu nasıl temsil ettiği ve hangi modüllerin güç yönetimi sistemini uyguladığı açıklanmaktadır. Bu materyal aynı zamanda bu modüllerin birlikte nasıl çalıştığını ve durum geçişlerinin tipik olarak nasıl gerçekleştiğini de açıklamaktadır.
Araba güç durumu makinesi
AAOS, AP'nin güç durumunu temsil etmek için bir durum makinesi kullanır. Durum makinesi aşağıda gösterilen durumları sağlar:
Şekil 1. Araba güç durumu makinesi.
En yaygın geçişler mavi renkle vurgulanır. Bunlar durumlar ve ortak geçişlerdir:
- RAM'i askıya al. Araç ve SoC kapalı. Hiçbir kod yürütülmüyor. Güç SoC RAM'de korunur.
- VHAL'ı bekleyin. Sürücü, örneğin bir kapıyı açarak araçla etkileşime girdiğinde VMCU, SoC'ye güç uygular. AAOS, RAM'e Askıya Alma durumundan devam eder ve VHAL ile koordinasyonu beklediği VHAL'i Bekle moduna girer.
- Açık. VHAL, AAOS'a Açık durumuna girmesini söyler. Bu durumda, AAOS tamamen çalışıyor ve sürücüyle etkileşimde bulunuyor.
- Kapatma Hazırlığı. Sürücü sürüşü bitirdiğinde VHAL, AAOS'a Kapatma Hazırlığına girmesini söyler. Bu durumda ekran ve ses kapalıdır ve AAOS sürücüyle etkileşime girmez. Android sistemi hala çalışıyor ve uygulamaları ve Android sistemini güncellemek ücretsizdir. Varsa güncellemeler tamamlandığında Android sistemi VHAL Bitirmeyi Bekle durumuna girer.
- VHAL Finish'i bekleyin. Bu noktada AAOS, VHAL'e kapanmaya hazır olduğunu bildirir. VMCU'nun SoC'yi Derin Uyku'ya yerleştirmesi ve uygulama işlemcisinin gücünü kesmesi bekleniyor. AAOS, herhangi bir kod yürütülmemesine rağmen RAM'i Askıya Al durumundadır.
Güç yönetimi modülleri
Güç yönetim sistemi şu modüllerden oluşur:
Modül Adı | Tanım |
---|---|
ArabaGüç Yöneticisi | Java veya C++ API'si. |
ArabaGüçYönetim Hizmeti | Güç durumu geçişlerini koordine eder. |
ArabaGüç PolitikasıDaemon | Yerel güç politikası istemcileriyle iletişim kurar. |
Araç HAL'i | VMCU'ya arayüz. |
Çekirdek | RAM veya disk uygulamasını askıya alın. |
Derin uyku/hazırda bekletme özelliği (Android'i RAM/diske askıya alma) çekirdekte uygulanır. Bu özellik, /sys/power/state
konumunda bulunan özel bir dosya olarak kullanıcı alanına sunulur. Bu dosyaya mem
veya disk
yazılarak AAOS 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 meydana geldiğinde her gözlemciye bildirim gönderir. Bu hizmet aynı zamanda donanıma mesaj göndermek için VHAL'i kullanır.
CPPD, CPMS kontrolü ele alana kadar güç politikasını yönetir. Ayrıca yerel dinleyicilere güç politikası değişikliği bildirimleri de gönderir.
Bazı özellikler VHAL'de tanımlanmıştır. VMCU ile iletişim kurmak için CPMS bu özellikleri okur ve yazar. uygulamalar, güç durumu değişikliklerini izlemek için CPM'de tanımlanan arayüzü kullanabilir. Bu arayüz aynı zamanda uygulamaların güç politikası dinleyicilerini kaydetmesine de olanak tanır. Bu API, Java'dan çağrılabilir ve @hide / @System API ile açıklanır; bu, yalnızca ayrıcalıklı uygulamalar tarafından kullanılabileceği anlamına gelir. Bu modüller, uygulamalar ve hizmetler arasındaki ilişki aşağıda gösterilmektedir:
Şekil 2. Güç bileşenleri referans şeması.
Mesaj sırası
Önceki bölümde güç yönetim sistemini oluşturan modüller anlatılmıştır. Bu bölümde modüllerin ve uygulamaların nasıl iletişim kurduğunu açıklamak için derin uykuya girme ve derin uykudan çıkma örnekleri kullanılır:
Derin uykuya girin
Yalnızca VMCU derin uykuyu başlatabilir. Derin uyku başlatıldığında 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.
CPM, uygulamalar/hizmetler ile CPMS arasında aracılık eder. Uygulamalar/hizmetler için onStateChanged()
yöntemi, CPM'nin onStateChanged()
yönteminde eşzamanlı olarak çağrılır. Çoğu uygulama ve hizmetin bu çağrıdan geri dönmeden önce hazırlıklarını tamamlaması gerekir. Ayrıcalıklı servislerin PRE_SHUTDOWN_PREPARE
, SUSPEND_ENTER
, POST_SUSPEND_ENTER
için dönüş yaptıktan sonra asenkron olarak hazırlıklarına devam etmelerine izin verilir. Bu durumda ayrıcalıklı hizmetin, hazırlığını tamamladığında sağlanan CompletablePowerStateChangeFuture
nesnesindecomplete() öğesini çağırması gerekir. SHUTDOWN_PREPARE
için eşzamansız hazırlığa izin verilmediğini unutmayın. DEEP_SLEEP_ENTRY
, VHAL'e gönderilmeden önce CPMS, periyodik olarak kapatma erteleme isteklerini VHAL'e gönderir.
Tüm CPM nesneleri kapatma hazırlıklarını tamamladığında CPMS, VHAL'e AP_POWER_STATE_REPORT
gönderir ve bu daha sonra VMCU'ya AP'nin askıya alınmaya hazır olduğunu bildirir. CPMS ayrıca ç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 uykuya girin.
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 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ını uygulayın.
CPM tarafından sağlanan API'leri çağırmak için şu adımları kullanın:
- BGBM örneğini edinmek için Araba API'sini çağırın.
- Adım 1'de oluşturulan nesnede uygun yöntemi çağırın.
CarPowerManager nesnesi oluşturma
Bir CPM nesnesi oluşturmak için Araba nesnesinin getCarManager()
yöntemini çağırın. Bu yöntem CPM nesneleri oluşturmak için kullanılan bir cephedir. Bir CPM nesnesi oluşturmak için argüman olarak android.car.Car.POWER_SERVICE
öğesini belirtin.
Car car = Car.createCar(this); CarPowerManager powerManager = (CarPowerManager) car.getCarManager(android.car.Car.POWER_SERVICE);
CarPowerStateDinleyici ve kayıt
Sistem uygulamaları ve hizmetleri, CarPowerManager.CarPowerStateListener
uygulanarak güç durumu değişikliği bildirimlerini alabilir. Bu arayüz, CPMS'nin güç durumu değiştirildiğinde çağrılan bir geri çağırma işlevi olan onStateChanged()
yöntemini tanımlar. Aşağıdaki örnek, arayüzü uygulayan yeni bir anonim sınıfı tanımlar:
private final CarPowerManager.CarPowerStateListener powerListener = new CarPowerManager.CarPowerStateListener () { @Override public void onStateChanged(int state) { Log.i(TAG, "onStateChanged() state = " + state); } };
Bu dinleyici nesnesine bir güç durumu geçişini izleme 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ştirildiğinde, dinleyici nesnesinin onStateChanged()
yöntemi, yeni güç durumunu temsil edecek bir değerle çağrılır. Gerçek değer ile güç durumu arasındaki ilişki CarPowerManager
tanımlanmıştır ve aşağıdaki tabloda gösterilmektedir:
İsim | Tanım |
---|---|
STATE_ON | Açık durumuna girin. Sistem tamamen çalışır durumdadır. |
STATE_SHUTDOWN_CANCELLED | Kapatma iptal edilir ve güç durumu normal duruma döndürülür. |
STATE_SHUTDOWN_ENTER | uygulamaların temizlenmesi ve kapatılmaya hazır olması bekleniyor. |
STATE_POST_SHUTDOWN_ENTER | Kapatma hazırlıkları tamamlandı ve VMCU kapatmaya hazır. Kapatma durumuna girin. |
STATE_PRE_SHUTDOWN_PREPARE | Kapatma işlemi isteniyor ancak CPMS işlemi henüz başlatmıyor. Ekran ve ses hala açık |
STATE_SHUTDOWN_PREPARE | Garaj Modu bu süre boyunca çalışabilir. |
STATE_SUSPEND_ENTER | uygulamaların temizlenmesi ve RAM'de askıya alınmaya hazır olması bekleniyor. |
STATE_POST_SUSPEND_ENTER | RAM'e askıya alma hazırlıkları tamamlandı ve VMCU, RAM'e askıya almaya hazır. Askıya alma durumuna girin. |
STATE_SUSPEND_EXIT | Askıya alma durumundan uyanın veya iptal edilen bir askıya alma işleminden devam edin. |
STATE_HIBERNATION_ENTER | uygulamaların temizlenmesi ve hazırda bekletme moduna hazır olması bekleniyor. |
STATE_POST_HIBERNATION_ENTER | Hazırda bekleme hazırlıkları tamamlandı ve VMCU hazırda bekletme moduna hazır Hazırda bekletme durumuna girin. |
STATE_HIBERNATION_EXIT | Hazırda bekletme modundan uyanın veya iptal edilen bir hazırda bekletme modundan devam edin. |
STATE_WAIT_FOR_VHAL | Sistem başlatılıyor ancak AÇIK duruma geçmeden önce VHAL ile iletişim kurmayı bekliyor. |
CarPowerStateListener kaydını silme
CPM'ye kayıtlı tüm dinleyici nesnelerinin kaydını silmek için clearListener
yöntemini çağırın:
powerManager.clearListener();
Android uygulamanızda sistem entegrasyonu
Entegratörler aşağıdaki öğelerden sorumludur:
- Android'i askıya almak için çekirdek arayüzünü uygulama.
- VHAL işlevlerini şu amaçlarla uygulamak:
- Askıya alma veya kapatma işleminin başlatılmasını arabadan Android'e yayın.
- Kapatmaya hazır mesajını Android'den araca gönderin.
- Linux çekirdek arayüzü aracılığıyla Android'in kapatılmasını veya askıya alınmasını başlatın.
- Cihaz askıya alındığında tüm uyanık kalma kaynaklarının devre dışı bırakıldığından emin olun.
- Kapatma işlemini süresiz olarak ertelememek için uygulamaların yeterince hızlı kapandığından emin olun.
- Askıya alma veya hazırda bekletme modunu engellememek için BSP'nin 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, RAM'e askıya alma için mem
veya disk
askıya alma için diske /sys/power/state
konumunda bulunan bir dosyaya yazdığında, cihazı askıya alma moduna geçirir. Entegratörün bu dosyayı izleyen ve Linux'u güç askıya alma durumuna sokan bir işlev sağlaması gerekir. Bu işlev, VMCU'ya cihazın tamamen kapandığını bildirmek için VMCU'ya bir GPIO gönderebilir. Entegratör ayrıca VHAL'in VMCU'ya son mesajı göndermesi ile sistemin askıya alma veya kapatma moduna geçmesi arasındaki yarış koşullarının ortadan kaldırılmasından da sorumludur.
VHAL 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.
- Kapatmaya hazır mesajını Android'den araca gönderir.
- Linux çekirdek arayüzü aracılığıyla Android'in kapatılmasını veya askıya alınmasını başlatır.
CPMS, VHAL'e kapanmaya hazır olduğunu bildirdiğinde, VHAL, kapatmaya hazır mesajını VMCU'ya gönderir. Tipik olarak 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 cihazın gücünü kesmenin güvenli olduğunu bildirmek için bir GPIO'yu değiştirebilir.
VHAL, VHAL aracılığıyla güç yönetimini kontrol eden aşağıdaki özellikleri desteklemelidir:
İsim | Tanım |
---|---|
AP_POWER_STATE_REPORT | Android, AraçApPowerStateReport numaralandırma değerlerini kullanarak bu özellik ile VMCU'ya durum geçişlerini raporlar. |
AP_POWER_STATE_REQ | VMCU, Android'e AraçApPowerStateReq numaralandırma değerlerini kullanarak farklı güç durumlarına geçiş yapma talimatını vermek için bu özelliği kullanır. |
AP_POWER_STATE_REPORT
Android'in mevcut güç yönetimi durumunu raporlamak için bu özelliği kullanın. Bu özellik iki tamsayı içerir:
-
int32Values[0]
: Geçerli durumun AraçApPowerStateReport numaralandırması. -
int32Values[1]
: Milisaniye cinsinden erteleme veya uyku veya kapatma süresi. Bu değerin anlamı ilk değere bağlıdır.
İlk değer aşağıdaki değerlerden birini alabilir. VehicleApPowerStateReport.aidl
hardware/interfaces/automotive/vehicle/aidl/android/hardware/automotive/vehicle
dosyasında saklanan daha spesifik açıklamalar içerir.
Değer adı | Tanım | İkinci değer |
---|---|---|
WAIT_FOR_VHAL | AP başlıyor ve VHAL ile iletişim kurması gerekiyor. | |
DEEP_SLEEP_ENTRY | AP derin uyku durumuna giriyor. VMCU, ikinci değerde belirtilen sürenin sonunda AP'yi tekrar açmalıdır. | Ayarlanmalı |
DEEP_SLEEP_EXIT | AP derin uyku durumundan çıkıyor. | |
HIBERNATION_ENTRY | AP hazırda bekletme durumuna giriyor. VMCU, ikinci değerde belirtilen sürenin sonunda AP'yi tekrar açmalıdır. | Ayarlanmalı |
HİBERNATION_EXIT | AP hazırda bekleme durumundan çıkıyor. | |
SHUTDOWN_POSTPONE | Android kapanmaya hazır değil. VMCU, AP'yi kapatmadan önce ikinci değerde belirtilen süreyi beklemelidir. Android, ek SHUTDOWN_POSTPONE raporları yayınlayarak ek erteleme talep edebilir. | Ayarlanmalı |
SHUTDOWN_PREPARE | Android kapanmaya hazırlanıyor. | Ayarlanmalı |
SHUTDOWN_START | AP kapanmaya hazır. VMCU, ikinci değerde belirtilen sürenin sonunda AP'yi tekrar açmalıdır. (VMCU'nun zamanlanmış açma özelliğini desteklemesi gerekli değildir.) | Ayarlanmalı |
SHUTDOWN_CANCELED | Android kapanma hazırlığına son veriyor ve WAIT_FOR_VHAL'a geçecek. | |
AÇIK | Android normal çalışıyor. |
Durum bağımsız olarak veya VMCU aracılığıyla bir talebe yanıt olarak ayarlanabilir.
AP_POWER_STATE_REQ
Bu özellik, Android'i farklı bir güç durumuna geçirmek için VMCU tarafından gönderilir ve iki tam sayı içerir:
-
int32Values[0]
: Geçiş yapılacak yeni durumu temsil edenVehicleApPowerStateReq
numaralandırma değeri. -
int32Values[1]
:VehicleApPowerStateShutdownParam
numaralandırma değeri. Bu değer yalnızcaSHUTDOWN_PREPARE
mesajı 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. Anlambilim, VehicleApPowerStateReq.aidl
tanımlanmış ve aşağıda verilmiştir:
Değer adı | Tanım |
---|---|
AÇIK | AP tam çalışmaya başlamalıdır. |
SHUTDOWN_PREPARE | AP kapanmaya hazırlanmalı. İkinci değer, AP'nin kapatmayı ertelemesine izin verilip verilmediğini ve AP'nin kapanmayı mı yoksa derin uykuya mı girmeyi beklemesi gerektiğini gösterir. |
CANCEL_SHUTDOWN | AP kapanmaya hazırlanmayı bırakmalı ve AÇIK duruma geçmeye hazırlanmalı. |
BİTİRİLDİ | AP şimdi kapatılacak veya askıya alınacak. |
VehicleApPowerStateShutdownParam
, VehicleApPowerStateShutdownParam.aidl
tanımlanmıştır. Bu numaralandırma şu öğelere sahiptir:
Değer adı | Tanım |
---|---|
UYUYABİLİR | AP tamamen kapanmak yerine derin uyku moduna geçebilir. Ertelemeye izin verilir. |
CAN_HIBERNATE | AP tamamen kapanmak yerine hazırda bekletme moduna girebilir. Ertelemeye izin verilir. |
SADECE KAPATMA | AP'nin kapatılması gerekiyor. Ertelemeye izin verilir. Derin uykuya izin verilmez. |
SLEEP_HEMEN | AP derin uykuya girebilir ancak ya uykuya dalmalı ya da hemen kapatılmalıdır. Ertelemeye izin verilmez. |
HİBERNAT_HEMEN | AP, diski askıya alma moduna geçebilir ancak ya hazırda bekletme moduna geçmeli ya da hemen kapatılmalıdır. Ertelemeye izin verilmez. |
HEMEN KAPATILDI | AP'nin acilen kapatılması gerekiyor. Ertelemeye izin verilmez. Derin uykuya izin verilmez. |
Uyandırma kaynakları
Cihaz askıya alma modundayken entegratörün uygun uyandırma kaynaklarını devre dışı bırakması gerekir. Yaygın uyandırma kaynakları arasında kalp atışları, modem, Wi-Fi ve Bluetooth bulunur. Tek geçerli uyandırma kaynağı, SoC'yi uyandırmak için VMCU'dan gelen bir kesinti olmalıdır. Bu, VMCU'nun uzaktan uyandırma olayları (uzaktan motor çalıştırma gibi) için modemi dinleyebileceğini varsayar. Bu işlevsellik AP'ye gönderilirse modeme hizmet verecek başka bir uyandırma kaynağının eklenmesi gerekir.
Uygulamalar
OEM'lerin, uygulamaları hızla kapatabilmeleri ve süreci süresiz olarak ertelememeleri için yazarken dikkatli olmaları gerekir.
Ek
Kaynak kod ağacındaki dizinler
İçerik | Rehber |
---|---|
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 |
VehicleHal ve HAlClient gibi VHAL ile ilgili hizmetler. | 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 veren örnek uygulama | packages/services/Car/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink |
Sınıf diyagramı
Bu sınıf şeması, güç yönetimi sistemindeki Java sınıflarını ve arayüzlerini görüntüler:
Şekil 4. Güç sınıfı diyagramı.
Nesne ilişkisi
Şekil 5, hangi nesnelerin diğer nesnelere referanslara sahip olduğunu göstermektedir. Kenar, kaynak nesnenin hedef nesneye bir referans tuttuğu anlamına gelir. Örneğin, AraçHAL'in bir PropertyHalService nesnesine referansı vardır.
Şekil 5. Nesne referans diyagramı.