構建自己的雲模擬器

本文介紹如何將AAOS 模擬器作為 Web 服務運行並在 Web 瀏覽器中運行,以便使用者可以遠端存取。這樣做可以透過 Google Cloud Compute Engine提供端到端的、最低限度可行的參考。也就是說,您可以在您選擇的任何公有或私有雲平台上使用此服務。

目的

這種集中式配置和設定使整個公司、供應商和在家工作的開發人員都可以存取 AAOS 模擬器。這樣做可以更有效地管理 AAOS 模擬器並將其升級到新版本,並消除為個人使用者設定和管理本機電腦所需的時間。該解決方案優化了硬體資源的使用,並實現了更低成本的應用程式開發環境。例如,出於以下目的:

  • 使用者研究、使用者體驗審查、客戶支援和培訓。
  • 向潛在客戶和銷售管道進行演示。
  • 大規模測試、驗證甚至調試應用程式(包括日常 OEM HMI 建置)。將模擬器視為用於開發應用程式的測試平台的替代品。
  • OEM 客戶呼叫中心代理擁有統一、易於存取的 HU UI。

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

  • 使用設定腳本建立自訂的基於雲端的 AAOS 模擬器(雲端模擬器)。
  • 為 VM 實例建立自訂 AAOS 雲端模擬器映像:
    • 基於雲端的模擬器的準備就緒。
    • 公用 AAOS AVD 映像可供服務建立者使用指令啟動 AAOS AVD。例如,公開OEM AVD鏡像作為範例供合作夥伴適配和應用。

建築學

雲模擬器範例的架構如下圖所示。您的第一個最低限度可行的服務將透過新增您自己的 OEM AVD 映像來運作。

圖 1.雲端 AVD 架構

關鍵的模擬器構建塊是:

這裡
物品目的
安卓模擬器模擬器實例託管 AVD 映像
金魚-webrtc橋Linux 應用程式提供 React 應用程式和 AAOS 模擬器之間的通信
android-模擬器-webrtc React應用程式在 Web 瀏覽器中顯示模擬器 UI。 React 還捕獲用戶輸入事件並將其發送回伺服器。
Android 模擬器容器腳本用於管理和建立上述軟體模組的 Docker 映像和容器的 Python 腳本。
產生令牌來管理模擬器的存取權限。
開啟伺服器在客戶端和伺服器之間建立 WebRTC 直接連線。僅當模擬器服務在防火牆或代理程式後面運作時才需要 Turn 伺服器。
使者

代理服務:

  • 使用自簽名憑證提供 HTTPS。
  • 將連接埠 80 (http) 上的流量重新導向至連接埠 443 (https)。
  • 充當模擬器的 gRPC 代理。
  • 驗證令牌以允許存取模擬器 gRPC 端點。
  • 將其他請求重新導向到託管 React 應用程式的 Nginx 元件。

在雲端虛擬機器上設定模擬器

建立 GCP 專案:

  1. 前往 Google Cloud Console 並選擇一個項目
  2. 若要確認您的 Google Cloud 專案已啟用結算功能,請參閱啟用、停用或變更項目的結算功能
  3. 啟用 API

在GCE中建立Linux虛擬機

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. 開啟 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. 使用自訂鏡像建立虛擬機器實例

  1. 進入雲端控制台
  2. 選擇 GCP 項目。
  3. 前往導覽選單 > 計算引擎 > VM 實例。

    圖 1.建立 VM 實例

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

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

  1. 進入雲端控制台
  2. 選擇 GCP 項目。
  3. 前往導覽功能表 > 計算引擎 > 虛擬機器實例 > 設定防火牆規則。

在虛擬機器上安裝所需的軟體

  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 。確保您可以以非 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 模擬器容器。您可以在此處找到有關容器的詳細資訊。現在您可以運行這些容器而無需建置它們。例如:
    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 模擬器 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. 建立 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 服務!使用以下命令在網頁瀏覽器上存取它:

https://<VM_External__IP>

故障排除

如果 VM 外部 IP 發生連線錯誤,請確保 VM 設定為允許 HTTPHTTPS 流量。若要驗證這一點,請參閱執行基本 Apache Web 伺服器

設定輪次伺服器

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

注意:要使 Turn 伺服器在 Google Cloud 虛擬機器執行個體上執行,請務必將虛擬機器防火牆規則配置為允許 TCP 和 UDP 連接埠 3478 和 3479 上的流量。

  1. 安裝 coturn 伺服器:
    sudo apt install coturn
    systemctl stop coturn
    echo "TURNSERVER_ENABLED=1"|sudo tee -a /etc/default/coturn
    
  2. 透過新增以下行
    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
    
    修改/etc/turnserver.conf
  3. 修改 Docker Compose 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 模擬器服務。請務必將下面的轉彎伺服器 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