Android 14'teki yeni araba OEM eklenti hizmetleri, bazı araba bileşenlerinin yapılandırılmasını sağlar. Özellikle ses için, OEM'lerin AAOS cihazlarda ses yönetimini esnek bir şekilde yapılandırmasına olanak tanıyan üç yeni eklenti hizmeti kullanıma sunuldu:
- Ses odağı kontrolü
- Ses seviyesi ve sesi kapatma kontrolü
- Sesi kısma kontrolü
Araba eklentisi hizmet mimarisi
Aşağıdaki şekilde, araç hizmetlerine ve bunların OEM araç hizmetiyle ilişkisine genel bir bakış sunulmaktadır. Uygulama süreçlerine ve araç servisi sürecine benzer şekilde, OEM araç servisi süreci de kendi süreç alanını kullanır.
Araba hizmeti, config_oemCarService
içinde tanımlanan bileşeni bularak OEM araba hizmetini başlatır. Yapılandırma boşsa OEM hizmeti yoktur ve herhangi bir hizmet başlatılmaz. Bileşen, OemCarService'i genişletmelidir.
Araba ses hizmeti, araba ses OEM hizmetini edinmeye yönelik API'lerin üzerine yazmalıdır:
public final class OemCarServiceImp extends OemCarService {
@Override
public OemCarAudioFocusService getOemAudioFocusService();
@Override
public OemCarAudioDuckingService getOemAudioDuckingService();
@Override
public OemCarAudioVolumeService getOemAudioVolumeService();
}
Örneğin, packages/services/Car/tests/OemCarServiceTestApp
içinde tanımlanan referans test uygulamasını inceleyin.
Hizmet, araç servisi tarafından başlatılsa da araç ses hizmeti için kullanılabilen izinleri otomatik olarak devralmaz. Bu nedenle, OEM hizmetleri tarafından gerekli olan tüm izinler uygun mekanizma kullanılarak alınmalıdır. Örneğin, packages/services/Car/data/etc/com.android.car.oemcarservice.testapp.xml
konusuna bakın.
OEM hizmet mimarisine sahip araç ses sistemi hizmeti
AAOS'te araba ses hizmeti şu işlemleri yönetir:
- Ses yönlendirme
- Ses odağı
- Sesi kısma
- Ses düzeyi ve sesi kapatma
Android 14'ten önce bu davranış büyük ölçüde statikti ve yalnızca çok sınırlı sayıda durum için ayarlardan değiştirilebiliyordu. Android 14, araç ses hizmetinin aşağıdakileri yöneten OEM tanımlı bir bileşenle iletişim kurmasını sağlayan bir mekanizma sunar:
- Ses odağı
- Sesi kısma
- Ses düzeyi ve sesi kapatma
Aşağıdaki şekilde, araç ses hizmeti ve araç OEM hizmeti için basitleştirilmiş bir mimari gösterilmektedir. Araba ses hizmeti, ses davranışını yönetmek için araba OEM ses hizmetini çağırabilen farklı kancalar tanımlar. Bu durum yalnızca ilgili OEM araç ses hizmeti bileşeni tanımlanmışsa gerçekleşir. Aksi takdirde, araç ses hizmeti varsayılan davranışı kullanır.
Araba ses hizmetinin ve araba OEM ses hizmetinin her zaman senkronize olmasını sağlamak için araba ses hizmeti, her aramada ses yığınının mevcut durumunun gerekli kısımlarını araba OEM ses hizmetine iletir. Örneğin, araba ses hizmeti ses odağını değerlendirme isteğini yakaladığında yığının mevcut durumunu araba OEM ses hizmetine iletir. Mevcut durum, mevcut odaklanma sahibini ve mevcut odaklanma kaybedenlerini içerir. Odaklanma kaybedenler, yığında yer almaya devam eden ancak geçici olarak odaklanmayı kaybeden odaklanma istekleridir.
Araç ses hizmeti, araçtaki tüm ses etkinliklerini yönetmelidir. Araba ses hizmeti, ses davranışının bazı kısımlarını yönetmiyorsa araba OEM ses hizmetine sunulan bilgiler eksiktir. Örneğin, bir OEM kendi ses odaklanma politikasını kaydederek araç hizmetindeki ses odaklanma işleme özelliğinin üzerine yazarsa araç ses hizmeti, araç OEM ses hizmetine eksiksiz bilgi sağlayamaz. Bu durum, otomobil ses hizmetine görünmeyen bilgiler eksik olabileceğinden otomobil OEM ses hizmetinin karar verme yeteneğini etkileyebilir.
Araç ses hizmeti, işlem yapmak için OEM araç hizmetlerini çağırır. Bu çağrılar, işlemler arası iletişim (IPC) gerektiren işlemler arasında yapılır. IPC, her çağrıya gecikme ekler. OEM hizmetinde gecikmeyi en aza indirmek önemlidir.
OEM hizmetine yapılan araç ses hizmeti çağrıları engellendiğinden OEM hizmeti, doğrudan API değerlendirmelerinde araç ses hizmetini çağırmamalıdır. Bunun yerine, araç ses hizmeti gerekli bilgileri sağlar. Böylece iki işlem arasındaki aramaların yalnızca tek yönde ilerlemesi gerekir.
OEM araç ses hizmeti tanımları
OEM araç ses odağı hizmeti
Araç ses hizmeti, bir ses politikası odak dinleyicisi kaydederek uygulamalardan gelen ses odağı isteklerini yönetir. Araba ses hizmeti, odak davranışını statik bir etkileşim matrisine göre yönetme mekanizmasına sahiptir. Matris üç farklı etkileşim türünü tanımlar:
Eşzamanlı etkileşim Odak sahipleri aynı anda odaklanabilir.
Özel etkileşimler Gelen odak isteği, mevcut odak sahibinden odağı alır.
Etkileşimi reddetme Mevcut odak sahibi nedeniyle gelen odaklanma isteği reddedildi.
Bu, bazı otomotiv kullanım alanları için yeterli olsa da OEM gereksinimleri nedeniyle farklılık gösterebilecek tüm etkileşim ihtiyaçlarını karşılamaz. Bu amaçla OemCarAudioFocusService
özelliğini kullanıma sunuyoruz:
public interface OEmCarAudioFocusService {
OemCarAuddioFocusResults evaluateAudioFocusRequest(
OemCarAudioFocusEvaluationRequest request);
void notifyAudioFocusChange(
List<AudioFocusEntry> holder,
List<AudioFocusEntry> losers, int zoneId);
}
API evaluateAudioFocusRequest
, değerlendirilmesi gereken bir ses odağı isteği olduğunda araba ses hizmetinden çağrılır. Sonuçların döndürülmesi için engelleme yapan iki yönlü bir API'dir. İstek, ses yığınının mevcut durumuyla ilgili bilgileri içerir:
Bu bilgiler, newFocusRequest
ile focusHolders
'deki mevcut odaklanma sahipleri ve focusLosers
'deki mevcut odaklanma kaybedenler karşılaştırılırken kullanılabilir. API, sonuçları döndürmelidir:
class OemCarAudioFocusResult {
int audioZoneId;
int audioFocusEvaluationResults;
AudioFocusEntry focusResult;
List<AudioFocusEntry> newLosers;
List<AudioFocusEntry> newlyBlocked;
}
Bu, audioFocusEvaluationResults
içindeki gerçek değerlendirme sonuçlarıyla ilgili bilgileri içerir. Bu bilgiler, mevcut isteğin kabul edilip edilmediğini, geciktirilip geciktirilmediğini veya başarısız olup olmadığını gösterir. Mevcut odak yığınında yapılan değişiklikler, yığın değişikliğinin niteliğine bağlı olarak newLosers
ve newlyBlocked
girişlerinde ayarlanmalıdır.
newLosers
, daha önce odaklanılmış ancak artık kalıcı veya geçici olarak odağı kaybetmesi gereken girişler içerdiğinde. Kalıcı odak kaybedenler, ses odağı yığınından daha da uzaklaştırılır. Geçici odak kaybedenler ise odağı yeniden kazanana veya orijinal odak isteğinde bulunan tarafından bırakılana kadar mevcut odak kaybedenler yığınına taşınır. Her durumda, isteklerin odak dinleyicisi, odak kaybıyla ilgili bir yanıt alır.
newlyBlocked
listesi, daha önce odaklanmayı kaybedenler listesinde yer alan ancak yeni giriş tarafından engellenen girişleri içerir. Engelleme kalıcı veya geçici olabilir. Kalıcı odak engellemesinde giriş yığından kaldırılır ve odak dinleyicilerine odak kaybı gönderilir. Geçici odak kaybı için giriş, odak kaybedenler yığınında kalır ancak engellenenler listesine yeni bir odak engelleyici eklenir. Daha önce ilk engellendiğinde gönderildiği için odak kaybı gönderilmez. Tüm mevcut engelleyiciler kaldırıldığında istek nihayet engellenmeyecek veya odak bırakılırsa yığından kaldırılacaktır.
İkinci API olan notifyAudioFocusChange
, her ses odağı isteğinde veya bırakma işleminde çağrılan tek yönlü bir API'dir. API, genellikle OEM hizmetini odak değişiklikleri hakkında bilgilendirmek için kullanılır. Bu değişiklikler, OEM araç ses hizmetinin davranışını etkileyebilir.
Odak değerlendirmesi yönergeleri
AAOS'te ses odaklanması, ses çalmayı yönetmek ve kullanıcıya optimum deneyimi sunmak için hangi uygulamanın uyması gerektiğini belirlemek için kullanılır. Bu nedenle, OEM eklenti hizmeti bir ses odağı isteğini yönetirken aşağıdakileri dikkate almalıdır:
Yüksek öncelikli ses odağı (ör. telefon görüşmesi, acil durum veya güvenlik) olmayan uygulamalar, ses odağını geçici veya kalıcı olarak kazanabilmelidir.
Medya odağı etkin durumdayken istekte bulunan uygulamalar:
Arama kullanımına odaklanma, eşzamanlı veya özel olarak odaklanma alabilmelidir.
Gezinme kullanımına odaklanılmalıdır. Odak, eşzamanlı veya ayrı ayrı alınabilmelidir.
Asistan kullanımına odaklanma, eşzamanlı veya özel olarak odaklanma alabilmelidir.
Yüksek öncelikli ses odağı (ör. telefon araması, acil durum uyarısı veya güvenlik uyarısı) uygulamaları etkin durumdayken, gelen gecikmeli ses odağı istekleri gerektiği şekilde kabul edilmeli veya geciktirilmelidir.
Yukarıdaki öneriler kapsamlı olmasa da odaklanma isteğinde bulunan uygulamaların, etkin ve yüksek öncelikli sesler olmadığında odaklanmayı elde edebilmesini sağlamaya yardımcı olabilir. Yüksek öncelikli sesler etkin olsa bile, gecikmeli odaklanma isteklerine uyulmaya devam edilmeli ve yüksek öncelikli ses durduktan sonra odaklanma sağlanabilmelidir.
OEM araba ses seviyesi hizmeti
Araç ses hizmeti, ses sisteminden gelen ses ayarlamalarını veya doğrudan araç giriş hizmetinden gelen ses tuşu etkinliklerini dinleyerek ses tuşu etkinliklerini yönetir. Her durumda, araba ses hizmetinin varsayılan davranışı, etkin ses oynatıcılar ve ses bağlamı öncelik listesine göre hangi ses grubu değiştirileceğini belirlemektir.
İki birim öncelik listesi sunuyoruz. İlk listede tüm ses bağlamları bu sırayla değerlendirilir. Liste azalan düzende sunulur. En yüksek öncelik en üstte, en düşük öncelik ise en altta yer alır. Örneğin, hem navigasyon sesi hem de müzik sesi aynı anda etkinse ses düzeyi tuşu etkinliği sırasında navigasyon sesi değiştirilir.
- Navigasyon
- Ara
- Müzik
- Duyuru
- Sesli komut
- Sesli aramada zil çalsın
- Sistem sesi
- Güvenlik
- Alarm
- Bildirim
- Araç durumu
- Acil durum
Ses seviyesi önemli etkinlik yönetimini daha az karmaşık hale getirmek için araba ses hizmetinde ikinci bir ses bağlamı öncelik listesi bulunur:
- Ara
- Medya
- Duyuru
- Sesli komut
Bu liste de azalan düzende sunulur. Bu ikinci listenin amacı, daha yaygın seslerin önemli etkinlikler aracılığıyla değiştirilmesine olanak tanımaktır. Kısa süreli sesler gibi nadir sesler yalnızca ses ayarları kullanıcı arayüzü üzerinden yönetilebilir.
Birimin gerçek sürümü, audioVolumeAdjustmentContextsVersion
yapılandırmasıyla ayarlanabilir. Yapılandırma 1
veya 2
olarak ayarlanabilir (varsayılan 2
'dır).
Android 14'te, ses yönetimine daha fazla esneklik sağlamak için OemCarAudioVolumeService
özelliği kullanıma sunuldu:
public interface OemCarAudioVolumeService {
OemCarvolumeChangeInfo getSuggestedGroupForVolumeChange(
OemCarAudioVolumeRequest request, int volumeAdjustment);
}
OEM araç ses seviyesi hizmetinin, volumeAdjustment
ve OemCarAudioVolumeRequest
alan tek bir yöntemi vardır:
class OemCarAudioVolumeRequest {
int audioZoneId;
int callState;
List<AudioAttributes> activePlaybackAttributes;
List<AudioAttributes> duckedAttributes;
List<CarVolumeGroupInfo> volumeGroupState;
}
İsteğin activePlaybackAttributes
bölümünde etkin ses özellikleri bulunur. duckedAttributes
şu anda ses azaltma uygulanan ses özellikleridir. volumeGroupState
, birim grubunun mevcut durumunu gösterir. İstek, ses yığınının mevcut durumunu temsil eder ve hangi ses grubu değiştirilmesi gerektiğini belirlemek için kullanılabilir. Sonuçlar OemCarVolumeChangeInfo
biçiminde döndürülmelidir:
class OemCarVolumeChangeInfo {
boolean change;
CarVolumeGroupInfo volumeGroupChanged;
}
change
Boole değeri, herhangi bir birimin değişip değişmediğini gösterir. true
ise bir değişiklik olduğunu ve birim grubunun güncellenmesi gerektiğini gösterir. volumeGroupChanged
, değiştirilmesi gereken gerçek birim grubudur. Bu grup, API'ye iletilen orijinal volumeAdjustment
parametresine göre değiştirilmelidir. Örneğin, sonuçlar gezinme ses grubu için sesin kapatılması gerektiğini gösteriyorsa boole değeri true
olur ve döndürülen ses grubu, gezinme ses grubu olmalıdır.
OEM araç ses kısma hizmeti
Araba ses hizmeti, ses odaklanma değişikliklerini izleyerek ve hangi ses cihazlarının sesini kısması gerektiği konusunda AudioControl
HAL'ye sinyal göndererek ses kısma işlemini yönetir.
Odak değiştiğinde, bu statik odaklanma kurallarına göre hangisinin odaklanmayı bırakması gerektiğini belirlemek için tüm etkin odak tutucular değerlendirilir:
- Acil durum sesleri, arama sesleri hariç her şeyin sesini kısar
- Güvenlik, acil durum sesleri hariç her şeyi sessize alır.
- Navigasyon, güvenlik ve acil durum sesleri hariç her şeyi kısar
- Güvenlik, acil durum ve navigasyon sesleri dışındaki her şeyi "ördekler"
- Voice, arama zili seslerini kısar
- Müzik ve duyurular her şey tarafından kısılmalıdır.
Bu kurallar kapsamlı değildir ve OEM'ler, seslerin bu yönergelere göre nasıl kısılacağını belirlemekten sorumludur. OEM'ler, mevcut koşullara göre bu önerileri daha etkin bir şekilde kontrol edebilir. Android 14'te OemCarDuckingService
tanıtıldı:
class OemCarAudioDuckingService {
List<AudioAttributes> evaluateAttributesToDuck(
OemCarAudioVolumeRequest request);
}
Bu API, ses odağı değişikliklerinde araç ses hizmetinden çağrılır. OEM car volume service'te kullanıma sunulan OemCarAudioVolumeRequest
özelliğini yeniden kullanır ve hangi özelliklerin gizleneceğiyle ilgili karar vermek için gerekli bilgileri içerir. API'den gelen ses özelliklerinin listesi, mevcut ses durumuyla karşılaştırılır:
Şu anda sesi kısılan ses özelliği:
- Listede, ses kısılmaya devam ediyor
- Listede değil, ses kısma özelliği devre dışı
Ses özelliği şu anda kısılmıyor:
- Listede, eğilmiş
- Listede değil, ses kısma özelliği devre dışı
Ardından araç ses hizmeti, ses özelliklerinin hangi ses çıkışı cihazlarına ait olduğunu belirler ve bunları sırasıyla ses çıkışını azaltan cihazlar listesine veya ses çıkışını azaltmayan cihazlar listesine ekler. Bu, donanım düzeyinde gerekli ses kısma işlemini gerçekleştirmek için nihayetinde AudioControl HAL'ye gönderilir.
Aşağıdaki şekilde, OEM ducking hizmeti kullanılırken odaklanma isteği için ses azaltma kontrolünün basitleştirilmiş bir sıra şeması gösterilmektedir:
Sıra, bir uygulama herkese açık ses yöneticisi API'leri aracılığıyla Ses odağını yönet isteğinde bulunduğunda başlar. Sonuçları belirlemek için istek, araç ses hizmetine yönlendirilir. Ses odağına karar verildiğinde, hangi ses özelliklerinin kısılacağını değerlendirmek için OemCarAudioDuckingService
işlevini çağıran araç ses hizmeti tarafından ses kısma özelliği değerlendirilir. evaluateAttributesToDuck
API'sinden sonuçlar döndürüldükten sonra, ses kısma uygulanacak ses cihazları hesaplanır ve son olarak, ses donanımına ses kısma uygulamak için bilgiler AudioControl
'ye gönderilir.
OEM araç ses sistemi hizmeti referans uygulaması
AAOS, packages/services/Car/tests/OemCarServiceTestApp
içinde OEM araç hizmetinin referans uygulamasını sağlar. Bu uygulama, OemCarService
ile birlikte OemCarAudioFocusService
, OemCarAudioDuckingService
ve OemCarAudioVolumeService
'yi uygular. İkinci durumda ise her hizmet, statik bir davranışı yüklemek için XML dosyası kullanır. Örneğin,
OemCarAudioFocusServiceImp
, etkileşim matrisi içeren oem_focus_config.xml
öğesini yükler. evaluateAudioFocusRequest
çağrıldığında odaklanma isteğini değerlendirmek için matris kullanılır.
Referans test uygulamasında hata ayıklama
OEM araç hizmeti test uygulaması, AOSP kaynak kodunun bir parçasıdır. OEM'ler, ihtiyaçlarına göre değişiklik yapabilir. Hata ayıklama için test uygulamasını etkinleştirmek üzere config_oemCarService
yapılandırmasını kullanın.
<!-- This is the component name for the OEM customization service. OEM can choose to implement
this service to customize car service behavior for different policies. If OEMs choose to
implement it, they have to implement a service extending OemCarService exposed by car-lib,
and implement the required component services.
If the component name is invalid, CarService would not connect to any OEM service.
Component name can not be a third party package. It should be pre-installed -->
<string name="config_oemCarService" translatab>le="false"
com.android.car.oemcarservice.testapp</.OemCa>r
ServiceImpl
/string
OEM araç hizmetinin, OEM hizmeti için araç hizmeti dump
komutunu kullandığını doğrulamak için:
adb shell dumpsys car_service --oem-service
Sonuçlar aşağıdaki çıkışa benzer olabilir:
***CarOemProxyService dump***
mIsFeatureEnabled: true
mIsOemServiceBound: true
mIsOemServiceReady: true
mIsOemServiceConnected: true
mInitComplete: true
OEM_CAR_SERVICE_CONNECTED_TIMEOUT_MS: 5000
OEM_CAR_SERVICE_READY_TIMEOUT_MS: 5000
mComponentName: com.android.car.oemcarservice.testapp/.OemCarServiceImpl
dump
bilgilerinin her grubundaki her boole, özelliğin ve hizmetin durumunu belirler. Örneğin, mIsOemServiceReady
döküm bilgisi, hizmetin kullanıma hazır olup olmadığını belirtir. Burada true
hazır olduğunu, false
ise hazır olmadığını gösterir.