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

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

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

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

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

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

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

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