רוב השינויים שנדרשים כדי לתמוך ב-VirtIO ב-AAOS כוללים שינויים ברמת ההטמעה של HAL וברמות שמתחתיה בליבת Android Common. ה-Framework של Android מתקשר עם HAL כללי שאינו תלוי בחומרה באמצעות מנהלי ההתקנים של VirtIO בקרנל של מכונת ה-VM של AAOS guest, שמתקשרת עם מכשירי VirtIO בצד המארח באמצעות פרוטוקולי VirtIO. מכשירי VirtIO בצד המארח יכולים לגשת לחומרה הפיזית באמצעות מנהלי התקנים של מכשירים ספציפיים ל-SoC.
התקשורת בין מנהל ההתקן של VirtIO לבין מכשיר VirtIO מתבצעת באמצעות virtqueue, שהם מאגרי טבעות דומים ל-DMA של רשימות פיזור איסוף.
אפשר להשתמש בכמה פרוטוקולים להעברת נתונים, כמו MMIO או PCI, כדי להעביר את הודעות VirtIO בין מכונות וירטואליות.
במקרים מסוימים, נעשה שימוש ב-vsock לתקשורת בין מכונות וירטואליות.
תקשורת של שכבת הפשטת חומרה לרכב (VHAL), בקרת אודיו ו-Dumpstate נתמכת באמצעות חיבור לסוכן עמית במכונה וירטואלית נפרדת דרך ממשק vsock. נעשה שימוש ב-gRPC דרך vsock כדי לגשת למערכות המשנה הלא סטנדרטיות האלה. gRPC בעץ המקור של Android משתנה כדי לעבוד עם vsock בפורמט הכתובת של vsock:CID:PORT_NUMBER.

איור 1. ארכיטקטורת וירטואליזציה.
אודיו
ב-AAOS וירטואלי, המכונה הווירטואלית של אורח Android יכולה להשתמש ב-virtio-snd כדי לגשת לאודיו.
virtio-snd מספק את מכשירי ה-PCM הווירטואליים למכונה הווירטואלית של Android, כך שההטמעה של HAL האודיו יכולה ליצור אינטראקציה עם מכשירי הקול הווירטואליים באמצעות ספריית TinyALSA.
ההטמעה של ברירת המחדל של Audio HAL נמצאת ב-AOSP בכתובת /device/google/trout/hal/audio/6.0. יצרני ציוד מקורי יכולים לשנות את ro.vendor.trout.audiohal.{in,out}_period_{ms,count} בפלטפורמה שלהם. יצרני ציוד מקורי יכולים גם להטמיע HAL משלהם לאודיו על ידי ביטול ההגדרה של משתנים שקשורים לאודיו ב-/device/google/trout/aosp_trout_common.mk.
שכבת ה-HAL של בקרת האודיו מנהלת את מיקוד האודיו ב-AAOS. לדוגמה, כשמערכת משמיעה צלילי חירום, יכול להיות שיהיה צורך להשתיק את המוזיקה שמתנגנת ברקע. שכבת ה-HAL של בקרת האודיו מודיעה לאפליקציות שמפעילות מוזיקה להשתיק את עצמן במצב הזה. במערכת הווירטואלית, הצלילים יכולים להגיע ממכונות וירטואליות אחרות. בהטמעה לדוגמה, למכונה הווירטואלית של אורח AAOS יש דמון של שרת בקרת שמע שפועל, שמשתמש ב-gRPC על vsock כדי לקבל בקשות למיקוד שמע ממכונות וירטואליות אחרות.
המכונה הווירטואלית המארחת יכולה להשתמש ב-device/google/trout/hal/audiocontrol/2.0/libandroid_audio_controller כדי לשלוח בקשות לשליטה באודיו אל AAOS. בזמן ש-libandroid_audio_controller מחזיק בהרשאת האודיו, הוא ממשיך לשלוח פעימות לב ל-AAOS עד שההרשאה משתחררת.

איור 2. ארכיטקטורת אודיו.
Bluetooth
האיור הבא ממחיש את ההטמעה של Bluetooth:

איור 3. ארכיטקטורת Bluetooth.
פרופיל דיבורית Bluetooth
כדי להפעיל את פרופיל הדיבורית (HFP) של Bluetooth ב-trout, מפרט מכשיר האודיו VirtIO הורחב כדי לתמוך באמצעי בקרה של אודיו. בגישה הזו, מכשיר VirtIO sound בצד המארח או ההיפר-ויז'ור מספק את שלושת אמצעי הבקרה האלה על האודיו שקשורים ל-HFP:
hfp_enablehfp_set_sampling_ratehfp_volume
כש-AAOS פועלת כמכונה וירטואלית (VM) אורחת, היא משתמשת ב-TinyALSA כדי להגדיר את אמצעי הבקרה האלה של האודיו. כדי להפעיל את תרחיש השימוש ב-HFP, המארח או ההיפר-ויז'ר מבצעים את הניתוב והכיול הספציפיים לספק בהתאם.
ההטמעה של Bluetooth מבוססת על איור העיצוב הבא:

איור 4. ארכיטקטורת Bluetooth.
Dumpstate
כשיוצרים דוח באגים ל-AAOS וירטואלי, כדאי לכלול בו מידע על מכונת ה-VM של המארח, כדי שלמפתחים תהיה תמונה מקיפה יותר של המערכת. לשם כך, הטמעת ההפניה trout מטמיעה את IDumpstateDevice HAL, שאוסף את פרטי המכונה הווירטואלית המארחת באמצעות gRPC דרך vsock. המידע על מכונת ה-VM המארחת בחבילה tar נקרא dumpstate_board.bin בדוח על הבאג, והיומנים שנוצרו נמצאים בנתיב dumpstate_board.txt.
כדי להגדיר את הפקודות להפעלה:
- מעתיקים את פרטי ההגדרה מהקובץ הבא לקובץ XML, לדוגמה:
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> - מעבירים את הנתיב של קובץ ה-XML החדש לשרת dumpstate כשמפעילים אותו, למשל:
--config_file my_config.xml
מערכת תצוגה מורחבת
מערכת התצוגה החיצונית (EVS) מציגה סרטון שצולם על ידי המצלמות של התצוגה האחורית והתצוגה ההיקפית. ב-AAOS וירטואלי, מחסנית ה-EVS יכולה לגשת לשידור הווידאו ממכשיר הסטרימינג הווירטואלי V4L2 שמשתמש במנהל ההתקן VirtIO-video.
מצב מוסך
הכניסה למצב חנייה והיציאה ממנו מופעלות על ידי מאפיינים AP_POWER_STATE_REQ שנשלחים על ידי VHAL. במצב וירטואליזציה, מצב המוסך מופעל מצד המארח.
המכונה הווירטואלית המארחת צריכה להישאר מופעלת כדי לספק מכשירים וירטואליים למכונה הווירטואלית של Android, עד שמכבים את Android. שרת VHAL במכונה הווירטואלית המארחת שולח את אות הכיבוי למכונה הווירטואלית של AAOS.
כשמתקבל אות מלקוח VHAL, המכונה הווירטואלית של AAOS עוברת למצב חנייה ומתחילה לשלוח אותות פעימת לב כדי לשמור על פעילות המכונה הווירטואלית המארחת. מידע נוסף מופיע במאמר בנושא מצב חנייה.
מערכת גלובלית לניווט לווייני (GNSS)
ב-trout 1.0, יש תמיכה בווירטואליזציה של GNSS דרך virtio-console. ההטמעה תומכת בהחלפה של מדידות גולמיות ושל תיקוני מיקום מהמארח לאורח.
פורמט חילופי הנתונים הוא CSV שמשמש את אפליקציית GNSSLogger. בהטמעה לדוגמה, מנהל ההתקן המקורי של GNSS לא זמין, ולכן יש נתונים מדומים. אפשר להטמיע מנהל התקן מקורי בלי לבצע שינויים בצד האורח. דוגמה לסוכן מארח מדומה מסופקת כחלק מקוד המקור של trout.
ההטמעה מצפה שאתחול GNSS ו-Assisted GNSS (AGNSS) יטופלו על ידי סביבת מערכת ההפעלה של המארח.

איור 5. ארכיטקטורת GNSS.
גרפיקה
כש-AAOS פועלת כמכונה וירטואלית (VM) אורחת לצד מערכות הפעלה אחרות לרכב, יכול להיות שלא תהיה ל-Android גישה ישירה ל-GPU או לבקר התצוגה. במקרה כזה, אפשר לגשת ל-GPU באמצעות Mesa או goldfish-opengl, ודרייבר virtio-gpu במכונה הווירטואלית של אורח Android ובמכשיר virtio-gpu.
במכונה הווירטואלית של אורח Android, Mesa או goldfish-opengl מקודדים פקודות OpenGLES לזרם Gallium או לזרם GLES שנוצר אוטומטית, בהתאמה. מנהל ההתקן של ליבת virtio-gpu
המערכת משמש כהעברה. בצד המארח, virglrenderer (עבור Mesa) ו-vulkan-cereal (עבור goldfish-opengl) מפעילים מחדש את זרם הפקודות המפוענח על גבי מנהל ההתקן הקיים של ה-GPU. פלטפורמת ההפניה של AAOS trout תומכת ב-OpenGL ES
רק עם תמיכה ב-Vulkan, שצפויה בגרסה עתידית.

איור 6. ארכיטקטורת הגרפיקה.
חיישנים
כש-AAOS פועלת כמכונה וירטואלית אורחת לצד מערכות הפעלה אחרות לרכב, יכול להיות שלא תהיה ל-Android גישה ישירה לחיישנים. במקרה כזה, אפשר לגשת לחיישנים באמצעות מנהל ההתקן Virtio-SCMI במכונה וירטואלית של אורח ב-Android ובאמצעות מכשיר VirtIO-SCMI במכונה וירטואלית של מארח. פלטפורמת ההפניה לווירטואליזציה של AAOS מספקת Sensor HAL גנרי שלא תלוי בחומרה, שאפשר להשתמש בו במערכות SoC מבוססות-ARM כדי לגשת לחיישנים.
Sensor HAL מתקשר עם מנהל ההתקן IIO SCMI במערכת המשנה IIO של ליבת לינוקס, שמשתמשת בפרוטוקול לניהול חיישנים SCMI שמוגדר במפרט של ממשק בקרת מערכת וניהול (SCMI) של ARM כדי לגלות ולהגדיר חיישנים, לקרוא נתוני חיישנים ולקבל התראות על שינויים בערכי החיישנים.
מנהל ההתקן IIO SCMI משתמש במנהל ההתקן VirtIO SCMI, שמשתמש בפרוטוקול התעבורה VirtIO במפרט virtio-scmi כדי להחליף הודעות SCMI עם מכשיר VirtIO SCMI במכונה הווירטואלית המארחת. למכשיר VirtIO
SCMI יש גישה ישירה לחיישנים דרך מנהלי התקנים של חיישנים ספציפיים ל-SoC.
איור 7. ארכיטקטורת החיישן.
מיקום ה-HAL של החיישן
הטמעת ההפניה של חיישן HAL, שמשתמשת ב-VirtIO SCMI, נמצאת בכתובת
device/google/trout/hal/sensors.
הגדרת Sensor HAL
יכול להיות ששכבת ה-HAL של החיישן תצטרך לשנות את נתוני החיישן שמתקבלים מהמכונה הווירטואלית המארחת כדי להתאים למערכת הקואורדינטות של חיישן 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>
שכבת הפשטת חומרה לרכב
ההטמעה של שכבת הפשטת חומרה לרכב (VHAL) מורכבת משני רכיבים:
- לקוח. מספקת ממשקי API שמשמשים את Android ב-AAOS וירטואלי
- השרת. מתקשר ישירות עם החומרה, כמו אפיקי נתונים של כלי רכב (או אמולטור).
בווירטואליזציה, שרת ה-VHAL פועל במכונה הווירטואלית המארחת. הלקוח והשרת של VHAL מתקשרים באמצעות gRPC דרך vsock. מידע נוסף זמין במאמר device/google/trout/hal/vehicle/2.0/proto/VehicleServer.proto. יצרני ציוד מקורי (OEM) יכולים להשתמש בפרוטוקול העברה שונה מ-gRPC על ידי ביטול ברירת המחדל של ממשקי ה-API לתקשורת. דוגמאות מופיעות במאמר device/google/trout/hal/vehicle/2.0/GrpcVehicle{Client,Server}.cpp.
מערכות משנה אחרות
VirtIO כבר מספק ממשק מוגדר היטב לרכיבים כמו Block Storage, רשת, מסוף, קלט, Socket ואנטרופיה. במערכות המשנה האלה, AAOS משתמש במנהל ההתקן כמו שהוא, למשל virtio-blk, virtio-input, virtio-console ו-virtio-net.
בפלטפורמת העזר הווירטואלית של AAOS, יש תמיכה ב-Wi-Fi עם mac80211_hwsim
כדי להפעיל רשת אלחוטית VirtWifi, שמשתמשת במנהרת virtio-net כדי לשלוח את תעבורת הרשת למכונה הווירטואלית של המארח, שיש לה גישה ישירה לרשת ה-Wi-Fi בפועל.