Интерфейс браузера 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", }Задайте переменные сборки конфигурации 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
- Сервер действий
Файл конфигурации 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).Обрабатывайте входящие события, имитируя пользовательское действие.