자체 클라우드 에뮬레이터 빌드

이 도움말에서는 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 이미지와 컨테이너를 관리하고 만듭니다.
JWT 서비스(JSON 웹 토큰 서비스) 토큰을 생성하여 에뮬레이터의 액세스 권한을 관리합니다.
Turn 서버 클라이언트와 서버 간의 WebRTC 직접 연결을 설정합니다. Turn 서버는 에뮬레이터 서비스가 방화벽이나 프록시 뒤에서 실행될 때만 필요합니다.
Envoy

다음 작업을 하는 프록시 서비스입니다.

  • 자체 서명 인증서를 사용하여 HTTPS를 제공합니다.
  • 포트 80(http)의 트래픽을 포트 443(https)으로 리디렉션합니다.
  • 에뮬레이터의 gRPC 프록시 역할을 합니다.
  • 에뮬레이터 gRPC 엔드포인트 액세스를 허용하는 토큰을 확인합니다.
  • 다른 요청을 React 애플리케이션을 호스팅하는 Nginx 구성요소로 리디렉션합니다.

클라우드 VM에서 에뮬레이터 설정

GCP 프로젝트를 만들려면 다음 안내를 따르세요.

  1. Google Cloud 콘솔로 이동하여 프로젝트를 선택합니다.
  2. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인하려면 프로젝트의 결제 사용 설정, 사용 중지, 변경을 참고합니다.
  3. API를 사용 설정합니다.

GCE에서 Linux VM 만들기

1. 중첩된 가상화 사용 설정

기본적으로 중첩된 가상화는 프로젝트, 폴더, 조직 수준에서 허용됩니다. 조직의 누군가가 중첩된 가상화를 사용 중지하지 않는 한 별도로 사용 설정할 필요는 없습니다.

  1. gcloud 명령줄 도구를 사용하여 중첩된 가상화가 허용되는지 확인합니다.
    gcloud beta resource-manager org-policies describe   \
      constraints/compute.disableNestedVirtualization  --effective --project=[PROJECT_ID]
    

2. Ubuntu-1804-lts 부팅 가능한 디스크 만들기

  1. Cloud 콘솔로 이동합니다.
  2. GCP 프로젝트를 선택합니다.
  3. 탐색 메뉴 > Compute Engine > 디스크 > 디스크 만들기로 이동합니다.
    1. 디스크 이름을 입력합니다. 예: ubuntu1804lts
    2. 리전과 영역을 선택합니다. 중첩된 가상화를 지원하려면 선택한 리전과 영역에서 Haswell 이상의 프로세서를 지원해야 합니다. 자세한 내용은 리전 및 영역을 참고하세요.
    3. ubuntu-1804-bionic-v20210211의 소스 이미지를 선택합니다.
    4. 적절한 디스크 크기를 설정합니다(100GB 이상이 권장됨).

그림 1. Ubuntu 부팅 가능한 디스크 만들기

3. 특수 라이선스 키로 맞춤 이미지를 만들어 VMX 사용 설정

  1. Cloud 콘솔로 이동합니다.
  2. 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 인스턴스 만들기

  1. Cloud 콘솔로 이동합니다.
  2. GCP 프로젝트를 선택합니다.
  3. 탐색 메뉴 > Compute Engine > VM 인스턴스로 이동합니다.

    그림 1. VM 인스턴스 만들기

  4. 인스턴스 이름을 입력합니다. 예: aaosemulator
  5. 원하는 시스템 제품군과 유형을 선택합니다. 시스템에 vCPU 4개와 메모리 16GB 이상이 포함되어 있는지 확인합니다.
  6. CPU 플랫폼을 Intel Cascade Lake 이상으로 선택합니다.
  7. 부팅 디스크를 이전 단계에서 만든 이미지로 변경합니다.
  8. 다음의 경우 방화벽을 사용 설정합니다.
    • HTTP 트래픽 허용
    • HTTPS 트래픽 허용

5. 포트 80과 443을 열도록 방화벽 구성

  1. Cloud 콘솔로 이동합니다.
  2. GCP 프로젝트를 선택합니다.
  3. 탐색 메뉴 > Compute Engine > VM 인스턴스 > 방화벽 규칙 설정으로 이동합니다.

VM에 필수 소프트웨어 설치

  1. Python 3와 Python3-env를 설치합니다.
    sudo apt update
    sudo apt install python3
    sudo apt-get install python3-venv
    
  2. 경로에서 사용할 수 있는 Android SDK와 ADB를 설치합니다.
    sudo apt install android-sdk
    

    Docker와 Docker-compose를 설치하려면 DockerDocker-compose를 참고하세요. 이를 루트가 아닌 사용자로 실행할 수 있는지 확인합니다.

  3. CPU가 하드웨어 가상화를 지원하는지 확인하려면 명령어 실행 결과가 0이 아닌 숫자여야 합니다.
    egrep -c '(vmx|svm)' /proc/cpuinfo
    
  4. 커널 가상 머신(KVM)을 설치합니다. KVM을 설치하려면 다음을 실행합니다.
    sudo apt-get install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils
    
  5. KVM이 작동하는지 확인하려면 다음을 실행합니다.
    sudo apt install cpu-checker
    kvm-ok
    
    출력은 다음과 같이 표시됩니다.
    INFO: /dev/kvm exists
    KVM acceleration can be used
    
  6. Node.js와 노드 패킷 관리자(NPM)를 설치하려면 다음을 실행합니다.
    sudo apt install nodejs npm
    

호스팅된 컨테이너 시작

  1. 설치를 확인하려면 공개 저장소에서 호스팅된 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
    

    이렇게 하면 컨테이너가 풀다운되고(로컬에서 사용할 수 없는 경우) 실행됩니다.

  2. 컨테이너가 실행될 때 로컬 호스트에서 AVD를 연결하는 것과 같은 방식으로 ADB를 구성하여 기기에 연결합니다. 예를 들면 다음과 같습니다.
    adb connect localhost:5555
    adb devices
    
    출력은 다음과 같이 표시됩니다.
    List of devices attached
    localhost:5555 device
    

AAOS 에뮬레이터 서비스 설정

에뮬레이터 서비스를 설정하려면 다음 안내를 따르세요.

  1. Android Emulator Docker 컨테이너 스크립트를 설치합니다.
    git clone https://github.com/google/android-emulator-container-scripts.git
    
    cd android-emulator-container-script
    source ./configure.sh
    
  2. 그러면 가상 환경이 활성화되고 실행 가능한 emu-docker가 제공됩니다. 사용에 관해 자세히 알아보려면 다음을 실행합니다.
    emu-docker -h
    
  3. Docker 컨테이너를 만들려면 라이선스 계약에 동의합니다.
  4. AAOS 에뮬레이터 Docker 컨테이너를 빌드합니다.
  5. 버전 7154743 이상의 에뮬레이터 빌드를 다운로드합니다. 예를 들면 다음과 같습니다.
    sdk-repo-linux-emulator-7154743.zip
    
  6. AAOS 에뮬레이터 시스템 이미지를 다운로드합니다. 예: sdk-repo-linux-system-images-7115454.zip
    emu-docker create <emulator-zip> <system-image-zip>
    
  7. 웹 컨테이너를 만들고 원격 액세스를 위한 사용자 이름과 비밀번호를 설정합니다.
    ./create_web_container.sh -p user1,passwd1
    
  8. 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 방화벽 규칙을 구성해야 합니다.

  1. coturn 서버를 설치합니다.
    sudo apt install coturn
    systemctl stop coturn
    echo "TURNSERVER_ENABLED=1"|sudo tee -a /etc/default/coturn
    
  2. 다음 줄을 추가하여 /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
    
  3. TURN 구성을 포함하도록 Docker Compose YAML 파일을 수정합니다.
    cd android-emulator-container-script
    nano  js/docker/docker-compose-build.yaml
    
  4. 에뮬레이터 섹션에 다음 두 환경 줄을 추가합니다.
         shm_size: 128M
         expose:
           - "8554"
    +    environment:
    +       - TURN=printf $SNIPPET
    
  5. 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