Панель управления каракатицей

Интерфейс браузера WebRTC по умолчанию для Cuttlefish включает панель управления, которая обеспечивает больше способов взаимодействия с виртуальным устройством.

На панели управления имеются стандартные кнопки для имитации обычных действий физического устройства, таких как кнопка питания или кнопки регулировки громкости, а также поворот устройства.

Пользовательские действия

Вы можете настроить панель управления, добавив дополнительные кнопки, которые позволят вашему виртуальному устройству более точно эмулировать физическое устройство. Это полезно для тестирования уникальных функций вашего устройства, таких как аппаратная кнопка или специальный жест, запускающий уникальное действие в ОС. Вы также можете использовать настраиваемые кнопки для тестирования функций, требующих повышенного контроля качества, например, поведения ОС при низком заряде батареи устройства.

Панель управления Cuttlefish по умолчанию поддерживает подключение пользовательских действий без необходимости изменения основного проекта Cuttlefish AOSP . Для использования пользовательских действий вашему виртуальному устройству достаточно минимального файла конфигурации. См. этот пример файла конфигурации пользовательских действий .

  1. Создайте JSON-файл, определяющий пользовательские действия вашего устройства. Вы можете разместить этот файл в любом каталоге, которым владеете. Структура этого файла описана в разделах «Оболочка ADB» и «Сервер действий» .

  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
  • Сервер действий

Файл конфигурации 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

Каждый двоичный файл хоста сервера действий должен выполнять следующие шаги:

  1. Принять номер дескриптора файла сокета как первый и единственный аргумент программы.

    Этот сокет создается launch_cvd с использованием socketpair с доменом AF_LOCAL , типом SOCK_STREAM и протоколом 0.

  2. В цикле пытаемся прочитать 128 байт из сокета. Эти байты содержат события нажатия кнопки, отправленные WebRTC-клиентом в формате command:state . command соответствует конфигурации JSON, а state — состояние нажатия кнопки ( down или up ).

  3. Обрабатывайте входящие события, имитируя пользовательское действие.