उपयोगकर्ता की एचएएल प्रॉपर्टी

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

Android 11 की शुरुआत से, Android Automotive OS (AAOS) ने बनाने, स्विच करने, हटाने, और जोड़ने के लिए VHAL पर प्रॉपर्टी इस्तेमाल करने वालों की पहचान करने के लिए, बाहरी ऐक्सेसरी का इस्तेमाल किया जा सके. उदाहरण के लिए, ये नई प्रॉपर्टी Android उपयोगकर्ता के साथ किसी बाहरी ऐक्सेसरी, जैसे कि की फ़ोब को जोड़ने के लिए ड्राइवर. इसके बाद, जब ड्राइवर गाड़ी के पास आता है, तो ईसीयू जागता है और की फ़ोब को पहचान लेता है. यह ईसीयू, HAL को बताता है कि Android का इस्तेमाल करने वाले किस डिवाइस को सूचना और मनोरंजन की सुविधा देनी चाहिए डिवाइस बूट होना शुरू हो जाता है. इससे ड्राइवर को Android डिवाइस मिलने में कम समय लगता है लोड करने के लिए उपयोगकर्ता.

उपयोगकर्ता एचएएल चालू करना

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

$ 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

उपयोगकर्ता की एचएएल प्रॉपर्टी

उपयोगकर्ता लाइफ़साइकल प्रॉपर्टी

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

ध्यान दें: जब उपयोगकर्ता एचएएल का इस्तेमाल किया जाता है, तो इन सभी में से एक प्रॉपर्टी को लागू किया जाना चाहिए.

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

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

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

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

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

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

    एचएएल, SUCCESS या FAILURE की मदद से जवाब देता है, ताकि Android को पता है कि आगे क्या करना है.

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

    Android,ANDROID_POST_SWITCH स्विच हो गया है या नहीं हो सका, इसके बारे में बताने के लिए एचएएल.

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

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

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

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

वाहन का वर्कफ़्लो, एचएएल से मिलता है, न कि Android सिस्टम से:

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

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

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

एचएएल SUCCESS या FAILURE की मदद से जवाब देता है. अगर एचएएल, गड़बड़ी के साथ जवाब देता है और Android सिस्टम उपयोगकर्ता को हटा देता है.

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

REMOVE_USER
(सिर्फ़ लिखें)
Android सिस्टम इस प्रॉपर्टी को तब कॉल करता है, जब कोई Android उपयोगकर्ता निकाली गई (CarUserManager.removeUser() तरीके के साथ).

यह एकतरफ़ा कॉल है — एचएएल से किसी जवाब की उम्मीद नहीं है.

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

अन्य प्रॉपर्टी

यहां कुछ अन्य प्रॉपर्टी दी गई हैं. ये उपयोगकर्ता के लाइफ़साइकल की स्थितियों से नहीं जुड़ी होती हैं. हर रणनीति को उपयोगकर्ता के एचएएल के साथ लागू किए बिना लागू किया जा सकता है.

एचएएल प्रॉपर्टी ब्यौरा
USER_IDENTIFICATION_ASSOCIATION
(पढ़ें/लिखें)
किसी भी Android उपयोगकर्ता को पहचान से जोड़ने के लिए इस प्रॉपर्टी का इस्तेमाल करें जैसे कि की फ़ोब या फ़ोन. इसी प्रॉपर्टी का इस्तेमाल इन कामों के लिए करें get या set असोसिएशन.

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

हेल्पर लाइब्रेरी

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

उदाहरण

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
}

स्विच

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

वर्कफ़्लो

पहला डायग्राम. उपयोगकर्ता एचएएल प्रॉपर्टी का वर्कफ़्लो

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

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
}

उपयोगकर्ता को हटा दें

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

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

उदाहरण सेट करें (User 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
}