构建您自己的云模拟器

本页介绍了如何将 AAOS 模拟器 作为 Web 服务运行,并在 Web 浏览器中运行,以使其可供用户远程访问。这样做提供了一个端到端、最低限度可行的参考,通过 Google Cloud Compute Engine 实现。也就是说,您可以在您选择的任何公共或私有云平台上使用此服务。

目的

这种集中式配置和设置使整个公司、供应商和在家办公的开发者都可以访问 AAOS 模拟器。这样做可以更高效地管理 AAOS 模拟器并将其升级到新版本,并省去了为各个用户设置和管理本地机器所需的时间。此解决方案优化了硬件资源的使用,并实现了更低成本的应用开发环境。例如,出于以下目的:

  • 用户研究、用户体验审核、客户支持和培训。
  • 向潜在客户和销售渠道进行演示。
  • 大规模测试、验证甚至调试应用(包括每日 OEM HMI 构建)。可以将模拟器视为用于开发应用的测试台的替代品。
  • OEM 客户呼叫中心客服拥有统一、易于访问的 HU 界面。

使用 AAOS 模拟器的好处有很多:

  • 使用设置脚本创建自定义的基于云的 AAOS 模拟器(云模拟器)。
  • 为 VM 实例构建自定义的 AAOS 云模拟器映像
    • 云端模拟器的就绪设置。
    • 服务创建者可以使用公共 AAOS AVD 映像,通过命令启动 AAOS AVD。例如,公共 OEM AVD 映像作为合作伙伴调整和应用的示例。

架构

下图说明了云模拟器示例的架构。您的第一个最低限度可行的服务将通过添加您自己的 OEM AVD 映像来工作。

图 1. 云 AVD 架构。

关键的模拟器构建块包括:

此处.
目的
Android 模拟器 模拟器实例托管 AVD 映像
Goldfish-webrtc 桥 Linux 应用,用于在 React 应用和 AAOS 模拟器之间提供通信
android-emulator-webrtc React 应用,用于在 Web 浏览器中显示模拟器界面。React 还会捕获用户输入事件并将它们发送回服务器。
Android 模拟器容器脚本 Python 脚本,用于管理和创建上述软件模块的 Docker 映像和容器。
生成令牌以管理模拟器的访问权限。
Turn 服务器 在客户端和服务器之间建立 WebRTC 直接连接。仅当模拟器服务在防火墙或代理后运行时才需要 Turn 服务器。
Envoy

一个代理服务,用于:

  • 使用自签名证书提供 HTTPS。
  • 将端口 80 (http) 上的流量重定向到端口 443 (https)。
  • 充当模拟器的 gRPC 代理。
  • 验证令牌以允许访问模拟器 gRPC 端点。
  • 将其他请求重定向到托管 React 应用的 Nginx 组件。

在云 VM 上设置模拟器

要创建 GCP 项目:

  1. 转到 Google Cloud Console 并选择一个项目
  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 Console
  2. 选择 GCP 项目。
  3. 转到导航菜单,然后选择Compute Engine > 磁盘 > 创建磁盘
    1. 提供磁盘名称。例如,ubuntu1804lts
    2. 选择区域和可用区。要支持嵌套虚拟化,请确保您选择的区域和可用区支持 Haswell(或更高版本)处理器。要了解详情,请参阅区域和可用区
    3. 选择 ubuntu-1804-bionic-v20210211 的来源映像
    4. 设置适当的磁盘大小(建议 100GB 或更大)。

图 2. 创建 Ubuntu 可启动磁盘。

3. 创建带有特殊许可密钥的自定义映像以启用 VMX

  1. 转到 Cloud Console
  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 Console
  2. 选择 GCP 项目。
  3. 转到导航菜单 > Compute Engine > VM 实例。

    图 3. 创建 VM 实例。

  4. 输入实例名称。例如,aaosemulator
  5. 选择所需的机器系列和类型。确保机器包含四个 vCPU 和 16 GB 内存(或更多)。
  6. 选择 CPU 平台为 Intel Cascade Lake(或更高版本)。
  7. 将启动磁盘更改为在上一步中创建的映像。
  8. 为以下项启用防火墙:
    • 允许 HTTP 流量
    • 允许 HTTPS 流量

5. 配置防火墙以打开端口 80 和 443

  1. 转到 Cloud Console
  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。确保您可以作为非 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 和 Node 包管理器 (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 服务!使用以下地址在 Web 浏览器上访问它:

https://<VM_External__IP>

问题排查

如果发生与 VM 外部 IP 的连接错误,请确保将 VM 设置为允许 HTTP HTTPS 流量。要验证这一点,请参阅运行基本的 Apache Web 服务器

设置 Turn 服务器

您可以随时使用自己的 Turn 服务器。下面是在 Google Cloud VM 实例上的示例。

注意:为了使 Turn 服务器在 Google Cloud VM 实例上工作,请务必配置 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. 修改 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. 使用 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