AAOS में VirtIO को सपोर्ट करने के लिए, ज़्यादातर बदलाव HAL के लागू करने के लेवल पर और Android Common Kernel में इससे नीचे किए जाते हैं. Android फ़्रेमवर्क, हार्डवेयर से जुड़ी जानकारी के बिना काम करने वाले सामान्य एचएएल से कम्यूनिकेट करता है. इसके लिए, AAOS गेस्ट वीएम कर्नल में VirtIO ड्राइवर का इस्तेमाल किया जाता है. यह VirtIO प्रोटोकॉल का इस्तेमाल करके, होस्ट साइड पर मौजूद VirtIO डिवाइसों से कम्यूनिकेट करता है. होस्ट साइड पर मौजूद VirtIO डिवाइस, SoC के हिसाब से डिवाइस ड्राइवर का इस्तेमाल करके फ़िज़िकल एचडब्ल्यू को ऐक्सेस कर सकते हैं.
VirtIO ड्राइवर और VirtIO डिवाइस के बीच कम्यूनिकेशन, virtqueue की मदद से होता है. ये स्कैटर गैदर लिस्ट के डीएमए जैसे रिंग बफ़र होते हैं.
वर्चुअल मशीनों के बीच VirtIO मैसेज का लेन-देन करने के लिए, कई ट्रांसपोर्ट का इस्तेमाल किया जा सकता है. जैसे, MMIO या PCI.
कुछ मामलों में, vsock का इस्तेमाल एक वीएम से दूसरे वीएम के बीच कम्यूनिकेशन के लिए किया जाता है.
वाहन के एचएएल (वीएचएएल), ऑडियो कंट्रोल, और डंपस्टेट कम्यूनिकेशन के लिए, vsock इंटरफ़ेस पर अलग वीएम पर मौजूद पीयर एजेंट से कनेक्शन का इस्तेमाल किया जाता है. इन नॉन-स्टैंडर्ड सबसिस्टम को ऐक्सेस करने के लिए, vsock पर gRPC का इस्तेमाल किया जाता है. Android सोर्स ट्री में मौजूद gRPC को vsock के साथ काम करने के लिए बदला जाता है. इसमें vsock:CID:PORT_NUMBER के पते के फ़ॉर्मैट का इस्तेमाल किया जाता है.

पहली इमेज. वर्चुअलाइज़ेशन आर्किटेक्चर.
ऑडियो
वर्चुअलाइज़ किए गए AAOS में, Android गेस्ट वीएम, ऑडियो को ऐक्सेस करने के लिए virtio-snd का इस्तेमाल कर सकता है.
virtio-snd, Android VM को वर्चुअलाइज़ किए गए पीसीएम डिवाइस उपलब्ध कराता है, ताकि ऑडियो एचएएल लागू करने वाला सॉफ़्टवेयर, TinyALSA लाइब्रेरी की मदद से वर्चुअलाइज़ किए गए साउंड डिवाइसों के साथ इंटरैक्ट कर सके.
डिफ़ॉल्ट ऑडियो HAL को AOSP में /device/google/trout/hal/audio/6.0 पर लागू किया जाता है. ओईएम, अपने प्लैटफ़ॉर्म के लिए ro.vendor.trout.audiohal.{in,out}_period_{ms,count} में बदलाव कर सकते हैं. ओईएम, /device/google/trout/aosp_trout_common.mk. में ऑडियो से जुड़े वैरिएबल को बदलकर, अपना ऑडियो एचएएल भी लागू कर सकते हैं
ऑडियो कंट्रोल HAL, AAOS में ऑडियो फ़ोकस को मैनेज करता है. उदाहरण के लिए, जब सिस्टम आपातकालीन आवाज़ें चला रहा हो, तो बैकग्राउंड में चल रहे संगीत को म्यूट करना पड़ सकता है. ऑडियो कंट्रोल HAL, संगीत चलाने वाले ऐप्लिकेशन को इस स्थिति में म्यूट करने के लिए सूचना देता है. वर्चुअलाइज़ किए गए सिस्टम में, आवाज़ें अन्य वीएम से आ सकती हैं. रेफ़रंस के तौर पर दिए गए उदाहरण में, AAOS के मेहमान वीएम में ऑडियो कंट्रोल सर्वर डेमॉन चल रहा है. यह vsock पर gRPC का इस्तेमाल करके, अन्य वीएम से ऑडियो फ़ोकस के अनुरोध पाता है.
होस्ट वीएम, AAOS को ऑडियो कंट्रोल करने के अनुरोध भेजने के लिए device/google/trout/hal/audiocontrol/2.0/libandroid_audio_controller का इस्तेमाल कर सकता है. libandroid_audio_controller के पास ऑडियो फ़ोकस होने पर, यह AAOS को हार्टबीट भेजता रहता है. ऐसा तब तक होता है, जब तक फ़ोकस रिलीज़ नहीं हो जाता.

दूसरी इमेज. ऑडियो आर्किटेक्चर.
ब्लूटूथ
ब्लूटूथ को लागू करने के तरीके को इस इमेज में दिखाया गया है:

तीसरी इमेज. ब्लूटूथ आर्किटेक्चर.
ब्लूटूथ हैंड्स-फ़्री प्रोफ़ाइल
trout पर ब्लूटूथ हैंड्स-फ़्री प्रोफ़ाइल (एचएफ़पी) चालू करने के लिए, VirtIO साउंड डिवाइस के स्पेसिफ़िकेशन को ऑडियो कंट्रोल के साथ काम करने के लिए बढ़ाया गया है. इस तरीके का इस्तेमाल करके, होस्ट/हाइपरवाइज़र साइड पर मौजूद VirtIO साउंड डिवाइस, एचएफ़पी से जुड़े ये तीन ऑडियो कंट्रोल उपलब्ध कराता है:
hfp_enablehfp_set_sampling_ratehfp_volume
जब AAOS, गेस्ट वीएम के तौर पर चलता है, तब AAOS इन ऑडियो कंट्रोल को सेट करने के लिए TinyALSA का इस्तेमाल करता है. एचएफ़पी के इस्तेमाल के उदाहरण को चालू करने के लिए, होस्ट/हाइपरवाइज़र, वेंडर के हिसाब से रूटिंग और कैलिब्रेशन करता है.
ब्लूटूथ की सुविधा को लागू करने के लिए, इस डिज़ाइन इलस्ट्रेशन का इस्तेमाल किया गया है:

चौथी इमेज. ब्लूटूथ आर्किटेक्चर.
Dumpstate
वर्चुअलाइज़ किए गए AAOS के लिए गड़बड़ी की रिपोर्ट जनरेट करते समय, होस्ट वीएम की जानकारी शामिल करना ज़रूरी है. इससे डेवलपर को सिस्टम के बारे में ज़्यादा जानकारी मिलती है. इसके लिए, trout रेफ़रंस इंप्लीमेंटेशन, IDumpstateDevice HAL को लागू करता है. यह vsock पर gRPC के ज़रिए होस्ट वीएम की जानकारी इकट्ठा करता है. बग रिपोर्ट में, tar पैकेज किए गए होस्ट वीएम की जानकारी को dumpstate_board.bin नाम दिया गया है. वहीं, लॉग डंप करने की जानकारी dumpstate_board.txt पर दी गई है.
कमांड को लागू करने के लिए, उन्हें कॉन्फ़िगर करने का तरीका:
- कॉन्फ़िगरेशन की जानकारी को यहां दी गई फ़ाइल से कॉपी करके, एक्सएमएल फ़ाइल में चिपकाएं. उदाहरण के लिए,
config.xml:<dumpstateHalConfiguration version="1.0"> <services> <service name="coqos-virtio-blk" command="/bin/journalctl --no-pager -t coqos-virtio-blk"/> <service name="coqos-virtio-net" command="/bin/journalctl --no-pager -t coqos-virtio-net"/> <service name="coqos-virtio-video" command="/bin/journalctl --no-pager -t coqos-virtio-video"/> <service name="coqos-virtio-console" command="/bin/journalctl --no-pager -t coqos-virtio-console"/> <service name="coqos-virtio-rng" command="/bin/journalctl --no-pager -t coqos-virtio-rng"/> <service name="coqos-virtio-vsock" command="/bin/journalctl --no-pager -t coqos-virtio-vsock"/> <service name="coqos-virtio-gpu-virgl" command="/bin/journalctl --no-pager -t coqos-virtio-gpu-virgl"/> <service name="coqos-virtio-scmi" command="/bin/journalctl --no-pager -t coqos-virtio-scmi"/> <service name="coqos-virtio-input" command="/bin/journalctl --no-pager -t coqos-virtio-input"/> <service name="coqos-virtio-snd" command="/bin/journalctl --no-pager -t coqos-virtio-snd"/> <service name="dumpstate_grpc_server" command="/bin/journalctl --no-pager -t dumpstate_grpc_server"/> <service name="systemd" command="/bin/journalctl --no-pager -t systemd"/> <service name="systemctl" command="/bin/systemctl status"/> <service name="vehicle_hal_grpc_server" command="/bin/journalctl --no-pager -t vehicle_hal_grpc_server"/> </services> <systemLogs> <service name="dmesg" command="/bin/dmesg -kuPT"/> </systemLogs> </dumpstateHalConfiguration> - लॉन्च करते समय, नई एक्सएमएल फ़ाइल का पाथ dumpstate सर्वर को पास करें. उदाहरण के लिए:
--config_file my_config.xml
एक्सटेंडेड व्यू सिस्टम
एक्सटेंडेड व्यू सिस्टम (ईवीएस), रियर व्यू और चारों तरफ़ के कैमरे से कैप्चर किया गया वीडियो दिखाता है. वर्चुअलाइज़ किए गए AAOS में, EVS स्टैक, VirtIO-video ड्राइवर का इस्तेमाल करने वाले वर्चुअलाइज़ किए गए V4L2 स्ट्रीमिंग डिवाइस से वीडियो स्ट्रीम को ऐक्सेस कर सकता है.
गैराज मोड
गैराज मोड में जाने और इससे बाहर निकलने की सुविधा, वीएचएएल से भेजी गई AP_POWER_STATE_REQ प्रॉपर्टी से ट्रिगर होती है. वर्चुअलाइज़ेशन मोड में, गैराज मोड को होस्ट साइड से ट्रिगर किया जाता है.
Android VM के लिए वर्चुअल डिवाइस उपलब्ध कराने के लिए, होस्ट वीएम को तब तक चालू रहना चाहिए, जब तक Android बंद न हो जाए. होस्ट वीएम पर मौजूद VHAL सर्वर, AAOS गेस्ट वीएम को बंद होने का सिग्नल भेजता है.
VHAL क्लाइंट से सिग्नल मिलने पर, AAOS VM गैराज मोड में चला जाता है. साथ ही, होस्ट VM को चालू रखने के लिए, हार्टबीट सिग्नल भेजने लगता है. ज़्यादा जानकारी के लिए, गैराज मोड देखें.
ग्लोबल नेविगेशन सैटलाइट सिस्टम (जीएनएसएस)
trout 1.0 में, virtio-console पर GNSS वर्चुअलाइज़ेशन की सुविधा शामिल है. इस सुविधा को लागू करने पर, होस्ट से मेहमान को रॉ मेज़रमेंट और जगह की जानकारी ठीक करने की सुविधा मिलती है.
डेटा एक्सचेंज का फ़ॉर्मैट, GNSSLogger ऐप्लिकेशन इस्तेमाल करने वाला CSV है. रेफ़रंस के तौर पर लागू करने के लिए, नेटिव GNSS ड्राइवर उपलब्ध नहीं है. इसलिए, मॉक डेटा उपलब्ध है. गेस्ट-साइड में कोई बदलाव किए बिना, नेटिव ड्राइवर लागू किया जा सकता है. trout सोर्स कोड के साथ, मॉक होस्ट एजेंट का एक सैंपल दिया गया है.
इस सुविधा को लागू करने के लिए, जीएनएसएस को शुरू करने और असिस्टेड जीएनएसएस (एजीएनएसएस) को होस्ट ओएस एनवायरमेंट से मैनेज किया जाना चाहिए.

पांचवीं इमेज. जीएनएसएस आर्किटेक्चर.
ग्राफ़िक
जब AAOS, अन्य ऑटोमोटिव ऑपरेटिंग सिस्टम के साथ गेस्ट वीएम के तौर पर चल रहा होता है, तो Android के पास GPU या डिसप्ले कंट्रोलर का सीधा ऐक्सेस नहीं हो सकता. इस मामले में, Android गेस्ट वीएम और virtio-gpu डिवाइस पर Mesa या goldfish-opengl और virtio-gpu ड्राइवर का इस्तेमाल करके, जीपीयू को ऐक्सेस किया जा सकता है.
Android के गेस्ट वीएम पर, Mesa या goldfish-opengl, OpenGLES कमांड को Gallium स्ट्रीम या अपने-आप जनरेट होने वाली GLES स्ट्रीम में बदलता है. virtio-gpu
कर्नेल ड्राइवर का इस्तेमाल ट्रांसपोर्ट के तौर पर किया जाता है. होस्ट साइड पर, virglrenderer (Mesa के लिए) और vulkan-cereal (goldfish-opengl के लिए), डिकोड की गई कमांड स्ट्रीम को मौजूदा जीपीयू ड्राइवर के ऊपर फिर से चलाता है. AAOS का रेफ़रंस प्लैटफ़ॉर्म trout सिर्फ़ Vulkan के साथ OpenGL ES के साथ काम करता है. यह सुविधा आने वाले समय में उपलब्ध होगी.

छठी इमेज. ग्राफ़िक्स आर्किटेक्चर.
सेंसर
जब AAOS, अन्य ऑटोमोटिव ऑपरेटिंग सिस्टम के साथ गेस्ट वीएम के तौर पर चल रहा हो, तो हो सकता है कि Android के पास सेंसर का सीधा ऐक्सेस न हो. इस मामले में, Android गेस्ट वीएम पर Virtio-SCMI ड्राइवर और होस्ट वीएम पर VirtIO-SCMI डिवाइस का इस्तेमाल करके, सेंसर ऐक्सेस किए जा सकते हैं. AAOS वर्चुअलाइज़ेशन रेफ़रंस प्लैटफ़ॉर्म, एक सामान्य और एचडब्ल्यू-अग्नोस्टिक सेंसर HAL उपलब्ध कराता है. इसका इस्तेमाल, सेंसर ऐक्सेस करने के लिए ARM पर आधारित SoCs के लिए किया जा सकता है.
सेंसर एचएएल, Linux कर्नेल IIO सबसिस्टम में मौजूद IIO SCMI ड्राइवर के साथ कम्यूनिकेट करता है. यह ड्राइवर, ARM सिस्टम कंट्रोल ऐंड मैनेजमेंट इंटरफ़ेस (एससीएमआई) की खास बातों के तहत उपलब्ध कराए गए SCMI सेंसर मैनेजमेंट प्रोटोकॉल का इस्तेमाल करता है. इससे सेंसर का पता लगाया जा सकता है और उन्हें कॉन्फ़िगर किया जा सकता है. साथ ही, सेंसर डेटा को पढ़ा जा सकता है और सेंसर की वैल्यू में होने वाले बदलावों के बारे में सूचनाएं पाई जा सकती हैं.
IIO SCMI ड्राइवर, VirtIO SCMI ड्राइवर का इस्तेमाल करता है. यह ड्राइवर, virtio-scmi स्पेसिफ़िकेशन में VirtIO ट्रांसपोर्ट प्रोटोकॉल का इस्तेमाल करता है. इससे होस्ट वीएम पर VirtIO SCMI डिवाइस के साथ SCMI मैसेज का आदान-प्रदान किया जा सकता है. VirtIO SCMI डिवाइस के पास, एसओसी के हिसाब से सेंसर ड्राइवर के ज़रिए सेंसर को सीधे तौर पर ऐक्सेस करने की सुविधा होती है.
सातवीं इमेज. सेंसर आर्किटेक्चर.
सेंसर एचएएल की जगह
VirtIO SCMI का इस्तेमाल करने वाले सेंसर HAL का रेफ़रंस इंप्लीमेंटेशन, device/google/trout/hal/sensors पर मौजूद है.
सेंसर एचएएल कॉन्फ़िगरेशन
Android कार के सेंसर कोऑर्डिनेट सिस्टम के मुताबिक, सेंसर एचएएल को होस्ट वीएम से मिले सेंसर डेटा में बदलाव करना पड़ सकता है. सेंसर कॉन्फ़िगरेशन का स्कीमा device/google/trout/hal/sensors/2.0/config/sensor_hal_configuration.xsd में देखा जा सकता है.
ओईएम, sensor_hal_configuration.xml में सेंसर कॉन्फ़िगरेशन की जानकारी दे सकते हैं. जैसे, ओरिएंटेशन और जगह की जानकारी. साथ ही, फ़ाइल को /odm/etc/sensors/ या /vendor/etc/sensors/ में कॉपी कर सकते हैं. सेंसर के कॉन्फ़िगरेशन का उदाहरण यहां दिया गया है:
<sensorHalConfiguration version="1.0" xmlns:xi="http://www.w3.org/2001/XInclude"> <modules> <module halName="android.hardware.sensors@2.0-Google-IIO-Subhal" halVersion="2.0"> <sensors> <sensor name="scmi.iio.accel" type="1"> <configuration> <!-- Attribute rotate denotes if HAL needs to modify the sensor data to comply with // the Android car sensor coordinate system --> <orientation rotate="true"> <!-- Attribute map denotes the indexes of data in sensor data received --> <!-- Attribute negate denotes if data needs to be negated --> <x map="0" negate="false"/> <y map="1" negate="true"/> <z map="2" negate="true"/> </orientation> <location> <!-- Attribute x, y, z denotes location of the sensor placement --> <x>10</x> <y>15</y> <z>20</z> </location> </configuration> </sensor> </sensors> </module> </modules> </sensorHalConfiguration>
व्हीकल एचएएल
व्हीकल एचएएल (वीएचएएल) को लागू करने के लिए, दो कॉम्पोनेंट की ज़रूरत होती है:
- क्लाइंट. यह वर्चुअलाइज़ किए गए AAOS में Android के इस्तेमाल किए गए एपीआई उपलब्ध कराता है
- सर्वर. यह सीधे तौर पर हार्डवेयर से कम्यूनिकेट करता है. जैसे, वाहन की बसें या एम्युलेटर.
वर्चुअलाइज़ेशन में, वीएचएएल सर्वर, होस्ट वीएम पर चलता है. VHAL क्लाइंट और सर्वर, vsock पर gRPC के ज़रिए कम्यूनिकेट करते हैं. ज़्यादा जानकारी के लिए, device/google/trout/hal/vehicle/2.0/proto/VehicleServer.proto देखें. OEM, कम्यूनिकेशन एपीआई को बदलकर, gRPC के अलावा किसी दूसरे ट्रांसपोर्ट प्रोटोकॉल का इस्तेमाल कर सकते हैं. उदाहरण के लिए, device/google/trout/hal/vehicle/2.0/GrpcVehicle{Client,Server}.cpp देखें.
अन्य सबसिस्टम
VirtIO, ब्लॉक स्टोरेज, नेटवर्क, कंसोल, इनपुट, सॉकेट, और एंट्रॉपी जैसे कॉम्पोनेंट के लिए पहले से ही अच्छी तरह से तय किया गया इंटरफ़ेस उपलब्ध कराता है. इन सबसिस्टम के लिए, AAOS ड्राइवर का इस्तेमाल उसी तरह करता है जैसा वह है. जैसे, virtio-blk, virtio-input, virtio-console, और virtio-net.
वर्चुअलाइज़ किए गए AAOS रेफ़रंस प्लैटफ़ॉर्म में, वाई-फ़ाई की सुविधा mac80211_hwsim के साथ काम करती है. इससे VirtWifi वायरलेस नेटवर्क चालू किया जा सकता है. इसके बाद, यह नेटवर्क virtio-net टनल का इस्तेमाल करके, नेटवर्क ट्रैफ़िक को होस्ट वीएम पर भेजता है. होस्ट वीएम के पास, असल वाई-फ़ाई नेटवर्क का सीधा ऐक्सेस होता है.