오징어 제어판

Cuttlefish의 기본 WebRTC 브라우저 인터페이스에는 가상 장치와 상호 작용할 수 있는 더 많은 방법을 지원하는 제어판이 포함되어 있습니다.

제어판에는 전원 버튼이나 볼륨 버튼, 장치 회전과 같은 일반적인 물리적 장치 동작을 시뮬레이션하는 기본 버튼이 있습니다.

사용자 지정 작업

가상 장치가 물리적 장치를 보다 밀접하게 에뮬레이트할 수 있도록 하는 버튼을 더 추가하도록 제어판을 사용자 정의할 수 있습니다. 이는 OS에서 고유한 작업을 트리거하는 하드웨어 버튼 또는 특수 제스처와 같은 장치 고유의 기능을 테스트하는 데 유용합니다. 또한 사용자 지정 버튼을 사용하여 기기의 배터리가 부족할 때 OS의 동작과 같은 QA 중심 기능을 테스트할 수 있습니다.

기본 Cuttlefish 제어판에는 기본 Cuttlefish AOSP 프로젝트를 수정할 필요 없이 사용자 지정 작업을 "플러그인"하는 지원이 포함되어 있습니다. 사용자 지정 작업을 사용하려면 가상 장치에 최소한의 구성 파일만 포함하면 됩니다. 이 예제 사용자 지정 작업 구성 파일을 참조하십시오.

  1. 장치의 사용자 지정 작업을 정의하는 JSON 파일을 만듭니다. 이 파일을 소유한 모든 디렉토리에 넣을 수 있습니다. 이 파일의 구조는 ADB 셸작업 서버 섹션에 설명되어 있습니다.

  2. JSON 구성을 위한 prebuilt_etc_host 모듈을 만듭니다. cvd_custom_action_configsub_dir 와 같은지 확인하십시오.

    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. 장치의 제품 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 : 다음 하위 필드가 있는 단일 버튼 개체:

액션 서버

액션 서버를 사용하면 액션의 동작을 더 잘 제어할 수 있습니다. 액션 서버는 소켓 쌍을 사용하여 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. 첫 번째이자 유일한 프로그램 인수로 소켓 파일 설명자 번호를 수락합니다.

    이 소켓은 도메인 AF_LOCAL , 유형 SOCK_STREAM 및 프로토콜 0이 있는 socketpair 를 사용하여 launch_cvd 에 의해 생성됩니다.

  2. 루프에서 소켓에서 128바이트 읽기를 시도합니다. 이 바이트에는 WebRTC 클라이언트가 command:state 형식으로 보낸 버튼 누르기 이벤트가 포함되어 있습니다. command 은 JSON 구성에 제공된 대로이고 state 는 버튼 누름 상태( down 또는 up )입니다.

  3. 들어오는 이벤트에 대해 조치를 취하여 사용자 지정 작업을 시뮬레이션합니다.