Android, araca özgü güç yönetimini desteklemek için bir CarPowerManagementService
hizmeti ve CarPowerManager
arayüzü sağlar.
Durum geçişleri, Araç Ana Kontrol Ünitesi (VMCU) tarafından tetiklenir. Entegratörlerin VMCU ile iletişim kurabilmesi için birkaç bileşeni uygulaması gerekir. Entegratörler, araç donanım soyutlama katmanı (VHAL) ve çekirdek uygulamasıyla entegrasyondan sorumludur. Entegratörler, uyanma kaynaklarını devre dışı bırakmaktan ve kapatma işlemlerinin süresiz olarak ertelenmediğinden de sorumludur.
Terminoloji
Bu belgede aşağıdaki terimler kullanılmaktadır:
suspend()
ile shutdown()
'ye son çağrıları yapar.Sistem tasarımı
Bu bölümde, AAOS'un uygulama işlemcisinin güç durumunu nasıl temsil ettiği ve güç yönetimi sistemini hangi modüllerin 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.
Araç 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. Durumlar ve yaygın geçişler şunlardır:
- RAM'e askıya alma Araç ve SoC kapalıdır. Hiçbir kod yürütülmez. SoC RAM'e güç sağlanmaya devam eder.
- VHAL'ı bekleyin. Sürücü, araçla etkileşime geçtiğinde (ör. bir kapıyı açarak) VMCU, SoC'ye güç uygular. AAOS, RAM'de askıya alma durumundan devam eder ve VHAL ile koordinasyonu beklediği VHAL'i bekleme durumuna girer.
- Açık. VHAL, AAOS'a Açık durumuna girmesini söyler. Bu durumda AAOS tamamen çalışır durumdadır ve sürücüyle etkileşim kurar.
- Kapatma için hazırlanın. Sürücü sürüşünü tamamladığında 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şimde bulunmaz. Android sistemi çalışmaya devam eder ve uygulamaları ve Android sistemini güncelleyebilirsiniz. Güncellemeler (varsa) tamamlandığında Android sistemi, VHAL'ın tamamlanmasını bekler.
- VHAL'ın tamamlanmasını bekleyin. Bu noktada AAOS, VHAL'e kapanmaya hazır olduğunu bildirir. VMCU'nun SoC'yi derin uykuya geçirmesi ve uygulama işlemciden gücü kaldırması beklenir. Bu durumda, hiçbir kod yürütülmemesine rağmen AAOS RAM'e askıya alınmış durumdadır.
Güç yönetimi modülleri
Güç yönetimi sistemi aşağıdaki modüllerden oluşur:
Modül adı | Açıklama |
---|---|
CarPowerManager | Java veya C++ API'si. |
CarPowerManagementService | Güç durumu geçişlerini koordine eder. |
CarPowerPolicyDaemon | Yerel güç politikası istemcileriyle iletişim kurar. |
Araç HAL'si | VMCU arayüzü. |
Patlayan mısır | RAM veya diske askıya alma uygulaması. |
Derin uyku/kış uykusu özelliği (Android'i RAM/diskte askıya alma), çekirdekte uygulanır.
Bu özellik, /sys/power/state
adresinde 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 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'i de kullanır.
CPMS kontrolü devralana kadar güç politikasını CPPD yönetir. Ayrıca, yerel dinleyicilere güç politikası değişikliği bildirimleri gönderir.
Bazı özellikler VHAL'de tanımlanır. CPMS, VMCU ile iletişim kurmak için bu mülkleri okur ve yazar. Uygulamalar, güç durumu değişikliklerini izlemek için CPM'de tanımlanan arayüzü kullanabilir. Bu arayüz, uygulamaların güç politikası dinleyicileri kaydetmesine de olanak tanır. Bu API, Java'dan çağrılabilir ve @hide / @System API ile ek açıklamaya sahiptir. Bu, API'nin 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österilmiştir:
Şekil 2. Güç bileşenleri referans şeması.
Mesaj sırası
Önceki bölümde, güç yönetimi sistemini oluşturan modüller açıklanmıştı. Bu bölümde, modüllerin ve uygulamaların nasıl iletişim kurduğu açıklanmak için derin uykuya girme ve derin uykudan çıkma örnekleri kullanılmaktadır:
Derin uykuya girme
Derin uyku modunu yalnızca VMCU başlatabilir. Derin uyku başlatıldıktan sonra VMCU, VHAL aracılığıyla CPMS'ye bir bildirim gönderir. CPMS, durumu KAPATMAYA HAZIR 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.
BGBM, uygulamalar/hizmetler ile BGBM'ler arasında aracılık eder. Uygulamalar/hizmetler için onStateChanged()
yöntemi, BGBM'nin onStateChanged()
yönteminde eşzamanlı olarak çağrılır. Çoğu uygulama ve hizmetin, bu görüşmeden dönmeden önce hazırlıklarını tamamlaması gerekir. Ayrıcalıklı hizmetlerin, PRE_SHUTDOWN_PREPARE
, SUSPEND_ENTER
, POST_SUSPEND_ENTER
için döndükten sonra hazırlıklarına ayarsız olarak devam etmesine izin verilir. Bu durumda ayrıcalıklı hizmetin, hazırlık işlemini tamamladığında sağlanan CompletablePowerStateChangeFuture
nesnesinde complete() işlevini çağırması gerekir. SHUTDOWN_PREPARE
için asenkron hazırlığa izin verilmediğini unutmayın. DEEP_SLEEP_ENTRY
VHAL'e gönderilmeden önce CPMS, VHAL'e düzenli olarak kapatma erteleme istekleri gönderir.
Tüm CPM nesneleri kapatma hazırlıklarını tamamladığında CPMS, AP_POWER_STATE_REPORT
öğesini VHAL'e gönderir. VHAL de AP'nin askıya alınmaya hazır olduğunu VMCU'ya 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österilmiştir:
Şekil 3. Derin uykuya girin.
CPM tarafından sağlanan programlama arayüzleri
Bu bölümde, CPM tarafından sistem uygulamaları ve hizmetleri için 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ı uygulayabilirsiniz.
BGBM tarafından sağlanan API'leri çağırmak için aşağıdaki adımları uygulayın:
- BGBM örneğini almak 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 Araba 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 bağımsız değişken olarak android.car.Car.POWER_SERVICE
değerini 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 bildirimi alabilir. Bu arayüz, CPMS'nin güç durumu değiştiğinde çağrılan bir geri çağırma işlevi olan onStateChanged()
yöntemini tanımlar. 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 izleme talimatı vermek için yeni bir yürütme iş parçacığı oluşturun ve dinleyiciyi ve bu iş parçacığını BGBM 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 durumu girin. Sistem tamamen çalışır durumdadır. |
STATE_SHUTDOWN_CANCELLED | Kapatma işlemi iptal edilir ve güç durumu normale döndürülür. |
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 istenir ancak CPMS henüz işlemi başlatmaz. Ekran ve ses hâlâ açık |
STATE_SHUTDOWN_PREPARE | Bu süre zarfında Garaj Modu çalışabilir. |
STATE_SUSPEND_ENTER | uygulamaların temizlenmesi ve RAM'de askıya alınmaya hazır olması beklenir. |
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 durumunu girin. |
STATE_SUSPEND_EXIT | Askıya alınan cihazı uyandırabilir veya iptal edilen askıya alma durumundan devam ettirebilirsiniz. |
STATE_HIBERNATION_ENTER | uygulamaların temizlenmesi ve hazırda bekleme moduna geçmeye hazır olması beklenir. |
STATE_POST_HIBERNATION_ENTER | Uyku moduna hazırlanma işlemleri tamamlandı ve VMCU uyku moduna hazır. Uyku moduna girin. |
STATE_HIBERNATION_EXIT | Uyku modundan uyanma veya iptal edilen uyku modundan devam etme. |
STATE_WAIT_FOR_VHAL | Sistem başlatılıyor ancak AÇIK duruma geçmeden önce VHAL ile iletişim kurmayı bekliyor. |
CarPowerStateListener'ın kaydını silme
BGBM'ye kayıtlı tüm dinleyici nesnelerinin kaydını iptal etmek 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 uygulamak için:
- Askıya alma veya kapatma işleminin başlatılmasını arabadan Android'e iletme.
- Android'den araca kapatılmaya hazır mesajı gönderin.
- Android'in kapatılmasını veya askıya alınmasını Linux çekirdek arayüzü üzerinden başlatma.
- Cihaz beklemedeyken tüm uyanma kaynaklarının devre dışı olduğundan emin olun.
- Kapatma işleminin süresiz olarak ertelenmemesini sağlamak için uygulamaların yeterince hızlı kapandığından emin olun.
- Askıya alma veya hazırda bekleme 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 /sys/power/state
konumundaki bir dosyaya RAM'e askıya alma için mem
veya diske askıya alma için disk
yazdığında cihazı askıya alma moduna alır. 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, VMCU'ya bir GPIO göndererek VMCU'yu cihazın tamamen kapandığı konusunda bilgilendirebilir. Entegratör, VHAL'ın VMCU'ya son mesajı göndermesi ile sistemin askıya alma veya kapatma moduna geçmesi arasındaki tüm yarış koşullarını kaldırmaktan 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ı araçtan Android'e iletir.
- Android'den araca kapatılmaya hazır mesajı gönderir.
- Android'in Linux çekirdek arayüzü üzerinden kapatılmasını veya askıya alınmasını başlatır.
CPMS, VHAL'e kapanmaya hazır olduğunu bildirdiğinde VHAL, kapanmaya hazır mesajını VMCU'ya gönderir. Mesaj genellikle UART, SPI ve USB gibi çip üzerinde çevre birimleri tarafından iletilir. 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ücü kaldırmanın 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:
Ad | Açıklama |
---|---|
AP_POWER_STATE_REPORT | Android, VehicleApPowerStateReport enum değerlerini kullanarak bu mülkle VMCU'ya durum geçişlerini bildirir. |
AP_POWER_STATE_REQ | VMCU, VehicleApPowerStateReq enum değerlerini kullanarak Android'e farklı güç durumlarına geçme talimatı vermek için bu mülkü kullanır. |
AP_POWER_STATE_REPORT
Android'in mevcut güç yönetimi durumunu bildirmek için bu özelliği kullanın. Bu mülk iki tam sayı içerir:
int32Values[0]
: Mevcut durumun VehicleApPowerStateReport enum değeri.int32Values[1]
: Erteleme, uyku 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 biri olabilir. VehicleApPowerStateReport.aidl
, hardware/interfaces/automotive/vehicle/aidl/android/hardware/automotive/vehicle
içinde depolanan daha ayrıntılı açıklamalar içerir.
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 zamandan sonra AP'yi tekrar açmalıdır. | Ayarlanmalıdır |
DEEP_SLEEP_EXIT | AP, derin uyku durumundan çıkıyor. | |
HIBERNATION_ENTRY | AP, uyku durumuna giriyor. VMCU, ikinci değerde belirtilen zamandan sonra AP'yi tekrar açmalıdır. | Ayarlanmalıdır |
HIBERNATION_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 isteyebilir. | Ayarlanmalıdır |
SHUTDOWN_PREPARE | Android kapanmaya hazırlanıyor. | Ayarlanmalıdır |
SHUTDOWN_START | AP kapatılmaya hazır. VMCU, ikinci değerde belirtilen zamandan sonra AP'yi tekrar açmalıdır. (VMCU'nun zamanlı açma özelliğini desteklemesi gerekmez.) | Ayarlanmalıdır |
SHUTDOWN_CANCELLED | Android, kapanmaya hazırlanmayı durduruyor ve WAIT_FOR_VHAL'a geçiyor. | |
AÇIK | Android normal şekilde çalışıyor. |
Durum, bağımsız olarak veya VMCU üzerinden bir isteğe yanıt olarak ayarlanabilir.
AP_POWER_STATE_REQ
Bu mülk, 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
enum değeri.int32Values[1]
:VehicleApPowerStateShutdownParam
enum 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. Anlamlar VehicleApPowerStateReq.aidl
'te tanımlanmıştır ve aşağıda verilmiştir:
Değer adı | Açıklama |
---|---|
AÇIK | AP tam çalışmaya başlayacaktır. |
SHUTDOWN_PREPARE | AP kapanmaya hazırlanır. İkinci değer, AP'nin kapanmayı ertelemesine izin verilip verilmediğini ve AP'nin kapanmasını veya derin uykuya geçmesini bekleyip beklemeyeceğini belirtir. |
CANCEL_SHUTDOWN | AP, kapanmaya hazırlanmayı bırakıp AÇILMAYA hazırlanmalıdır. |
TAMAMLANDI | AP şimdi kapatılacak veya askıya alınacak. |
VehicleApPowerStateShutdownParam
, VehicleApPowerStateShutdownParam.aidl
içinde tanımlanmışsa. Bu enum aşağıdaki öğeleri içerir:
Değer adı | Açıklama |
---|---|
CAN_SLEEP | AP tamamen kapanmak yerine derin uykuya girebilir. Erteleme işlemine izin verilir. |
CAN_HIBERNATE | AP tamamen kapanmak yerine uyku moduna girebilir. Erteleme işlemine izin verilir. |
SHUTDOWN_ONLY | AP kapanır. Erteleme işlemine izin verilir. Derin uykuya izin verilmez. |
SLEEP_IMMEDIATELY | AP derin uykuya girebilir ancak hemen uykuya geçmeli veya kapanmalıdır. Erteleme yapılamaz. |
HIBERNATE_IMMEDIATELY | AP, diske askıya alma durumuna girebilir ancak hemen uyku moduna geçmeli veya kapanmalıdır. Erteleme yapılamaz. |
SHUTDOWN_IMMEDIATELY | AP hemen kapatılmalıdır. Erteleme yapılamaz. Derin uykuya izin verilmez. |
Uyandırma kaynakları
Entegratör, cihaz askıya alma modundayken uygun uyanma kaynaklarını devre dışı bırakmalıdır. Kalp atışları, modem, kablosuz ağ ve Bluetooth, cihazı uyandıran yaygın kaynaklardır. SoC'yi uyandıran tek geçerli uyanma kaynağı, VMCU'dan gelen bir kesinti olmalıdır. Bu durumda, VMCU'nun uzaktan uyanma etkinlikleri (ör. uzaktan motor çalıştırma) için modemi dinleyebileceği varsayılır. Bu işlev AP'ye gönderilirse modemi servis edecek başka bir uyanma kaynağı eklenmelidir.
Uygulamalar
OEM'ler, uygulamaları hızlı bir şekilde kapatılabilmeleri ve sürecin süresiz olarak ertelenmemeleri için dikkatli bir şekilde yazmalıdır.
Ek
Kaynak kod 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 ilgilenen hizmetler (ör. VehicleHal ve HAlClient ). |
packages/services/Car/service/src/com/android/car/hal |
VHAL arayüzü ve mülk tanımları. | hardware/interfaces/automotive/vehicle/aidl/android/hardware/automotive/vehicle/ |
CarPowerManager hakkında fikir vermek için örnek uygulama |
packages/services/Car/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink |
Sınıf diyagramı
Bu sınıf şemasında, güç yönetimi sistemindeki Java sınıfları ve arayüzleri gösterilmektedir:
Şekil 4. Güç sınıfı şeması.
Nesne ilişkisi
Şekil 5'te, hangi nesnelerin diğer nesnelere referansı olduğu gösterilmektedir. Kenar, kaynak nesnenin hedef nesneye referans tuttuğu anlamına gelir. Örneğin, VehicleHAL bir PropertyHalService nesnesine referans verir.
Şekil 5. Nesne referans şeması.