हम एआईडीएल वीएचएएल के लिए, रेफ़रंस इंप्लीमेंटेशन उपलब्ध कराते हैं. मुख्य सेवा थ्रेड को VehicleService.cpp पर लागू किया जाता है.
वीएचएएल इंटरफ़ेस को DefaultVehicleHal.cpp पर लागू किया गया है.
रेफ़रंस के तौर पर लागू किया गया यह तरीका, दो लेयर वाले आर्किटेक्चर पर आधारित है. ऊपरी लेयर पर, DefaultVehicleHal, वीएचएएल एआईडीएल इंटरफ़ेस लागू करता है. साथ ही, सभी हार्डवेयर डिवाइसों के लिए वीएचएएल लॉजिक उपलब्ध कराता है. नीचे वाली लेयर पर, FakeVehicleHardware, IVehicleHardware इंटरफ़ेस लागू करता है. यह क्लास, असली हार्डवेयर या वाहन बस के साथ इंटरैक्ट करने के VHAL लॉजिक का सिम्युलेशन करती है. साथ ही, यह डिवाइस के हिसाब से काम करती है. वेंडर चाहें, तो इसी आर्किटेक्चर को अपना सकते हैं. साथ ही, वे उसी DefaultVehicleHal क्लास का फिर से इस्तेमाल कर सकते हैं. इसके अलावा, वे DefaultVehicleHal को लागू करने का अपना तरीका भी उपलब्ध करा सकते हैं.IVehicleHardware
DefaultVehicleHal
में यह लॉजिक शामिल होता है. इसे सामान्य माना जाता है और यह किसी भी VHAL
इस्तेमाल पर लागू हो सकता है.
- यह
IVehicleइंटरफ़ेस लागू करता है. - यह सामान्य इनपुट की जांच करता है. इसमें डुप्लीकेट आईडी की जांच भी शामिल है.
- यह हर बाइंडर क्लाइंट के लिए, हर ऑपरेशन के लिए क्लाइंट ऑब्जेक्ट (उदाहरण के लिए,
GetValuesClient) असाइन करता है. साथ ही, हर ऑब्जेक्ट को ग्लोबल पूल में जोड़ता है. - यह कुकी, एसिंक कॉलबैक लॉजिक को मैनेज करती है. जैसे, किसी अनुरोध को अनुरोधों के पूल में जोड़ना. जब हमें नतीजे मिलते हैं, तो यह कुकी उन अनुरोधों को पूरा करती है जो अब भी प्रोसेस किए जा रहे हैं. अगर प्रोसेस किए जा रहे किसी अनुरोध का समय खत्म हो जाता है, तो यह कुकी गड़बड़ी का मैसेज दिखाती है.
- यह कुकी,
LargeParcelableको क्रमबद्ध और क्रम से हटाती है. इसके बारे में जानने के लिए,ParcelableUtils.hदेखें. - यह कुकी, सदस्यता मैनेज करती है. इसके बारे में जानने के लिए,
SubscriptionManager.hदेखें. - यह कुकी अनुमतियों की जांच करती है. (
checkReadPermissionऔरcheckWritePermissionफ़ंक्शन देखें). - यह समय-समय पर
IVehicleHardware.checkHealthको कॉल करता है और हार्टबीट सिग्नल भेजता है.checkHealthफ़ंक्शन देखें.
IVehicleHardware एक सामान्य इंटरफ़ेस है. इसका इस्तेमाल, वीएचएएल के हार्डवेयर के हिसाब से लागू किए गए फ़ंक्शन को दिखाने के लिए किया जाता है. IVehicleHardware के लिए रेफ़रंस इंप्लीमेंटेशन FakeVehicleHardware है. यह प्रॉपर्टी की वैल्यू को सेव करने के लिए, इन-मेमोरी मैप का इस्तेमाल करता है. साथ ही, यह किसी असली वाहन बस से कम्यूनिकेट नहीं करता. इसे एम्युलेटर पर चलाने के लिए बनाया गया है. साथ ही, यह किसी खास हार्डवेयर पर निर्भर नहीं करता. वेंडर को इसका इस्तेमाल बिना किसी बदलाव के नहीं करना चाहिए. साथ ही, उन्हें वाहन की बस के हिसाब से लॉजिक जोड़ना चाहिए.
Android 14 से, FakeVehicleHardware डिवाइस के /vendor/etc/automotive/vhalconfig/ फ़ोल्डर से, शुरू होने के दौरान रन-टाइम पर काम करने वाली प्रॉपर्टी कॉन्फ़िगरेशन को पढ़ता है. इस फ़ोल्डर में JSON-स्टाइल वाली कॉन्फ़िगरेशन फ़ाइल होती है. कॉन्फ़िगरेशन फ़ाइल के फ़ॉर्मैट और कॉन्फ़िगरेशन फ़ाइल के कॉन्टेंट के बारे में जानने के लिए, रेफ़रंस वीएचएएल की README फ़ाइल देखें.
FakeVehicleHardware, टेस्टिंग के लिए कॉन्फ़िगरेशन फ़ाइल को बदलने की सुविधा भी देता है. अगर सिस्टम प्रॉपर्टी persist.vendor.vhal_init_value_override सेट है, तो यह डिवाइस पर मौजूद /vendor/etc/automotive/vhaloverride/ फ़ोल्डर से कॉन्फ़िगरेशन फ़ाइल का इस्तेमाल करके, मौजूदा कॉन्फ़िगरेशन को बदल देता है. इस प्रॉपर्टी को, बिल्ड टाइम पर या VHAL शुरू होने से पहले बूट के दौरान सेट किया जाना चाहिए. वेंडर, इसी तरह के तरीके का इस्तेमाल कर सकता है, ताकि VHAL के साथ काम करने वाली प्रॉपर्टी कॉन्फ़िगरेशन को हार्ड-कोड न किया जाए. साथ ही, इसे शुरू होने के समय डाइनैमिक तरीके से तय किया जा सके.
वीएचएएल के शुरू होने के बाद, वाहन की प्रॉपर्टी कॉन्फ़िगरेशन की सूची में बदलाव नहीं किया जाना चाहिए.
Android 16 से, GRPCVehicleHardware
एक और रेफ़रंस IVehicleHardware लागू करने की सुविधा देता है. इस तरीके में यह माना जाता है कि रिमोट मशीन या वीएम पर कोई अलग सर्वर चल रहा है. इस सर्वर में, प्रॉपर्टी को मैनेज करने की सुविधा मौजूद है. AAOS डिवाइसों पर चलने वाला वीएचएएल, प्रॉक्सी के तौर पर काम करता है. यह रिमोट सर्वर को अनुरोध भेजता है. ज़्यादा जानकारी के लिए, grpc देखें.