לוח הבקרה של Cuttlefish

ממשק הדפדפן של WebRTC שמוגדר כברירת מחדל ב-Cuttlefish כולל לוח בקרה שמאפשר יותר דרכים לאינטראקציה עם המכשיר הווירטואלי.

לוח הבקרה כולל לחצני ברירת מחדל שמדמים פעולות פיזיות נפוצות במכשיר, כמו לחצן ההפעלה או לחצני עוצמת הקול, וגם סיבוב המכשיר.

פעולות בהתאמה אישית

אתם יכולים להתאים אישית את לוח הבקרה כדי להוסיף עוד לחצנים שיאפשרו למכשיר הווירטואלי לדמות את המכשיר הפיזי בצורה מדויקת יותר. האפשרות הזו שימושית לבדיקת תכונות ייחודיות למכשיר, כמו כפתור פיזי או תנועה מיוחדת שמפעילה פעולה ייחודית במערכת ההפעלה. אפשר גם להשתמש בלחצנים מותאמים אישית כדי להפעיל בדיקות של תכונות שמתמקדות יותר בבקרת איכות, כמו ההתנהגות של מערכת ההפעלה כשהסוללה של המכשיר חלשה.

לוח הבקרה שמוגדר כברירת מחדל ב-Cuttlefish כולל תמיכה ב'חיבור' של פעולות מותאמות אישית בלי שצריך לשנות את פרויקט ה-AOSP הראשי של Cuttlefish. כדי להתחיל להשתמש בפעולות מותאמות אישית, המכשיר הווירטואלי צריך לכלול רק קובץ הגדרה מינימלי. דוגמה לקובץ הגדרות של פעולה בהתאמה אישית

  1. יוצרים קובץ JSON שמגדיר את הפעולות המותאמות אישית של המכשיר. אפשר לשים את הקובץ הזה בכל ספרייה שבבעלותכם. המבנה של הקובץ הזה מתואר בקטעים ADB shell וAction server.

  2. יוצרים מודול 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",
    }
    
  3. כדי להגדיר את חבילת המארח של המכשיר הווירטואלי כך שתכלול את קובץ ההגדרות של הפעולה המותאמת אישית, צריך להגדיר משתני build של Soong config בקובץ ה-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

כל קובץ בינארי של מארח שרת פעולות צריך לבצע את השלבים הבאים:

  1. מקבלים מספר של מתאר קובץ של שקע כארגומנט הראשון והיחיד של התוכנית.

    הסוקט הזה נוצר על ידי launch_cvd באמצעות socketpair עם הדומיין AF_LOCAL, הסוג SOCK_STREAM והפרוטוקול 0.

  2. בלולאה, מנסים לקרוא 128 בייטים מהסוקט. הבייטים האלה מכילים אירועים של לחיצה על לחצן שנשלחים על ידי לקוח WebRTC בפורמט command:state. ‫command הוא הערך שמופיע בהגדרת ה-JSON, ו-state הוא מצב הלחיצה על הלחצן (down או up).

  3. מבצעים פעולה על האירועים הנכנסים כדי לדמות את הפעולה המותאמת אישית.