Kullanıcı HAL mülkleri

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 tespit etmek için harici aksesuarlar da kullanabilirsiniz. Ö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 kullanılması 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ü yapılı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:
  • Android tarafından ayarlanan varsayılan davranış (son kullanılan Kullanıcı veya yeni bir Kullanıcı (bu ilk başlatmaysa) oluşturma).
  • Mevcut bir kullanıcıya geçiş yapın.
  • Yeni bir Kullanıcı oluşturun (isteğe bağlı ad, bayraklar, sistem özellikleri ile yerel ayar vb.) ve bu yeni Kullanıcıya geçiş yapabilirsiniz.

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. CarUserManager uygulamasından geçiş başlatıldı.
  • Eski. ActivityManager uygulamasından geçiş başlatıldı.
  • Araç. Kullanıcı değiştirme isteğinde bulunmak için HAL tarafından aranır.

Modern iş akışı, müşterilerin en hızlı şekilde Android sistemi ve harici ECU senkronize edildi. Android, geçişi başlattığında:

  1. Kullanıcının değiştirilip değiştirilemeyeceğini belirlemek için HAL'yi kontrol edin.

    HAL, SUCCESS veya FAILURE ile yanıt verdiği için Android devam edip etmeyeceğini bilir.

  2. Android kullanıcısı geçişini tamamlayın.

    Android, ANDROID_POST_SWITCH HAL, anahtarın başarılı veya başarısız olduğunu gösterir.

HAL, ANDROID_POST_SWITCH sonrasına kadar beklemelidir ECU'ları senkronize etmek veya diğer HAL'leri güncellemek için durumunu güncellemek üzere yanıt özellikler.

Ö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 -ActivityManager.switchUser() CarUserManager.switchUser(). Referans Settings ve SystemUI uygulama zaten şu ayarı kullanıyor: Ancak OEM, Kullanıcı'yı değiştirmek için kendi Ayarlar uygulamasını sağlarsa OEM'ler kullanımı değiştirmelidir.

Örnek: Bir uygulama ActivityManager.switchUser() - sonra bir Kullanıcı hesabını bilgilendirmek için HAL'ye tek yönlü bir arama olduğunu varsayalım.

Araç iş akışının kaynağı Android sistemi değil, HAL olacaktır:

  1. HAL, bir Kullanıcı değiştirme isteğinde bulunur.
  2. Sistem, Android Kullanıcısı geçişini tamamlar.
  3. Android, HAL'ye şunu bildirmek için bir ANDROID_POST_SWITCH yanıtı gönderir: başarılı veya başarısız olması anlamına gelir.

Örnek: Bora, arabayı açmak için Aylin'in uzaktan kumandasını kullandı HAL, INITIAL_USER_INFO talebine şu şekilde yanıt verdi: Aylin'in kullanıcı kimliği. Daha sonra bir biyometrik sensör ECU'su sürücüyü İbrahim olarak tanımladı. Kullanıcı HAL'si, kullanıcı değiştirmek için bir SWITCH_USER isteği gönderdi.

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, SUCCESS veya FAILURE ile yanıt verir. Öğe HAL yanıt vermiyorsa Android sistemi kullanıcıyı kaldırır.

Ö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ı (KEY_123) mevcut etkin Android kullanıcısına açmak için kullanılan uzaktan kumandalı anahtar (USER_11).

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 olarak VehiclePropValue ekleyin (veya 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:

İş akışı

Ş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
}