Cuttlefish 제어판

Cuttlefish용 기본 WebRTC 브라우저 인터페이스에는 가상 기기와 상호작용할 다양한 방법을 제공하는 제어판이 포함됩니다.

제어판에는 기기 회전뿐만 아니라 일반적인 실제 기기 동작을 시뮬레이션하는 기본 버튼(예: 전원 버튼 또는 볼륨 버튼)이 있습니다.

맞춤 작업

제어판을 맞춤설정하여 가상 기기에서 실제 기기를 더 정확하게 에뮬레이션할 수 있는 버튼을 추가할 수 있습니다. 이 기능은 OS에서 고유한 동작을 트리거하는 하드웨어 버튼 또는 특수 동작과 같이 기기 고유의 기능을 테스트하는 데 유용합니다. 또한, 기기의 배터리가 부족할 때 맞춤 버튼을 사용하여 OS 동작과 같은 QA 중심의 기능 테스트를 더 많이 할 수 있습니다.

기본 Cuttlefish 제어판은 기본 Cuttlefish AOSP 프로젝트를 수정할 필요 없이 맞춤 작업을 '연결'할 수 있도록 지원합니다. 맞춤 작업을 사용하여 시작하려면 가상 기기에서 최소 구성 파일만 포함해야 합니다. 맞춤 작업 구성 파일의 예를 참고하세요.

  1. 기기의 맞춤 작업을 정의하는 JSON 파일을 만듭니다. 소유한 모든 디렉터리에 이 파일을 넣을 수 있습니다. 이 파일의 구조는 ADB 셸작업 서버 섹션에서 설명합니다.

  2. JSON 구성의 prebuilt_etc_host 모듈을 생성합니다. sub_dircvd_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. 기기의 제품 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: 다음과 같은 하위 필드가 있는 단일 버튼 객체입니다.
    • command: 이 버튼의 고유한 이름입니다.
    • title: 이 버튼의 대체 텍스트 제목입니다.
    • icon_name: https://material.io/resources/icons의 아이콘 이름입니다.

작업 서버

작업 서버를 사용하면 작업의 동작을 더 세부적으로 제어할 수 있습니다. 작업 서버는 소켓 쌍을 사용하여 WebRTC의 버튼 누르기 이벤트를 수신 대기하는 호스트 바이너리입니다. WebRTC에서 작업 서버로 이벤트를 전달하면 작업 서버에서 작업 구현 방법을 결정합니다.

작업 서버를 사용하면 상태 유지(예: 전환 가능 이벤트) 또는 '메타 작업' 실행(예: 현재 기기 종료, 더 많은 기기 실행 또는 화면 녹화 브라우저 확장 프로그램 시작)과 같은 더 강력한 제어가 가능합니다. 이러한 가능성은 호스트 바이너리 내에서 구현하려는 내용에 의해서만 제한됩니다.

다음 JSON 스니펫은 2개 버튼의 이벤트 수신을 대기하는 작업 서버를 정의합니다.

{
  "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. 수신된 이벤트에 맞게 작동하여 맞춤 작업을 시뮬레이션합니다.