構建您自己的雲模擬器

本文介紹如何運行模擬器AAOS作為Web服務並運行它在Web瀏覽器,使其遠程用戶訪問。這樣做提供通過谷歌雲計算的端至端,微創可行的參考計算引擎。也就是說,您可以在您選擇的任何公共或私有云平台上使用此服務。

目的

這種集中配置和設置使整個公司、供應商和在家工作的開發人員都可以訪問 AAOS 仿真器。這樣做可以更有效地管理和升級 AAOS Emulator 到新版本,並消除為單個用戶設置和管理本地計算機所需的時間。該解決方案優化了硬件資源的使用,並實現了成本更低的應用程序開發環境。例如,出於以下目的:

  • 用戶研究、用戶體驗審查、客戶支持和培訓。
  • 向潛在客戶和銷售渠道進行演示。
  • 大規模測試、驗證甚至調試應用程序(包括每日 OEM HMI 構建)。將模擬器視為用於開發應用程序的測試台的替代品。
  • OEM 客戶呼叫中心座席擁有統一、易於訪問的 HU UI。

使用 AAOS 模擬器的好處有很多:

  • 使用設置腳本創建自定義和基於雲的 AAOS 模擬器(雲模擬器)。
  • 為 VM 實例構建定制的 AAOS Cloud Emulator 映像:
    • 準備好基於雲的模擬器的設置。
    • 公共 AAOS AVD 映像可供服務創建者使用命令啟動 AAOS AVD。例如,將公開的 OEM AVD 圖像作為樣本供合作夥伴進行適配和應用。

建築學

雲模擬器示例的架構如下圖所示。您的第一個最小可行服務將通過添加您自己的 OEM AVD 圖像來工作。

圖1.雲AVD架構

關鍵的模擬器構建塊是:

物品目的
安卓模擬器模擬器實例託管 AVD 圖像
Goldfish-webrtc 網橋Linux 應用程序提供 react 應用程序和 AAOS 模擬器之間的通信
安卓模擬器-webrtc反應應用在Web瀏覽器中顯示的模擬器UI。 React 還捕獲用戶輸入事件並將它們發送回服務器。
Android 模擬器容器腳本用於管理和創建上述軟件模塊的 Docker 映像和容器的 Python 腳本。
JWT 服務(JSON Web Token 服務)生成令牌以管理模擬器的訪問權限。
轉服務器在客戶端和服務器之間建立 WebRTC 直接連接。僅當 Emulator 服務在防火牆或代理後運行時才需要 Turn server。
使者

代理服務:

  • 使用自簽名證書提供 HTTPS。
  • 將端口 80 (http) 上的流量重定向到端口 443 (https)。
  • 充當模擬器的 gRPC 代理。
  • 驗證令牌以允許訪問模擬器 gRPC 端點。
  • 將其他請求重定向到託管 React 應用程序的 Nginx 組件。

在雲 VM 上設置模擬器

要創建 GCP 項目:

  1. 轉至谷歌雲端控制台並選擇一個項目
  2. 要確認結算為您的谷歌雲項目啟用,請啟用,為項目禁用或更改計費
  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. 轉到雲端控制台
  2. 選擇 GCP 項目。
  3. 轉到導航菜單 > 計算引擎 > 磁盤 > 創建磁盤。
    1. 提供磁盤名稱。例如, ubuntu1804lts
    2. 選擇區域和區域。要支持嵌套虛擬化,請確保您選擇的區域和區域支持 Haswell(或更高版本)處理器。要了解更多信息,請參閱地區和區域
    3. 選擇的源圖像ubuntu-1804-bionic-v20210211
    4. 設置適當的磁盤大小(推薦 100GB 或更大)。

圖1.創建Ubuntu的啟動盤

3. 使用特殊許可證密鑰創建自定義映像以啟用 VMX

  1. 轉至雲端控制台
  2. 打開雲殼牌和使用下面的命令:
    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. 使用自定義鏡像創建虛擬機實例

  1. 轉到雲端控制台
  2. 選擇 GCP 項目。
  3. 轉到導航菜單 > 計算引擎 > 虛擬機實例。

    圖1.創建一個VM實例

  4. 輸入實例名稱。例如, aaosemulator
  5. 選擇所需的機器系列和類型。確保機器包含四個 vCPU 和 16 GB 內存(或更多)。
  6. 選擇 CPU 平台為 Intel Cascade Lake(或更高版本)。
  7. 將啟動盤更改為上一步中創建的映像。
  8. 啟用防火牆:
    • 允許 HTTP 流量
    • 允許 HTTPS 流量

5.配置防火牆開放80和443端口

  1. 轉到雲端控制台
  2. 選擇 GCP 項目。
  3. 轉到導航菜單 > 計算引擎 > 虛擬機實例 > 設置防火牆規則。

在 VM 上安裝所需的軟件

  1. 安裝Python 3和Python3-ENV:
    sudo apt update
    sudo apt install python3
    sudo apt-get install python3-venv
    
  2. 安裝的Android SDK和亞行的道路上使用。
    sudo apt install android-sdk
    

    要安裝泊塢窗和多克-撰寫,見碼頭工人碼頭工人,撰寫。確保你能為運行這些非root用戶

  3. 為了確認CPU支持硬件虛擬化(命令應導致非零數):
    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. 啟動容器後,通過配置 ADB 連接到設備,方法與連接本地主機上的 AVD 相同。例如:
    adb connect localhost:5555
    adb devices
    
    輸出應為:
    List of devices attached
    localhost:5555 device
    

設置 AAOS 模擬器服務

要設置模擬器服務:

  1. 安裝Android模擬器多克爾容器腳本:
    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. 創建 Web 容器並設置遠程訪問的用戶名和密碼。
    ./create_web_container.sh -p user1,passwd1
    
  8. 啟動AAOS模擬器Web服務:
    docker-compose -f js/docker/docker-compose-build.yaml -f js/docker/development.yaml up
    

您已成功啟動 AAOS 模擬器 Web 服務!使用以下命令在 Web 瀏覽器上訪問它:

https://<VM_External__IP>

故障排除

如果出現連接錯誤到VM的外部IP,確保虛擬機設置為允許HTTPHTTPS流量。為了驗證這一點,請參閱運行一個基本的Apache Web服務器

設置轉彎服務器

您始終可以使用自己的回合服務器。下面提供的是 Google Cloud VM 實例上的示例。

注意:如果要對谷歌的雲虛擬機實例的服務器輪流工作,確保虛擬機配置防火牆規則,以允許TCP和UDP端口3478和3479的流量。

  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. 修改多克爾撰寫YAML文件,包括TURN配置:
    cd android-emulator-container-script
    nano  js/docker/docker-compose-build.yaml
    
  4. 添加以下兩行環境在模擬器部分:
         shm_size: 128M
         expose:
           - "8554"
    +    environment:
    +       - TURN=printf $SNIPPET
    
  5. 使用輪次配置重新啟動 AAOS Emulator 服務。一定要更換轉向服務器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