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

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

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

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

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

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

  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 в make-файле продукта вашего устройства, чтобы настроить пакет хоста виртуального устройства для включения файла конфигурации настраиваемого действия.

    # 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. Воздействуйте на входящие события, чтобы имитировать пользовательское действие.