Cuttlefish용 기본 WebRTC 브라우저 인터페이스에는 가상 기기와 상호작용할 다양한 방법을 제공하는 제어판이 포함됩니다.
제어판에는 기기 회전뿐만 아니라 일반적인 실제 기기 동작을 시뮬레이션하는 기본 버튼(예: 전원 버튼 또는 볼륨 버튼)이 있습니다.
맞춤 작업
제어판을 맞춤설정하여 가상 기기에서 실제 기기를 더 정확하게 에뮬레이션할 수 있는 버튼을 추가할 수 있습니다. 이 기능은 OS에서 고유한 동작을 트리거하는 하드웨어 버튼 또는 특수 동작과 같이 기기 고유의 기능을 테스트하는 데 유용합니다. 또한, 기기의 배터리가 부족할 때 맞춤 버튼을 사용하여 OS 동작과 같은 QA 중심의 기능 테스트를 더 많이 할 수 있습니다.
기본 Cuttlefish 제어판은 기본 Cuttlefish AOSP 프로젝트를 수정할 필요 없이 맞춤 작업을 '연결'할 수 있도록 지원합니다. 맞춤 작업을 사용하여 시작하려면 가상 기기에서 최소 구성 파일만 포함해야 합니다. 맞춤 작업 구성 파일의 예를 참고하세요.
기기의 맞춤 작업을 정의하는 JSON 파일을 만듭니다. 소유한 모든 디렉터리에 이 파일을 넣을 수 있습니다. 이 파일의 구조는 ADB 셸 및 작업 서버 섹션에서 설명합니다.
JSON 구성의
prebuilt_etc_host
모듈을 생성합니다.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", }
기기의 제품 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
각 작업 서버 호스트 바이너리는 다음 단계를 실행해야 합니다.
첫 번째이자 유일한 프로그램 인수로 소켓 파일 설명자 번호를 허용합니다.
이 소켓은 도메인은
AF_LOCAL
, 유형은SOCK_STREAM
, 프로토콜은 0으로 하는socketpair
를 사용하여launch_cvd
에서 생성합니다.루프에서 소켓의 128바이트 읽기를 시도합니다. 이러한 바이트에는 WebRTC 클라이언트에서 전송한 버튼 누르기 이벤트가 포함되며, 형식은
command:state
입니다.command
는 JSON 구성에서 제공하는 것과 동일하며state
는 버튼 누름 상태(down
또는up
)입니다.수신된 이벤트에 맞게 작동하여 맞춤 작업을 시뮬레이션합니다.