Стандартный браузерный интерфейс WebRTC для Cuttlefish включает панель управления, которая предоставляет дополнительные возможности взаимодействия с виртуальным устройством.
На панели управления расположены стандартные кнопки, имитирующие распространенные физические действия устройства, такие как кнопка питания или кнопки регулировки громкости, а также поворот экрана.
Пользовательские действия
Вы можете настроить панель управления, добавив дополнительные кнопки, которые позволят вашему виртуальному устройству более точно эмулировать ваше физическое устройство. Это полезно для тестирования функций, уникальных для вашего устройства, таких как аппаратная кнопка или специальный жест, запускающий уникальное действие в операционной системе. Вы также можете использовать пользовательские кнопки для тестирования функций, более ориентированных на контроль качества, например, поведения вашей операционной системы при низком заряде батареи устройства.
В стандартной панели управления Cuttlefish предусмотрена поддержка "подключения" пользовательских действий без необходимости изменения основного проекта Cuttlefish AOSP . Для начала использования пользовательских действий вашему виртуальному устройству достаточно минимального файла конфигурации. См. пример файла конфигурации пользовательского действия .
Создайте JSON-файл, определяющий пользовательские действия вашего устройства. Вы можете разместить этот файл в любой директории, принадлежащей вам. Структура этого файла описана в разделах «Оболочка ADB» и «Сервер действий» .
Создайте модуль
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", }В файле makefile продукта вашего устройства укажите переменные сборки конфигурации Soong, чтобы настроить пакет хоста виртуального устройства таким образом, чтобы он включал ваш пользовательский файл конфигурации действий.
# 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
- Сервер действий
В вашем JSON-файле конфигурации можно определить несколько экземпляров каждого типа реализации.
Команда оболочки ADB
Вы можете определить одну кнопку, которая будет запущена с помощью одной команды 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).Для имитации пользовательского действия реагируйте на входящие события.