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

संग्रह की मदद से व्यवस्थित रहें अपनी प्राथमिकताओं के आधार पर, कॉन्टेंट को सेव करें और कैटगरी में बांटें.

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

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

उपयोगकर्ता एचएएल को सक्षम करें

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

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

आप user_hal_enabled का उपयोग करके भी देख सकते हैं adb shell getprop android.car.user_hal_enabled या adb logcat CarServiceHelper *:s । यदि गुण अक्षम है, तो 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
(पढ़ना लिखना)
एंड्रॉइड सिस्टम द्वारा इस संपत्ति को यह निर्धारित करने के लिए कहा जाता है कि डिवाइस के बूट होने या सस्पेंड-टू-रैम (एसटीआर) से फिर से शुरू होने पर कौन सा एंड्रॉइड उपयोगकर्ता सिस्टम शुरू करेगा। जब कॉल किया जाता है, तो एचएएल को इनमें से किसी एक विकल्प के साथ जवाब देना चाहिए:
  • एंड्रॉइड द्वारा निर्धारित डिफ़ॉल्ट व्यवहार (अंतिम उपयोग किए गए उपयोगकर्ता पर स्विच करना या नया उपयोगकर्ता बनाना यदि यह पहला बूट है)।
  • किसी मौजूदा उपयोगकर्ता पर स्विच करें।
  • एक नया उपयोगकर्ता बनाएं (नाम, झंडे, सिस्टम लोकेल, और इसी तरह के वैकल्पिक गुणों के साथ) और उस नए उपयोगकर्ता पर स्विच करें।

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

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

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

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

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

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

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

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

HAL को ANDROID_POST_SWITCH प्रतिक्रिया के बाद ECUs को सिंक्रनाइज़ करने या अन्य HAL गुणों को अपडेट करने के लिए अपनी स्थिति को अपडेट करने के लिए प्रतीक्षा करनी चाहिए।

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

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

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

वाहन कार्यप्रवाह एचएएल से उत्पन्न होता है, न कि एंड्रॉइड सिस्टम से:

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

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

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

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

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

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

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

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

अतिरिक्त गुण

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

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

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

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

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

उदाहरण

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

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

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

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

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

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

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
}

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

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

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
}