لوحة التحكّم في Cuttlefish

تتضمّن واجهة متصفّح WebRTC التلقائية في Cuttlefish لوحة تحكّم تتيح طرقًا أكثر للتفاعل مع الجهاز الافتراضي.

تتضمّن لوحة التحكّم أزرارًا تلقائية لمحاكاة الإجراءات الشائعة على الأجهزة الفعلية، مثل زر التشغيل أو أزرار مستوى الصوت، بالإضافة إلى تدوير الجهاز.

الإجراءات المخصّصة

يمكنك تخصيص لوحة التحكّم لإضافة المزيد من الأزرار التي تسمح لجهازك الافتراضي بمحاكاة جهازك الفعلي بشكلٍ أوثق. ويكون ذلك مفيدًا لاختبار الميزات الفريدة لجهازك، مثل زر الجهاز أو الإيماءة الخاصة التي تؤدي إلى إجراء فريد في نظام التشغيل. يمكنك أيضًا استخدام الأزرار المخصّصة لإتاحة اختبار ميزات أكثر تركيزًا على ضمان الجودة، مثل سلوك نظام التشغيل عندما يكون مستوى شحن البطارية منخفضًا.

تتضمّن لوحة التحكّم التلقائية في Cuttlefish إمكانية "توصيل" الإجراءات المخصّصة بدون الحاجة إلى تعديل مشروع Cuttlefish الرئيسي في AOSP. لا يحتاج جهازك الافتراضي إلا إلى ملف إعدادات بسيط لبدء استخدام الإجراءات المخصّصة. يمكنك الاطّلاع على مثال ملف إعدادات الإجراء المخصّص هذا .

  1. أنشِئ ملف JSON يحدّد الإجراءات المخصّصة لجهازك. يمكنك وضع هذا الملف في أي دليل تملكه. يتم وصف بنية هذا الملف في قسمَي ADB shell وخادم الإجراءات.

  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. اضبط متغيرات إنشاء إعدادات 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: عنصر زر واحد يتضمّن الحقول الفرعية التالية:

خادم الإجراءات

تسمح خوادم الإجراءات بالتحكّم بشكلٍ أكبر في سلوك إجراءاتك. خادم الإجراءات هو ملف ثنائي للمضيف يستمع إلى أحداث الضغط على الأزرار من 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، ألحِق اسم وحدة خادم الإجراءات بمتغيّر إنشاء إعدادات 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. تفاعل مع الأحداث الواردة لمحاكاة الإجراء المخصّص.