उपयोगकर्ता एचएएल गुण

कई मौजूदा वाहन आर्किटेक्चर में इंफोटेनमेंट सिस्टम के बाहर कई इलेक्ट्रॉनिक नियंत्रण इकाइयां (ईसीयू) होती हैं जो एर्गोनॉमिक्स को नियंत्रित करती हैं, जैसे सीट सेटिंग्स और दर्पण समायोजन। वर्तमान हार्डवेयर और पावर आर्किटेक्चर के आधार पर, कई ईसीयू एंड्रॉइड-आधारित इंफोटेनमेंट सिस्टम के पावर अप होने से पहले ही पावर अप हो जाते हैं। ये ईसीयू वाहन हार्डवेयर एब्स्ट्रैक्शन लेयर (वीएचएएल) के माध्यम से एंड्रॉइड-आधारित इंफोटेनमेंट सिस्टम के साथ इंटरफेस कर सकते हैं।

एंड्रॉइड 11 से शुरू होकर, एंड्रॉइड ऑटोमोटिव ओएस (एएओएस) ने उपयोगकर्ताओं की पहचान करने के लिए बाहरी सहायक उपकरण बनाने, स्विच करने, हटाने और संबद्ध करने के लिए वीएचएएल पर गुणों का एक नया सेट पेश किया। उदाहरण के लिए, ये नए गुण ड्राइवर को अपने एंड्रॉइड उपयोगकर्ता के साथ एक बाहरी सहायक उपकरण, जैसे कि कुंजी फ़ोब, को जोड़ने में सक्षम बनाते हैं। फिर, जब ड्राइवर वाहन के पास आता है, तो ईसीयू जाग जाता है और चाबी का पता लगा लेता है। यह ईसीयू एचएएल को इंगित करता है कि किस एंड्रॉइड उपयोगकर्ता को इंफोटेनमेंट को बूट अप शुरू करना चाहिए, जिससे ड्राइवर को अपने एंड्रॉइड उपयोगकर्ता को लोड करने के लिए इंतजार करने का समय कम हो जाता है।

उपयोगकर्ता HAL सक्षम करें

उपयोगकर्ता HAL गुणों को स्पष्ट रूप से यह सुनिश्चित करके सक्षम किया जाना चाहिए कि सिस्टम प्रॉपर्टी android.car.user_hal_enabled true पर सेट है। (यह car.mk फ़ाइल में भी किया जा सकता है, ताकि इसे मैन्युअल रूप से सेट करने की आवश्यकता न हो।) UserHalService को डंप करके जांचें कि user_hal_enabled=true सक्षम है:

$ adb shell dumpsys car_service --hal UserHalService|grep enabled
user_hal_enabled=true

आप adb shell getprop android.car.user_hal_enabled या adb logcat CarServiceHelper *:s उपयोग करके भी user_hal_enabled जांच कर सकते हैं। यदि संपत्ति अक्षम है, तो system_server प्रारंभ होने पर निम्न जैसा एक संदेश प्रदर्शित होता है:

I CarServiceHelper: Not using User HAL

user_hal_enabled मैन्युअल रूप से सक्षम करने के लिए, android.car.user_hal_enabled सिस्टम प्रॉपर्टी सेट करें और system_server पुनरारंभ करें:

$ adb shell setprop android.car.user_hal_enabled true
$ adb shell stop && adb shell start

logcat आउटपुट इस प्रकार दिखाई देता है:

I CarServiceHelper: User HAL enabled with timeout of 5000ms
D CarServiceHelper: Got result from HAL: OK
I CarServiceHelper: User HAL returned DEFAULT behavior

उपयोगकर्ता एचएएल गुण

उपयोगकर्ता जीवनचक्र गुण

निम्नलिखित गुण उपयोगकर्ता जीवनचक्र स्थितियों के लिए एचएएल जानकारी प्रदान करते हैं, जो एंड्रॉइड सिस्टम और बाहरी ईसीयू के बीच उपयोगकर्ता जीवनचक्र सिंक्रनाइज़ेशन को सक्षम बनाता है। ये गुण एक अनुरोध और प्रतिक्रिया प्रोटोकॉल का उपयोग करते हैं, जिसमें एंड्रॉइड सिस्टम एक संपत्ति मूल्य निर्धारित करके अनुरोध करता है और एचएएल एक संपत्ति परिवर्तन ईवेंट जारी करके प्रतिक्रिया देता है।

नोट: जब उपयोगकर्ता एचएएल समर्थित है, तो निम्नलिखित सभी गुणों को लागू किया जाना चाहिए।

एचएएल संपत्ति विवरण
INITIAL_USER_INFO
(पढ़ना लिखना)
यह प्रॉपर्टी एंड्रॉइड सिस्टम द्वारा यह निर्धारित करने के लिए कॉल की जाती है कि डिवाइस के बूट होने या सस्पेंड-टू-रैम (एसटीआर) से फिर से शुरू होने पर सिस्टम किस एंड्रॉइड उपयोगकर्ता को शुरू करता है। बुलाए जाने पर, एचएएल को इनमें से किसी एक विकल्प के साथ जवाब देना होगा:
  • एंड्रॉइड द्वारा निर्धारित डिफ़ॉल्ट व्यवहार (अंतिम उपयोग किए गए उपयोगकर्ता पर स्विच करना या यदि यह पहला बूट है तो एक नया उपयोगकर्ता बनाना)।
  • किसी मौजूदा उपयोगकर्ता पर स्विच करें.
  • एक नया उपयोगकर्ता बनाएं (नाम, झंडे, सिस्टम लोकेल आदि के वैकल्पिक गुणों के साथ) और उस नए उपयोगकर्ता पर स्विच करें।

नोट: यदि एचएएल प्रतिक्रिया नहीं देता है, तो डिफ़ॉल्ट व्यवहार एक टाइमआउट अवधि (डिफ़ॉल्ट रूप से पांच सेकंड) के बाद निष्पादित होता है, जो बूट में देरी करता है। यदि एचएएल उत्तर देता है, लेकिन एंड्रॉइड सिस्टम कार्रवाई निष्पादित करने में विफल रहता है (उदाहरण के लिए, यदि उपयोगकर्ताओं की अधिकतम संख्या तक पहुंच गई है), तो डिफ़ॉल्ट व्यवहार का उपयोग किया जाता है।

उदाहरण: डिफ़ॉल्ट रूप से, एंड्रॉइड सिस्टम बूट पर अंतिम सक्रिय उपयोगकर्ता में शुरू होता है। यदि किसी भिन्न उपयोगकर्ता के लिए एक कुंजी फ़ॉब का पता लगाया जाता है, तो ईसीयू एचएएल संपत्ति को ओवरराइड करता है और, स्टार्ट अप के दौरान, एंड्रॉइड सिस्टम उस निर्दिष्ट उपयोगकर्ता में शुरू करने के लिए स्विच करता है।

SWITCH_USER
(पढ़ना लिखना)
सक्रिय अग्रभूमि Android उपयोगकर्ता को स्विच करते समय इस प्रॉपर्टी को कॉल किया जाता है। उपयोगकर्ता स्विच का अनुरोध करने के लिए संपत्ति को एंड्रॉइड सिस्टम या एचएएल द्वारा कॉल किया जा सकता है। तीन कार्यप्रवाह हैं:
  • आधुनिक। स्विच CarUserManager से प्रारंभ हुआ।
  • परंपरा। ActivityManager से स्विच शुरू हुआ।
  • वाहन। उपयोगकर्ता स्विच का अनुरोध करने के लिए एचएएल द्वारा कॉल किया गया।

यह सुनिश्चित करने के लिए कि एंड्रॉइड सिस्टम और बाहरी ईसीयू सिंक्रनाइज़ हैं, आधुनिक वर्कफ़्लो दो-चरण प्रतिबद्ध दृष्टिकोण का उपयोग करता है। जब Android स्विच आरंभ करता है:

  1. यह निर्धारित करने के लिए एचएएल की जाँच करें कि क्या उपयोगकर्ता को स्विच किया जा सकता है।

    एचएएल SUCCESS या FAILURE के साथ प्रतिक्रिया करता है, ताकि एंड्रॉइड को पता चले कि आगे बढ़ना है या नहीं।

  2. Android उपयोगकर्ता स्विच पूरा करें.

    स्विच की सफलता या विफलता को इंगित करने के लिए एंड्रॉइड HAL को ANDROID_POST_SWITCH प्रतिक्रिया भेजता है।

एचएएल को ईसीयू को सिंक्रनाइज़ करने या अन्य एचएएल संपत्तियों को अपडेट करने के लिए अपनी स्थिति को अपडेट करने के लिए ANDROID_POST_SWITCH प्रतिक्रिया के बाद तक इंतजार करना चाहिए।

उदाहरण: गति के दौरान, एक ड्राइवर इन्फोटेनमेंट यूआई में एंड्रॉइड उपयोगकर्ताओं को स्विच करने का प्रयास करता है। हालाँकि, क्योंकि कार की सीट सेटिंग्स एंड्रॉइड उपयोगकर्ता से जुड़ी होती हैं, इसलिए उपयोगकर्ता स्विच के दौरान सीट हिल जाती है। इस प्रकार, सीटों को नियंत्रित करने वाला ईसीयू स्विच की पुष्टि नहीं करता है, एचएएल विफलता के साथ प्रतिक्रिया करता है, और एंड्रॉइड उपयोगकर्ता स्विच नहीं करता है।

लीगेसी वर्कफ़्लो उपयोगकर्ता द्वारा स्विच किए जाने के बाद भेजा गया एक-तरफ़ा कॉल है (इसलिए एचएएल स्विच को ब्लॉक नहीं कर सकता है)। इसे केवल बूट पर (प्रारंभिक उपयोगकर्ता स्विच के बाद) या उन ऐप्स के लिए कॉल किया जाता है जो ActivityManager.switchUser() के बजाय CarUserManager.switchUser() को कॉल करते हैं। संदर्भ Settings और SystemUI ऐप्स पहले से ही बाद वाले का उपयोग करते हैं, लेकिन यदि कोई OEM उपयोगकर्ताओं को स्विच करने के लिए अपने स्वयं के सेटिंग्स ऐप्स प्रदान करता है, तो OEM को उपयोग बदलना चाहिए।

उदाहरण: यदि कोई ऐप उपयोगकर्ताओं को स्विच करने के लिए ActivityManager.switchUser() का उपयोग करता है, तो एचएएल को एक तरफा कॉल भेजा जाता है ताकि यह सूचित किया जा सके कि उपयोगकर्ता स्विच हो गया है।

वाहन वर्कफ़्लो HAL से उत्पन्न होता है, Android सिस्टम से नहीं:

  1. एचएएल उपयोगकर्ता स्विच का अनुरोध करता है।
  2. सिस्टम एंड्रॉइड उपयोगकर्ता स्विच पूरा करता है।
  3. स्विच की सफलता या विफलता को इंगित करने के लिए एंड्रॉइड HAL को ANDROID_POST_SWITCH प्रतिक्रिया भेजता है।

उदाहरण: बॉब ने कार खोलने के लिए ऐलिस की कुंजी फ़ॉब का उपयोग किया और HAL ने ऐलिस की उपयोगकर्ता आईडी के साथ INITIAL_USER_INFO अनुरोध का उत्तर दिया। इसके बाद, एक बायोमेट्रिक सेंसर ईसीयू ने ड्राइवर को बॉब के रूप में पहचाना, इसलिए उपयोगकर्ता एचएएल ने उपयोगकर्ताओं को स्विच करने के लिए एक SWITCH_USER अनुरोध भेजा।

CREATE_USER
(पढ़ना लिखना)
जब कोई नया Android उपयोगकर्ता बनाया जाता है ( CarUserManager.createUser() API का उपयोग करके) तो इस प्रॉपर्टी को एंड्रॉइड सिस्टम द्वारा कॉल किया जाता है।

एचएएल SUCCESS या FAILURE के साथ प्रतिक्रिया करता है। यदि एचएएल विफलता का जवाब देता है, तो एंड्रॉइड सिस्टम उपयोगकर्ता को हटा देता है।

उदाहरण: एक ड्राइवर एक नया एंड्रॉइड उपयोगकर्ता बनाने के लिए इंफोटेनमेंट यूआई आइकन पर टैप करता है। यह एचएएल और बाकी वाहन उपप्रणालियों को एक अनुरोध भेजता है। ईसीयू को नव निर्मित उपयोगकर्ता के बारे में सूचित किया जाता है। अन्य सबसिस्टम और ईसीयू फिर अपनी आंतरिक उपयोगकर्ता आईडी को एंड्रॉइड उपयोगकर्ता आईडी के साथ जोड़ते हैं।

REMOVE_USER
(केवल लिखें)
एंड्रॉइड उपयोगकर्ता को हटाए जाने के बाद एंड्रॉइड सिस्टम इस प्रॉपर्टी को कॉल करता है ( CarUserManager.removeUser() विधि के साथ)।

यह एकतरफा कॉल है - एचएएल से कोई प्रतिक्रिया अपेक्षित नहीं है।

उदाहरण: एक ड्राइवर इंफोटेनमेंट यूआई में मौजूदा एंड्रॉइड उपयोगकर्ता को हटाने के लिए टैप करता है। एचएएल को सूचित किया जाता है और अन्य वाहन उपप्रणालियों और ईसीयू को उपयोगकर्ता को हटाने के बारे में सूचित किया जाता है ताकि वे अपनी आंतरिक उपयोगकर्ता आईडी को हटा सकें।

अतिरिक्त गुण

निम्नलिखित अतिरिक्त गुण हैं, जो उपयोगकर्ता जीवनचक्र स्थितियों से असंबंधित हैं। प्रत्येक को उपयोगकर्ता HAL का समर्थन किए बिना कार्यान्वित किया जा सकता है।

एचएएल संपत्ति विवरण
USER_IDENTIFICATION_ASSOCIATION
(पढ़ना लिखना)
किसी भी एंड्रॉइड उपयोगकर्ता को एक पहचान तंत्र, जैसे कुंजी फ़ॉब या फ़ोन, के साथ जोड़ने के लिए इस संपत्ति का उपयोग करें। एसोसिएशन get या set के लिए इसी संपत्ति का उपयोग करें।

उदाहरण: एक ड्राइवर वाहन को खोलने के लिए उपयोग की जाने वाली कुंजी फ़ॉब ( KEY_123 ) को वर्तमान सक्रिय एंड्रॉइड उपयोगकर्ता ( USER_11 ) से जोड़ने के लिए एक इंफोटेनमेंट यूआई आइकन पर टैप करता है।

सहायक पुस्तकालय

अनुरोध और प्रतिक्रिया संदेशों में उपयोग की जाने वाली सभी ऑब्जेक्ट्स (जैसे कि UserInfo , InitialUserInfoRequest , InitialUSerInfoResponse , और इसी तरह) में C++ struct का उपयोग करके उच्च स्तरीय प्रतिनिधित्व होता है, लेकिन निष्कासन को मानक VehiclePropValue ऑब्जेक्ट्स में समतल किया जाना चाहिए (नीचे दिए गए उदाहरण देखें)। विकास में आसानी के लिए, उपयोगकर्ता एचएएल structs स्वचालित रूप से VehiclePropValue (और इसके विपरीत) में परिवर्तित करने के लिए एओएसपी में एक सी++ हेल्पर लाइब्रेरी प्रदान की जाती है।

उदाहरण

प्रारंभिक_USER_INFO

उदाहरण का अनुरोध करें (पहले बूट पर)

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
}

प्रतिक्रिया उदाहरण (व्यवस्थापक उपयोगकर्ता बनाएँ)

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
}

उपयोगकर्ता बदलें

वर्गों और गुणों का वास्तविक नाम थोड़ा भिन्न है लेकिन समग्र वर्कफ़्लो समान है, जैसा कि नीचे दिखाया गया है:

कार्यप्रवाह

चित्र 1. उपयोगकर्ता एचएएल गुण वर्कफ़्लो

आधुनिक वर्कफ़्लो अनुरोध उदाहरण

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

आधुनिक वर्कफ़्लो प्रतिक्रिया उदाहरण

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
}

आधुनिक वर्कफ़्लो पोस्ट-स्विच प्रतिक्रिया उदाहरण

यह प्रतिक्रिया आम तौर पर तब होती है जब कोई एंड्रॉइड स्विच सफल होता है:

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

आधुनिक वर्कफ़्लो पोस्ट-स्विच प्रतिक्रिया

यह प्रतिक्रिया आम तौर पर तब होती है जब एंड्रॉइड स्विच विफल हो जाता है:

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

लीगेसी वर्कफ़्लो अनुरोध उदाहरण

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

वाहन वर्कफ़्लो अनुरोध उदाहरण

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
}

लीगेसी वर्कफ़्लो पोस्ट-स्विच प्रतिक्रिया

यह प्रतिक्रिया आम तौर पर तब होती है जब कोई एंड्रॉइड स्विच सफल होता है:

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

उपयोगकर्ता बनाइये

उदाहरण का अनुरोध करें

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

प्रतिक्रिया उदाहरण

VehiclePropValue { // flattened from CreateUserResponse
prop: 299896585 // CREATE_USER
prop.values.int32Values:
 [0] = 42        // Request ID (must match request)
 [1] = 3         // CreateUserStatus::SUCCESS
}

REMOVE_USER

उदाहरण का अनुरोध करें

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

USER_IDENTIFICATION_ASSOCIATION

उदाहरण सेट करें (उपयोगकर्ता 10 से संबद्ध कुंजी फ़ॉब)

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
}