이 페이지에서는 AAOS 에뮬레이터를 웹 서비스로 실행하고 웹브라우저에서 실행하여 사용자가 원격으로 액세스할 수 있도록 하는 방법을 설명합니다. 이렇게 하면 Google Cloud Compute Engine을 통해 최소한으로 실행 가능한 엔드 투 엔드 참조가 제공됩니다. 그러나 이 서비스를 원하는 퍼블릭 또는 프라이빗 클라우드 플랫폼에서 사용해도 됩니다.
목적
이 중앙 집중식 구성과 설정을 통해 전체 회사와 공급업체, 재택근무 개발자가 AAOS 에뮬레이터에 액세스할 수 있습니다. 이렇게 하면 AAOS 에뮬레이터를 더 효율적으로 관리하고 새 버전으로 업그레이드할 수 있으며 개별 사용자의 로컬 시스템을 설정하고 관리하지 않아도 됩니다. 이 솔루션을 통해 하드웨어 리소스 사용이 최적화되고 앱 개발 환경 비용이 낮아질 수 있습니다. 다음과 같은 목적을 예로 들 수 있습니다.
- 사용자 연구, 사용자 환경 검토, 고객 지원, 교육
- 잠재고객 및 영업 채널 데모
- 앱(일일 OEM HMI 빌드 포함)의 대규모 테스트, 검증 및 디버그. 에뮬레이터가 앱 개발에 사용되는 테스트 벤치를 대체한다고 생각하세요.
- 동일하고 액세스하기 쉬운 HU UI를 사용하는 OEM 고객 콜센터 상담사
AAOS 에뮬레이터를 사용하면 다음과 같은 많은 이점이 있습니다.
- 설정 스크립트를 사용하여 맞춤설정된 클라우드 기반 AAOS 에뮬레이터(클라우드 에뮬레이터)를 만듭니다.
- VM 인스턴스용으로 맞춤설정된 AAOS 클라우드 에뮬레이터 이미지를 빌드합니다.
- 클라우드 기반 에뮬레이터 설정을 준비합니다.
- 서비스 제작자가 명령어로 AAOS AVD를 시작하는 데 공개 AAOS AVD 이미지를 사용할 수 있습니다. 예를 들어 공개 OEM AVD 이미지는 파트너가 조정하고 적용하는 샘플로 사용됩니다.
아키텍처
클라우드 에뮬레이터 아키텍처 예는 다음과 같습니다. 최소한으로 실행 가능한 첫 번째 서비스는 자체 OEM AVD 이미지를 추가하여 작동합니다.
그림 1. 클라우드 AVD 아키텍처
주요 에뮬레이터 구성요소는 다음과 같습니다.
여기항목 | 목적 |
---|---|
Android Emulator | 에뮬레이터 인스턴스가 AVD 이미지를 호스팅합니다. |
Goldfish-webrtc 브리지 | Linux 앱이 React 앱과 AAOS 에뮬레이터 간의 통신을 제공합니다. |
android-emulator-webrtc | React 앱이 웹브라우저에 에뮬레이터 UI를 표시합니다. React는 사용자 입력 이벤트도 캡처하여 서버로 다시 전송합니다. |
Android Emulator 컨테이너 스크립트 | Python 스크립트가 위 소프트웨어 모듈의 Docker 이미지와 컨테이너를 관리하고 만듭니다. |
토큰을 생성하여 에뮬레이터의 액세스 권한을 관리합니다. | |
Turn 서버 | 클라이언트와 서버 간의 WebRTC 직접 연결을 설정합니다. Turn 서버는 에뮬레이터 서비스가 방화벽이나 프록시 뒤에서 실행될 때만 필요합니다. |
Envoy | 다음 작업을 하는 프록시 서비스입니다.
|
클라우드 VM에서 에뮬레이터 설정
GCP 프로젝트를 만들려면 다음 안내를 따르세요.
- Google Cloud 콘솔로 이동하여 프로젝트를 선택합니다.
- Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인하려면 프로젝트의 결제 사용 설정, 사용 중지, 변경을 참고합니다.
- API를 사용 설정합니다.
GCE에서 Linux VM 만들기
1. 중첩된 가상화 사용 설정
기본적으로 중첩된 가상화는 프로젝트, 폴더, 조직 수준에서 허용됩니다. 조직의 누군가가 중첩된 가상화를 사용 중지하지 않는 한 별도로 사용 설정할 필요는 없습니다.
- gcloud 명령줄 도구를 사용하여 중첩된 가상화가 허용되는지 확인합니다.
gcloud beta resource-manager org-policies describe \ constraints/compute.disableNestedVirtualization --effective --project=[PROJECT_ID]
2. Ubuntu-1804-lts 부팅 가능한 디스크 만들기
- Cloud 콘솔로 이동합니다.
- GCP 프로젝트를 선택합니다.
- 탐색 메뉴로 이동하여 Compute Engine > 디스크 > 디스크 만들기를 선택합니다.
- 디스크 이름을 입력합니다. 예:
ubuntu1804lts
- 리전과 영역을 선택합니다. 중첩된 가상화를 지원하려면 선택한 리전과 영역에서 Haswell 이상의 프로세서를 지원해야 합니다. 자세한 내용은 리전 및 영역을 참고하세요.
ubuntu-1804-bionic-v20210211
의 소스 이미지를 선택합니다.- 적절한 디스크 크기를 설정합니다(100GB 이상이 권장됨).
- 디스크 이름을 입력합니다. 예:
그림 2. Ubuntu 부팅 가능한 디스크 만들기
3. 특수 라이선스 키로 맞춤 이미지를 만들어 VMX 사용 설정
- Cloud 콘솔로 이동합니다.
- Cloud Shell을 열고 다음 명령어를 사용합니다.
gcloud compute images create [IMAGE NAME] --source-disk-zone [DISK ZONE] --source-disk [DISK NAME] \ --licenses "https://www.googleapis.com/compute/v1/projects/vm-options/global/licenses/enable-vmx"
- 이미지 이름을 입력합니다. 예:
aaos-emulator-image
- 디스크 영역을 디스크를 만든 영역으로 설정합니다.
- 디스크 이름을 디스크를 만드는 데 사용한 이름으로 설정합니다.
예를 들면 다음과 같습니다.
gcloud compute images create aaos-emulator-image --source-disk-zone us-central1-a \ --source-disk ubuntu1804lts \ --licenses \ "https://www.googleapis.com/compute/v1/projects/vm-options/global/licenses/enable-vmx"
- 이미지 이름을 입력합니다. 예:
자세한 내용은 중첩된 가상화 VM 인스턴스를 참고하세요.
4. 맞춤설정된 이미지를 사용하여 VM 인스턴스 만들기
- Cloud 콘솔로 이동합니다.
- GCP 프로젝트를 선택합니다.
- 탐색 메뉴 > Compute Engine > VM 인스턴스로 이동합니다.
그림 3. VM 인스턴스 만들기
- 인스턴스 이름을 입력합니다. 예:
aaosemulator
- 원하는 시스템 제품군과 유형을 선택합니다. 시스템에 vCPU 4개와 메모리 16GB 이상이 포함되어 있는지 확인합니다.
- CPU 플랫폼을 Intel Cascade Lake 이상으로 선택합니다.
- 부팅 디스크를 이전 단계에서 만든 이미지로 변경합니다.
- 다음의 경우 방화벽을 사용 설정합니다.
- HTTP 트래픽 허용
- HTTPS 트래픽 허용
5. 포트 80과 443을 열도록 방화벽 구성
- Cloud 콘솔로 이동합니다.
- GCP 프로젝트를 선택합니다.
- 탐색 메뉴 > Compute Engine > VM 인스턴스 > 방화벽 규칙 설정으로 이동합니다.
VM에 필수 소프트웨어 설치
- Python 3와 Python3-env를 설치합니다.
sudo apt update sudo apt install python3 sudo apt-get install python3-venv
- 경로에서 사용할 수 있는 Android SDK와 ADB를 설치합니다.
sudo apt install android-sdk
Docker와 Docker-compose를 설치하려면 Docker와 Docker-compose를 참고하세요. 이를 루트가 아닌 사용자로 실행할 수 있는지 확인합니다.
- CPU가 하드웨어 가상화를 지원하는지 확인하려면 명령어 실행 결과가 0이 아닌 숫자여야 합니다.
egrep -c '(vmx|svm)' /proc/cpuinfo
- 커널 가상 머신(KVM)을 설치합니다. KVM을 설치하려면 다음을 실행합니다.
sudo apt-get install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils
- KVM이 작동하는지 확인하려면 다음을 실행합니다.
sudo apt install cpu-checker kvm-ok
출력은 다음과 같습니다.INFO: /dev/kvm exists KVM acceleration can be used
- Node.js와 노드 패킷 관리자(NPM)를 설치하려면 다음을 실행합니다.
sudo apt install nodejs npm
호스팅된 컨테이너 시작
- 설치를 확인하려면 공개 저장소에서 호스팅된 Android Emulator 컨테이너를 실행합니다. 컨테이너에 관한 자세한 내용은 여기를 참고하세요.
이제 이러한 컨테이너를 빌드하지 않고 실행할 수 있습니다. 예:
docker run \ -e ADBKEY="$(cat ~/.android/adbkey)" \ --device /dev/kvm \ --publish 8554:8554/tcp \ --publish 5555:5555/tcp \ us-docker.pkg.dev/android-emulator-268719/images/30-google-x64:30.1.2
이렇게 하면 컨테이너가 풀다운되고(로컬에서 사용할 수 없는 경우) 실행됩니다.
- 컨테이너가 실행될 때 로컬 호스트에서 AVD를 연결하는 것과 같은 방식으로 ADB를 구성하여 기기에 연결합니다. 예를 들면 다음과 같습니다.
adb connect localhost:5555 adb devices
출력은 다음과 같습니다.List of devices attached localhost:5555 device
AAOS 에뮬레이터 서비스 설정
에뮬레이터 서비스를 설정하려면 다음 안내를 따르세요.
- Android Emulator Docker 컨테이너 스크립트를 설치합니다.
git clone https://github.com/google/android-emulator-container-scripts.git
cd android-emulator-container-script source ./configure.sh
- 그러면 가상 환경이 활성화되고 실행 가능한 emu-docker가 제공됩니다.
사용에 관해 자세히 알아보려면 다음을 실행합니다.
emu-docker -h
- Docker 컨테이너를 만들려면 라이선스 계약에 동의합니다.
- AAOS 에뮬레이터 Docker 컨테이너를 빌드합니다.
- 버전 7154743 이상의 에뮬레이터 빌드를 다운로드합니다. 예를 들면 다음과 같습니다.
sdk-repo-linux-emulator-7154743.zip
- AAOS 에뮬레이터 시스템 이미지를 다운로드합니다. 예를 들면 다음과 같습니다.
sdk-repo-linux-system-images-7115454.zip
emu-docker create <emulator-zip> <system-image-zip>
- 웹 컨테이너를 만들고 원격 액세스를 위한 사용자 이름과 비밀번호를 설정합니다.
./create_web_container.sh -p user1,passwd1
- AAOS 에뮬레이터 웹 서비스를 시작합니다.
docker-compose -f js/docker/docker-compose-build.yaml -f js/docker/development.yaml up
AAOS 에뮬레이터 웹 서비스를 성공적으로 시작했습니다. 다음을 사용하여 웹브라우저에서 액세스합니다.
https://<VM_External__IP>
문제 해결
VM 외부 IP 연결 오류가 발생하면 VM이 HTTP 및 HTTPS 트래픽을 모두 허용하도록 설정되어 있는지 확인합니다. 이를 검증하려면 기본 Apache 웹 서버 실행을 참고하세요.
Turn 서버 설정
언제든지 자체 Turn 서버를 사용할 수 있습니다. 다음은 Google Cloud VM 인스턴스에 관한 샘플입니다.
참고: Turn 서버를 Google Cloud VM 인스턴스에서 작동시키려면 TCP 및 UDP 포트 3478과 3479에서 트래픽을 허용하도록 VM 방화벽 규칙을 구성해야 합니다.
- coturn 서버를 설치합니다.
sudo apt install coturn systemctl stop coturn echo "TURNSERVER_ENABLED=1"|sudo tee -a /etc/default/coturn
- 다음 줄을 추가하여
/etc/turnserver.conf
를 수정합니다.lt-cred-mech #set your realm name realm=test #coturn username and password user=test:test123 # external-ip=<VM-Public-IP>/<VM-Private-IP> external-ip=34.193.52.134/10.128.0.2 systemctl start coturn
- TURN 구성을 포함하도록 Docker Compose YAML 파일을 수정합니다.
cd android-emulator-container-script nano js/docker/docker-compose-build.yaml
- 에뮬레이터 섹션에 다음 두 환경 줄을 추가합니다.
shm_size: 128M expose: - "8554" + environment: + - TURN=printf $SNIPPET
- Turn 구성으로 AAOS 에뮬레이터 서비스를 다시 시작합니다.
다음 Turn 서버 IP, 사용자 이름, 사용자 인증 정보를 자체 값으로 바꿔야 합니다.
export SNIPPET="{\"iceServers\":[{\"urls\":\"turn:35.193.52.134:3478\",\"username\":\"test\",\"credential\":\"test123\"}]}" docker-compose -f js/docker/docker-compose-build.yaml up