本页介绍了如何将 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 | 一个代理服务,用于:
|
在云 VM 上设置模拟器
要创建 GCP 项目:
- 转到 Google Cloud Console 并选择一个项目。
- 要确认您的 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 Console。
- 选择 GCP 项目。
- 转到导航菜单,然后选择Compute Engine > 磁盘 > 创建磁盘。
- 提供磁盘名称。例如,
ubuntu1804lts
- 选择区域和可用区。要支持嵌套虚拟化,请确保您选择的区域和可用区支持 Haswell(或更高版本)处理器。要了解详情,请参阅区域和可用区。
- 选择
ubuntu-1804-bionic-v20210211
的来源映像 - 设置适当的磁盘大小(建议 100GB 或更大)。
- 提供磁盘名称。例如,
图 2. 创建 Ubuntu 可启动磁盘。
3. 创建带有特殊许可密钥的自定义映像以启用 VMX
- 转到 Cloud Console。
- 打开 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 Console。
- 选择 GCP 项目。
- 转到导航菜单 > Compute Engine > VM 实例。
图 3. 创建 VM 实例。
- 输入实例名称。例如,
aaosemulator
- 选择所需的机器系列和类型。确保机器包含四个 vCPU 和 16 GB 内存(或更多)。
- 选择 CPU 平台为 Intel Cascade Lake(或更高版本)。
- 将启动磁盘更改为在上一步中创建的映像。
- 为以下项启用防火墙:
- 允许 HTTP 流量
- 允许 HTTPS 流量
5. 配置防火墙以打开端口 80 和 443
- 转到 Cloud Console。
- 选择 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。确保您可以作为非 root 用户运行这些程序。
- 要确认 CPU 支持硬件虚拟化(该命令应产生一个非零数字):
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 和 Node 包管理器 (NPM):
sudo apt install nodejs npm
启动托管容器
- 要验证安装,请从公共仓库运行托管的 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
这会拉取容器(如果本地不可用)并启动它。
- 启动容器后,通过配置 ADB(方式与连接本地主机上的 AVD 相同)连接到设备。例如:
输出应为:adb connect localhost:5555 adb devices
List of devices attached localhost:5555 device
设置 AAOS 模拟器服务
要设置模拟器服务:
- 安装 Android 模拟器 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>
- 创建 Web 容器并设置用于远程访问的用户名和密码。
./create_web_container.sh -p user1,passwd1
- 启动 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 上的流量。
- 安装 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
- 修改 Docker Compose YAML 文件以包含 TURN 配置
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