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

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

ब्लूटूथ
ब्लूटूथ को लागू करने का तरीका, यहां दिए गए डिज़ाइन पर आधारित है.

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

Dumpstate
वर्चुअलाइज़ किए गए AAOS के लिए गड़बड़ी की रिपोर्ट जनरेट करते समय, होस्ट VM की जानकारी शामिल करना ज़रूरी है, ताकि डेवलपर को सिस्टम के बारे में ज़्यादा जानकारी मिल सके. ऐसा करने के लिए, trout
रेफ़रंस लागू करने की सुविधा, IDumpstateDevice
एचएएल लागू करती है. यह GRPC-vsock
के ज़रिए होस्ट VM की जानकारी इकट्ठा करती है. बग रिपोर्ट में, `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 स्टैक, वर्चुअलाइज़ किए गए V4L2 स्ट्रीमिंग डिवाइस से वीडियो स्ट्रीम को ऐक्सेस कर सकता है. यह डिवाइस, VirtIO-वीडियो ड्राइवर का इस्तेमाल करता है.
गैरेज मोड
ज़्यादा जानकारी के लिए, गैरेज मोड लेख पढ़ें.
गाड़ी के HAL से भेजी गई AP_POWER_STATE_REQ
प्रॉपर्टी की वजह से, गैरेज मोड में जाने और उससे बाहर निकलने की प्रोसेस शुरू होती है. वर्चुअलाइज़ेशन मोड में, Garage मोड को होस्ट साइड से ट्रिगर किया जाता है.
Android वीएम के लिए वर्चुअल डिवाइस उपलब्ध कराने के लिए, होस्ट वीएम को तब तक चालू रखना चाहिए, जब तक Android बंद नहीं हो जाता. होस्ट वीएम पर मौजूद VHAL सर्वर, AAOS मेहमान वीएम को बंद करने का सिग्नल भेजता है.
VHAL क्लाइंट से सिग्नल मिलने के बाद, AAOS VM, गैरेज मोड में चला जाता है और होस्ट VM को चालू रखने के लिए, दिल की धड़कन की तरह सिग्नल भेजना शुरू कर देता है.
ग्लोबल नेविगेशन सैटलाइट सिस्टम (जीएनएसएस)
trout
1.0 में, virtio-console
के ज़रिए GNSS वर्चुअलाइज़ेशन की सुविधा जोड़ी गई है. इस सुविधा के लागू होने से, होस्ट और मेहमान के बीच रॉ मेज़रमेंट और जगह की जानकारी को ठीक करने की सुविधा का आदान-प्रदान किया जा सकता है.
डेटा एक्सचेंज फ़ॉर्मैट, CSV होता है. इसका इस्तेमाल GnssLogger ऐप्लिकेशन करता है. रेफ़रंस लागू करने के दौरान, नेटिव GNSS ड्राइवर उपलब्ध न होने की वजह से, मॉक डेटा उपलब्ध कराया जाता है. हालांकि, नेटिव ड्राइवर को मेहमान के साइड में किए गए किसी भी बदलाव के बिना लागू किया जा सकता है. trout
सोर्स कोड के हिस्से के तौर पर, एक सैंपल मॉक होस्ट एजेंट दिया गया है.
फ़िलहाल, GNSS को शुरू करने और असिस्टेड जीएनएसएस (AGNSS) को मैनेज करने की ज़िम्मेदारी, होस्ट ओएस एनवायरमेंट की होती है.

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

सेंसर
जब AAOS, अन्य वाहन संबंधित ऑपरेटिंग सिस्टम के साथ-साथ मेहमान VM के तौर पर चल रहा हो, तो हो सकता है कि Android के पास सेंसर का सीधा ऐक्सेस न हो. इस मामले में, सेंसर को ऐक्सेस करने के लिए, Android मेहमान VM पर Virtio-SCMI ड्राइवर और होस्ट VM पर VirtIO-SCMI डिवाइस का इस्तेमाल किया जाता है. AAOS वर्चुअलाइज़ेशन रेफ़रंस प्लैटफ़ॉर्म, एक सामान्य और हार्डवेयर से जुड़ा सेंसर एचएएल उपलब्ध कराता है. इसका इस्तेमाल, सेंसर को ऐक्सेस करने के लिए ARM-आधारित SoCs के लिए किया जा सकता है.
सेंसर एचएएल, Linux Kernel IIO सबसिस्टम में IIO SCMI ड्राइवर के साथ कम्यूनिकेट करता है. यह ड्राइवर, ARM सिस्टम कंट्रोल और मैनेजमेंट इंटरफ़ेस (SCMI) स्पेसिफ़िकेशन से मिले SCMI सेंसर मैनेजमेंट प्रोटोकॉल का इस्तेमाल करता है. इससे सेंसर का पता लगाने और उन्हें कॉन्फ़िगर करने, सेंसर डेटा पढ़ने, और सेंसर वैल्यू में हुए बदलावों की सूचना पाने में मदद मिलती है.
IIO SCMI ड्राइवर, VirtIO SCMI ड्राइवर का इस्तेमाल करता है. यह होस्ट VM पर VirtIO SCMI डिवाइस के साथ SCMI मैसेज एक्सचेंज करने के लिए, virtio-scmi
के स्पेसिफ़िकेशन में बताए गए VirtIO ट्रांसपोर्ट प्रोटोकॉल का इस्तेमाल करता है. VirtIO
SCMI डिवाइस के पास, SoC के हिसाब से सेंसर ड्राइवर के ज़रिए सेंसर का सीधा ऐक्सेस होता है.

सेंसर HAL की जगह
VirtIO SCMI का इस्तेमाल करने वाले सेंसर एचएएल के रेफ़रंस को लागू करने का तरीका, device/google/trout/hal/sensors
पर मौजूद है.
सेंसर एचएएल कॉन्फ़िगरेशन
Android कार सेंसर कोऑर्डिनेट सिस्टम का पालन करने के लिए, होस्ट VM से मिले सेंसर डेटा में सेंसर एचएएल को बदलाव करना पड़ सकता है. सेंसर कॉन्फ़िगरेशन का स्कीमा, device/google/trout/hal/sensors/2.0/config/sensor_hal_configuration.xsd
में देखा जा सकता है.
OEM, 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 सर्वर, होस्ट VM पर चलता है. VHAL क्लाइंट और सर्वर, GRPC-vsock
के ज़रिए एक-दूसरे से कम्यूनिकेट करते हैं. ज़्यादा जानकारी के लिए, 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 रेफ़रंस प्लैटफ़ॉर्म में, VirtWifi
वायरलेस नेटवर्क को चालू करने के लिए, mac80211_hwsim
के साथ वाई-फ़ाई काम करता है. इसके बाद, नेटवर्क ट्रैफ़िक को होस्ट VM पर भेजने के लिए, virtio-net
टनल का इस्तेमाल किया जाता है. होस्ट VM के पास असल वाई-फ़ाई नेटवर्क का सीधा ऐक्सेस होता है.