تتضمّن واجهة متصفّح WebRTC التلقائية في Cuttlefish لوحة تحكّم تتيح طرقًا أكثر للتفاعل مع الجهاز الافتراضي.
تتضمّن لوحة التحكّم أزرارًا تلقائية لمحاكاة الإجراءات الشائعة على الأجهزة الفعلية، مثل زر التشغيل أو أزرار مستوى الصوت، بالإضافة إلى تدوير الجهاز.
الإجراءات المخصّصة
يمكنك تخصيص لوحة التحكّم لإضافة المزيد من الأزرار التي تسمح لجهازك الافتراضي بمحاكاة جهازك الفعلي بشكلٍ أوثق. ويكون ذلك مفيدًا لاختبار الميزات الفريدة لجهازك، مثل زر الجهاز أو الإيماءة الخاصة التي تؤدي إلى إجراء فريد في نظام التشغيل. يمكنك أيضًا استخدام الأزرار المخصّصة لإتاحة اختبار ميزات أكثر تركيزًا على ضمان الجودة، مثل سلوك نظام التشغيل عندما يكون مستوى شحن البطارية منخفضًا.
تتضمّن لوحة التحكّم التلقائية في Cuttlefish إمكانية "توصيل" الإجراءات المخصّصة بدون الحاجة إلى تعديل مشروع Cuttlefish الرئيسي في AOSP. لا يحتاج جهازك الافتراضي إلا إلى ملف إعدادات بسيط لبدء استخدام الإجراءات المخصّصة. يمكنك الاطّلاع على مثال ملف إعدادات الإجراء المخصّص هذا .
أنشِئ ملف JSON يحدّد الإجراءات المخصّصة لجهازك. يمكنك وضع هذا الملف في أي دليل تملكه. يتم وصف بنية هذا الملف في قسمَي ADB shell وخادم الإجراءات.
أنشِئ وحدة
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", }اضبط متغيرات إنشاء إعدادات 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، ألحِق اسم وحدة خادم الإجراءات بمتغيّر إنشاء إعدادات 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).تفاعل مع الأحداث الواردة لمحاكاة الإجراء المخصّص.