Mevcut araç mimarilerinin çoğu, birden fazla elektronik kontrol birimi içerir. (koltuk gibi) ergonomiyi kontrol eden bilgi-eğlence sisteminin dışında (ECU'lar) ve yansıtma ayarlamaları yapabilirsiniz. Mevcut donanıma ve güce göre birçok ECU, Android tabanlı bilgi-eğlence sisteminden önce güç sağlıyor. güçtür. Bu ECU'lar Android tabanlı bilgi-eğlence ile arayüz oluşturabilir ve Araç donanımı soyutlama katmanı (VHAL).
Android Automotive OS (AAOS), Android 11'den itibaren yeni bir dizi oluşturma, değiştirme, kaldırma ve ilişkilendirme için VHAL'deki özellikler harici aksesuarlar kullandığınızdan emin olun. Örneğin, bu yeni mülkler uzaktan kumanda gibi harici bir aksesuarı Android kullanıcısına eşlemek için sürücüye. Daha sonra, sürücü araca yaklaştığında bir ECU uyanır ve uzaktan kumandalı anahtarı tespit eder. Bu ECU, HAL'ye bilgi-eğlence özelliğinin hangi Android kullanıcısına sunulması gerektiğini belirtir Sürücünün Android cihazını bekleme süresi kısaltan önyükleme başlatma Yüklenecek kullanıcı.
Kullanıcı HAL'sini etkinleştirme
Kullanıcı HAL özellikleri, sistem tarafından kontrol edilerek açıkça etkinleştirilmelidir.
android.car.user_hal_enabled
mülkü true
olarak ayarlandı.
(Bu işlem car.mk
dosyasında da yapılabilir, böylece dosyanın
manuel olarak ayarlanır.) user_hal_enabled=true
hizmetinin şunun tarafından etkinleştirilip etkinleştirilmediğini kontrol edin:
UserHalService
dökümü alınıyor:
$ adb shell dumpsys car_service --hal UserHalService|grep enabled user_hal_enabled=true
user_hal_enabled
adresini, adb shell
getprop android.car.user_hal_enabled
veya adb logcat
CarServiceHelper *:s
kullanarak da kontrol edebilirsiniz. Mülk devre dışı bırakılırsa şuna benzer bir mesaj:
system_server
başlatıldığında aşağıdakiler gösterilir:
I CarServiceHelper: Not using User HAL
user_hal_enabled
özelliğini manuel olarak etkinleştirmek için
android.car.user_hal_enabled
sistem özelliğini ve yeniden başlatın
system_server
:
$ adb shell setprop android.car.user_hal_enabled true $ adb shell stop && adb shell start
logcat
çıkışı şu şekilde görünür:
I CarServiceHelper: User HAL enabled with timeout of 5000ms D CarServiceHelper: Got result from HAL: OK I CarServiceHelper: User HAL returned DEFAULT behavior
Kullanıcı HAL mülkleri
Kullanıcı yaşam döngüsü özellikleri
Aşağıdaki özellikler, kullanıcı yaşam döngüsü için HAL bilgilerini sağlar Android sistemi arasında kullanıcı yaşam döngüsü senkronizasyonunu sağlayan durumlar ve harici bir ECU. Bu mülkler, Android sisteminin bir özellik değeri ayarlayarak ve HAL, özellik değişikliği etkinliği göndererek yanıt verir.
Not: Kullanıcı HAL'si desteklendiğinde aşağıdakilerin tümü özellikleri uygulanmalıdır.
HAL mülkü | Açıklama |
---|---|
INITIAL_USER_INFO (OKUMA/YAZMA) |
Android sistemi bu özelliği çağırarak hangi Android'in
Kullanıcı, cihaz başlatıldığında veya devam ettirildiğinde sistem başlatılacak
RAM'e askıya alma (STR). Çağrı yapıldığında, HAL şunlardan biriyle yanıt vermelidir:
şu seçenekleri kullanabilirsiniz:
Not: HAL yanıt vermezse varsayılan davranış yürütülmesini geciktiren zaman aşımı süresinden (varsayılan olarak beş saniye) sonra yürütülür. HAL yanıt verirse ancak Android sistemi işlemi yürütmezse (örneğin, Maksimum Kullanıcı sayısına ulaşıldıysa) varsayılan davranış kullanılır. Örnek: Android sistemi varsayılan olarak son Açılışta etkin kullanıcı. Farklı bir kullanıcının uzaktan kumandalı anahtarı algılanırsa ECU HAL özelliğini geçersiz kılar ve başlatma sırasında Android sistemi, altında bulunabilir. |
SWITCH_USER (OKUMA/YAZMA) |
Bu özellik, etkin ön plan Android Kullanıcısı değiştirilirken çağrılır.
Tesis, Android sistemi veya HAL tarafından çağrılabilir.
Kullanıcı değiştirme isteğinde bulunun. Bu üç iş akışı şunlardır:
Modern iş akışı, müşterilerin en hızlı şekilde Android sistemi ve harici ECU senkronize edildi. Android, geçişi başlattığında:
HAL, Örnek: Bir sürücü hareket halindeyken bilgi-eğlence kullanıcı arayüzünde Android kullanıcılarının geçişini yapın. Ancak araba koltuğu kullanıcı tarafından bağlı olduğunu fark ederseniz Kullanıcı değiştirme. Yani koltukları kontrol eden ECU, geçişi onaylamaz. HAL hata ile yanıt veriyor ve Android Kullanıcısı değiştirilmiyor.
Eski iş akışı, kullanıcı değiştirildikten sonra gönderilen tek yönlü bir aramadır
(böylece HAL, anahtarı engelleyemez). Bu işlev yalnızca açılışta çağrılır (
ilk kullanıcı geçişi) veya
-
Örnek: Bir uygulama
Araç iş akışının kaynağı Android sistemi değil, HAL olacaktır:
Örnek: Bora, arabayı açmak için Aylin'in uzaktan kumandasını kullandı
HAL, |
CREATE_USER (OKUMA/YAZMA) |
Yeni bir Android Kullanıcısı olduğunda Android sistemi tarafından bu özellik çağrılır:
(CarUserManager.createUser() API kullanılarak) oluşturulur.
HAL, Örnek: Sürücü, bilgi-eğlence sistemi kullanıcı arayüzü simgesine dokunarak yeni bir Android Kullanıcısı oluşturun. Bu işlem, HAL'ye bir istek gönderir ve izin veriliyor. ECU'lar yeni oluşturulan kullanıcı hakkında bilgilendirilir. Diğer daha sonra dahili kullanıcı kimliklerini Android ile ilişkilendirir. Kullanıcı kimliği. |
REMOVE_USER (yalnızca YAZMA) |
Android sistemi, bir Android Kullanıcısı şu işlemi yaptıktan sonra bu özelliği çağırır:
kaldırılır (CarUserManager.removeUser() yöntemiyle).
Bu tek yönlü bir aramadır ve HAL'den herhangi bir yanıt beklenmez. Örnek: Sürücü, mevcut bir öğeyi kaldırmak için dokunur Bilgi-eğlence sistemi kullanıcı arayüzündeki Android Kullanıcısı. HAL, bilgilendirilmesi ve diğer Kullanıcı kaldırma işlemiyle ilgili olarak bilgilendirildiği için araç alt sistemleri dahili kullanıcı kimliğini kaldırabilir. |
Ek özellikler
Aşağıda, kullanıcı yaşam döngüsü durumlarıyla ilgili olmayan ek özellikler verilmiştir. Bunların her biri, Kullanıcı HAL'si desteklenmeden uygulanabilir.
HAL Mülkü | Açıklama |
---|---|
USER_IDENTIFICATION_ASSOCIATION (OKUMA/YAZMA) |
Herhangi bir Android Kullanıcısını bir kimlikle ilişkilendirmek için bu özelliği kullanın
bir mekanizma (ör. uzaktan kumandalı anahtar veya telefon) Aynı özelliği kullanarak
get veya set ilişkilendirmeleri.
Örnek: Sürücü, ilişkilendirmek üzere bilgi-eğlence sistemi kullanıcı arayüzü simgesine dokunuyor
aracı ( |
Yardımcı kitaplıklar
İstek ve yanıt mesajlarında kullanılan tüm nesneler (ör.
UserInfo
, InitialUserInfoRequest
,
InitialUSerInfoResponse
vb.) üst düzey temsile sahiptir
C++ struct
kullanılıyor, ancak kaldırma işlemi
standart VehiclePropValue
nesneleri (aşağıdaki örneklere bakın). Kolaylık için
projenin
C++
Kullanıcı HAL'sini otomatik olarak dönüştürmek için AOSP'de yardımcı kitaplık sağlanmıştır
structs
öğesini bir VehiclePropValue
olarak ayarlayın (veya tam tersi).
Örnekler
INITIAL_USER_INFO
İstek örneği (ilk başlatmada)
VehiclePropValue { // flattened from InitialUserInfoRequest prop: 299896583 // INITIAL_USER_INFO prop.values.int32Values: [0] = 1 // Request ID [1] = 1 // InitialUserInfoRequestType.FIRST_BOOT [2] = 0 // user id of current user [3] = 1 // flags of current user (SYSTEM) [4] = 1 // number of existing users [5] = 0 // existingUser[0].id [6] = 1 // existingUser[0].flags }
Yanıt örneği (Yönetici kullanıcı oluşturma)
VehiclePropValue { // flattened from InitialUserInfoResponse prop: 299896583 // INITIAL_USER_INFO prop.values.int32Values: [0] = 1 // Request ID (must match request) [1] = 2 // InitialUserInfoResponseAction.CREATE [2] = -10000 // user id (not used on CREATE) [3] = 8 // user flags (ADMIN) prop.values.stringValue: "en-US||Car Owner" // User locale and User name }
KULLANICI DEĞİŞTİR
Sınıfların ve özelliklerin gerçek adları biraz farklılık gösterse de genel iş akışı aşağıda gösterildiği gibi aynıdır:
Şekil 1. Kullanıcı HAL Mülkleri İş Akışı
Modern iş akışı isteği örneği
VehiclePropValue { // flattened from SwitchUserRequest prop: 299896585 // SWITCH_USER prop.values.int32Values: [0] = 42 // Request ID [1] = 2 // SwitchUserMessageType::ANDROID_SWITCH ("modern") [2,3] = 11,0 // target user id (11) and flags (none in this case) [4,5] = 10,8 // current user id (10) and flags (ADMIN) [6] = 3 // number of existing users (0, 10, 11) [7,8] = 0,1 // existingUser[0] (id=0, flags=SYSTEM) [9,10] = 10,8 // existingUser[1] (id=10, flags=ADMIN) [11,12] = 11,0 // existingUser[2] (id=11, flags=NONE) }
Modern iş akışı yanıtı örneği
VehiclePropValue { // flattened from SwitchUserResponse prop: 299896584 // SWITCH_USER prop.values.int32Values: [0] = 42 // Request ID (must match request) [1] = 3 // SwitchUserMessageType::VEHICLE_RESPONSE [2] = 1 // SwitchUserStatus::SUCCESS }
Modern iş akışı geçiş sonrası yanıt örneği
Bu yanıt genellikle bir Android geçişi başarılı olduğunda gerçekleşir:
VehiclePropValue { // flattened from SwitchUserRequest prop: 299896584 // SWITCH_USER prop.values.int32Values: [0] = 42 // Request ID (must match "pre"-SWITCH_USER request ) [1] = 5 // SwitchUserMessageType::ANDROID_POST_SWITCH [2,3] = 11,0 // target user id (11) and flags (none in this case) [4,5] = 11,0 // current user id (11) and flags (none in this case) [6] = 3 // number of existing users (0, 10, 11) [7,8] = 0,1 // existingUser[0] (id=0, flags=SYSTEM) [9,10] = 10,8 // existingUser[1] (id=10, flags=ADMIN) [11,12] = 11,0 // existingUser[2] (id=11, flags=NONE) }
Modern iş akışı geçiş sonrası yanıtı
Bu yanıt genellikle bir Android geçişi başarısız olduğunda ortaya çıkar:
VehiclePropValue { // flattened from SwitchUserRequest prop: 299896584 // SWITCH_USER prop.values.int32Values: [0] = 42 // Request ID (must match "pre"-SWITCH_USER request ) [1] = 5 // SwitchUserMessageType::ANDROID_POST_SWITCH [2,3] = 11,0 // target user id (11) and flags (none in this case) [4,5] = 10,8 // current user id (10) and flags (ADMIN) [6] = 3 // number of existing users (0, 10, 11) [7,8] = 0,1 // existingUser[0] (id=0, flags=SYSTEM) [9,10] = 10,8 // existingUser[1] (id=10, flags=ADMIN) [11,12] = 11,0 // existingUser[2] (id=11, flags=NONE) }
Eski iş akışı isteği örneği
VehiclePropValue { // flattened from SwitchUserRequest prop: 299896584 // SWITCH_USER prop.values.int32Values: [0] = 2 // Request ID [1] = 1 // SwitchUserMessageType::LEGACY_ANDROID_SWITCH [2,3] = 10,8 // target user id (10) and flags (ADMIN) [4,5] = 0,1 // current user id (0) and flags (SYSTEM) [6] = 3 // number of existing users (0, 10, 11) [7,8] = 0,1 // existingUser[0] (id=0, flags=SYSTEM) [9,10] = 10,8 // existingUser[1] (id=10, flags=ADMIN) [11,12] = 11,0 // existingUser[2] (id=11, flags=NONE) }
Araç iş akışı isteği örneği
VehiclePropValue { // flattened from SwitchUserRequest prop: 299896584 // SWITCH_USER prop.values.int32Values: [0] = -108 // Request ID (must be negative) [1] = 4 // SwitchUserMessageType::VEHICLE_REQUEST [2] = 11 // target user id }
Eski iş akışı geçiş sonrası yanıtı
Bu yanıt genellikle bir Android geçişi başarılı olduğunda gerçekleşir:
VehiclePropValue { // flattened from SwitchUserRequest prop: 299896584 // SWITCH_USER prop.values.int32Values: [0] = -108 // Request ID (must match from vehicle request ) [1] = 5 // SwitchUserMessageType::ANDROID_POST_SWITCH [2,3] = 11,0 // target user id (11) and flags (none in this case) [4,5] = 11,0 // current user id (11) and flags (none in this case) [6] = 3 // number of existing users (0, 10, 11) [7,8] = 0,1 // existingUser[0] (id=0, flags=SYSTEM) [9,10] = 10,8 // existingUser[1] (id=10, flags=ADMIN) [11,12] = 11,0 // existingUser[2] (id=11, flags=NONE) }
CREATE_KULLANICI
Örnek istek
VehiclePropValue { // flattened from CreateUserRequest prop: 299896585 // CREATE_USER prop.values.int32Values: [0] = 42 // Request ID [1,2] = 11,6 // Android id of the created user and flags (id=11, flags=GUEST, EPHEMERAL) [3,4] = 10,0 // current user id (10) and flags (none in this case) [5] = 3 // number of existing users (0, 10, 11) [6,7] = 0,1 // existingUser[0] (id=0, flags=SYSTEM) [8,9] = 10,8 // existingUser[1] (id=10, flags=ADMIN) [10,11] = 11,6 // newUser[2] (id=11, flags=GUEST,EPHEMERAL) }
Yanıt örneği
VehiclePropValue { // flattened from CreateUserResponse prop: 299896585 // CREATE_USER prop.values.int32Values: [0] = 42 // Request ID (must match request) [1] = 3 // CreateUserStatus::SUCCESS }
KULLANICIYI_KALDIR
Örnek istek
VehiclePropValue { // flattened from RemoveUserRequest prop: 299896586 // REMOVE_USER prop.values.int32Values: [0] = 42 // Request ID [1,2] = 11,0 // Android id of the removed user and flags (none in this case) [3,4] = 10,0 // current user id (10) and flags (none in this case) [5] = 2 // number of existing users (0, 10) [6,7] = 0,1 // existingUser[0] (id=0, flags=SYSTEM) [8,9] = 10,8 // existingUser[1] (id=10, flags=ADMIN) }
KULLANICI_KİMLİĞİ
Örnek ayarlayın (Kullanıcı 10 ile ilişkili tuş birimi)
VehiclePropValue { // flattened from UserIdentificationSetRequest prop: 299896587 // USER_IDENTIFICATION_ASSOCIATION prop.values.int32Values: [0] = 43 // Request ID [1,2] = 10,0 // Android id (10) and flags (none in this case) [3] = 1 // number of associations being set [4] = 1 // 1st type: UserIdentificationAssociationType::KEY_FOB [5] = 1 // 1st value: UserIdentificationAssociationSetValue::ASSOCIATE_CURRENT_USER }