ממשק הדפדפן של WebRTC שמוגדר כברירת מחדל ב-Cuttlefish כולל לוח בקרה שמאפשר אינטראקציות שונות עם המכשיר הווירטואלי.
לוח הבקרה כולל לחצני ברירת מחדל שמדמים פעולות נפוצות במכשיר הפיזי, כמו כפתור ההפעלה או כפתורי עוצמת הקול, וגם סיבוב התצוגה.
פעולות בהתאמה אישית
אתם יכולים להתאים אישית את לוח הבקרה ולהוסיף עוד כפתורים, כך שהמכשיר הווירטואלי ידמה טוב יותר את המכשיר הפיזי. האפשרות הזו שימושית לבדיקת תכונות ייחודיות למכשיר, כמו כפתור פיזי או תנועה מיוחדת שמפעילה פעולה ספציפית במערכת ההפעלה. באמצעות כפתורים מותאמים אישית אפשר גם להריץ בדיקת תכונות לצורך בקרת איכות, כמו ההתנהגות של מערכת ההפעלה כשסוללת המכשיר חלשה.
לוח הבקרה שמוגדר כברירת מחדל ב-Cuttlefish תומך גם בפלאגין של פעולות מותאמות אישית, ולא צריך לשנות בשביל זה את פרויקט ה-AOSP הראשי. כדי להתחיל להשתמש בפעולות מותאמות אישית, המכשיר הווירטואלי צריך רק קובץ תצוגה מינימלי. כאן אפשר לראות דוגמה לקובץ כזה.
יוצרים קובץ JSON שמגדיר את הפעולות המותאמות אישית של המכשיר. אפשר לשים את הקובץ הזה בכל ספרייה שבבעלותכם. מבנה הקובץ מתואר בקטעים ADB shell וAction server.
יוצרים מודול
prebuilt_etc_hostלהגדרות ה-JSON. חשוב לוודא שהערך שלsub_dirשווה לערך שלcvd_custom_action_config.prebuilt_etc_host { // Use any name you choose. name: "my_custom_action_config.json", src: "my_custom_action_config.json", // Always use this sub_dir. sub_dir: "cvd_custom_action_config", }כדי להוסיף את קובץ ההגדרות של הפעולה המותאמת אישית לחבילת המארח של המכשיר הווירטואלי, צריך להגדיר וריאנטים של תצורת build ב-Soong בקובץ ה-makefile של המוצר.
# Set these variables exactly as shown here to enable the host package to see # your custom config module name. SOONG_CONFIG_NAMESPACES += cvd SOONG_CONFIG_cvd += custom_action_config # Set this value to the name of your JSON module. SOONG_CONFIG_cvd_custom_action_config := my_custom_action_config.json
יש שתי שיטות נתמכות להטמעת פעולה בהתאמה אישית:
- פקודת ADB shell
- שרת פעולות
בקובץ התצורה בפורמט JSON אפשר להגדיר כמה מקרים של כל סוג הטמעה.
פקודת ADB shell
אפשר להגדיר כפתור אחד שמוטמע על ידי הרצת פקודה אחת של adb
shell. לדוגמה, קטע ה-JSON הבא מגדיר כפתור יחיד שפותח דף אינטרנט:
{
"shell_command":"am start -a android.intent.action.VIEW -d https://www.android.com/",
"button":{
"command":"web",
"title":"Web Page",
"icon_name":"language"
}
}
השדות הם:
-
shell_command: הפקודה להריץ ב-adb shellכשלוחצים על הכפתור -
button: אובייקט של כפתור יחיד עם שדות המשנה הבאים:-
command: השם הייחודי של הכפתור -
title: הטקסט החלופי של הכפתור -
icon_name: שם הסמל מתוך https://material.io/resources/icons
-
שרת פעולות
כדי לשלוט טוב יותר בהתנהגות הפעולות אפשר להשתמש בשרתי פעולות. שרת פעולה הוא קובץ בינארי של מארח שמקשיב לאירועי לחיצה על כפתורים מ-WebRTC באמצעות זוג שקעים. פרוטוקול WebRTC מעביר את האירועים לשרת הפעולות, והשרת מחליט איך לבצע את הפעולה.
שרתי פעולות מאפשרים שליטה מתקדמת יותר, כמו שמירת מצב (למשל עבור אירוע שאפשר להפעיל או להשבית) או אפילו הפעלת "פעולות מטא" כמו השבתת המכשיר הנוכחי, הפעלת מכשירים נוספים או הפעלת תוסף לדפדפן שמקליט את המסך. האפשרויות נקבעות לפי הפעולות שמוטמעות בקובץ הבינארי של המארח.
קטע ה-JSON הבא מגדיר שרת פעולות שמקשיב לאירועים בשני כפתורים:
{
"server":"cuttlefish_example_action_server",
"buttons":[
{
"command":"settings",
"title":"Quick Settings",
"icon_name":"settings"
},
{
"command":"alert",
"title":"Do Not Disturb",
"icon_name":"notifications_paused"
}
]
}
השדות הם:
-
server: השם של המודול הבינארי של המארח -
buttons: מערך של כפתורים, עם אותם שדות המשנה שמתוארים למעלה
אחרי שמעדכנים את הגדרת ה-JSON, מוסיפים את שם המודול של שרת הפעולות לווריאנט של תצורת ה-build ב-Soong cvd_custom_action_servers. לדוגמה:
# Append to this variable exactly as shown here.
SOONG_CONFIG_cvd += custom_action_servers
# Append the name of your action server(s) to this variable.
SOONG_CONFIG_cvd_custom_action_servers += cuttlefish_example_action_server
כל קובץ בינארי של מארח שרת פעולות צריך לבצע את השלבים הבאים:
קבלת מספר מתאר קובץ של שקע בתור הארגומנט הראשון והיחיד של התוכנית.
השקע הזה נוצר על ידי
launch_cvdבאמצעותsocketpairעם הדומייןAF_LOCAL, הסוגSOCK_STREAMוהפרוטוקול 0.בלולאה, קריאה של 128 בייטים מהשקע. הבייטים האלה מכילים אירועים של לחיצה על כפתור, שנשלחו על ידי לקוח WebRTC בפורמט
command:state. commandהוא הערך שמופיע בהגדרת ה-JSON, ו-stateהוא מצב הלחיצה על הכפתור (downאוup).פעולה בהתאם לאירועים שנכנסים, שמדמה את הפעולה המותאמת אישית.