CLOUSD
注册账户
入门

安卓云模拟器与云手机

安卓云模拟器底层运行的是什么、你的应用在上面实际看到什么,以及如何在服务器上的模拟器、云手机和实体设备之间做选择。

搜索“安卓云模拟器”,你会发现同一个名字下有两种不同的产品。一种是Android Emulator,也就是Android Studio自带的那个模拟器,运行在你租的服务器或别人运营的服务器上。另一种是云手机:Android运行在数据中心里,配置成一款具体的手机型号,像一台设备一样为你保留。

如果只是快速看一眼应用,两者都行。但在测试、自动化和长时间运行的工作里,它们的表现不同,选错了会浪费时间。本文讲清底层运行的是什么、你的应用看到的是什么,以及各自在什么时候是合适的工具。

Android在服务器上运行的三种方式

Android Emulator。一个基于QEMU的虚拟机,虚拟硬件被Google称为goldfish,当前版本叫ranchu。它启动的是你在SDK Manager里下载的系统镜像。只有开启硬件虚拟化时它才快,在Linux服务器上就是KVM,所以在云虚拟机上运行它需要嵌套虚拟化或裸金属实例。没有加速时,它会退回到软件模拟,慢到无法交互使用。

Cuttlefish。Google为服务器而不是桌面打造的虚拟设备。它无界面运行,通过WebRTC把画面推送到浏览器,在Android平台测试中被大量使用。如果你要自建模拟器集群,它是更好的底座,但前提是你熟悉Linux主机和AOSP构建。

基于容器的Android。Android的用户空间运行在宿主机Linux内核上的容器里,这要求内核支持binder。Anbox、Waydroid和redroid等开源项目都是这样工作的,许多云手机服务也是如此,通常跑在ARM服务器上,arm64应用无需转译即可运行。每台手机不需要一整台虚拟机,所以这种方式能在一台服务器上跑很多台手机。

你的应用看到的是什么

在模拟器上运行三条命令,答案一目了然:

adb shell getprop ro.product.model
adb shell getprop ro.hardware
adb shell wm size

Google系统镜像返回的型号是sdk_gphone64_x86_64或sdk_gphone64_arm64之类,硬件是ranchu,屏幕尺寸则是AVD定义里设的值。测试你自己的逻辑没问题,但所有依赖设备类别的东西都会被掩盖:只在真实屏幕尺寸和密度下出现的布局问题、通过hasSystemFeature做的功能检测,以及根据芯片能力选择编解码器的媒体代码。

按真机型号打造的云手机报告的就是那款机型:名称、屏幕分辨率和密度、Android版本以及硬件描述。你的布局面对的是用户手里的屏幕,某款手机上报的问题,可以在同一款机型上复现。

有两点需要说清楚。第一,问清楚某个服务说的“真机型号”指什么:是机型的屏幕和硬件描述,还是带厂商定制界面的原厂固件。藏在厂商省电优化或桌面启动器里的问题需要那套固件,实际上也就意味着需要实体手机。第二,任何虚拟化Android的图形都是转译或软件渲染的,所以无论模拟器还是云手机,都无法告诉你应用在真实硬件上绘制得有多快。

架构同样重要。在x86_64模拟器镜像上,arm64原生库要通过转译层运行,Google从Android 11开始在镜像中内置了这一层。大多数应用都能用,但也会有一些出问题,主要是游戏和原生代码很重的应用。在ARM主机上,arm64镜像原生运行这些代码。

横向对比

本机上的模拟器云服务器上的模拟器云手机实体手机
呈现的设备通用的sdk_gphone通用的sdk_gphone你选的手机型号它自己
Android版本任意系统镜像任意系统镜像服务提供的版本手机上装的版本
arm64原生代码ARM主机上原生运行,x86上需转译取决于主机通常原生运行原生运行
会话之间的状态快照存在你的磁盘上需要你自己保存像手机一样保留保留
访问方式你的电脑SSH、VPN或自建的网页前端浏览器、API、ADB数据线或你的网络
模拟位置、电量、网络可以,通过模拟器控制台可以取决于服务不行,都是真实条件
配置与维护SDK和磁盘空间主机、KVM、镜像、更新无需维护购买、充电、更新
最适合改代码、跑起来的循环大规模CI真机型号QA、长期使用的手机、Agent摄像头、传感器、性能

如果你还在考虑安卓VPS,云手机、模拟器与安卓VPS对比从八个维度比较了这三者。

什么时候该用模拟器

凡是迭代速度和对条件的控制比设备类别更重要的地方,模拟器都更合适。

  • 改代码、跑起来的循环。调试器、布局检查器、Compose预览和即时部署,都默认你用本地模拟器或插着数据线的手机。
  • CI里的插桩测试。Gradle Managed Devices在构建文件里定义AVD,一个任务就能跑完测试,比如./gradlew pixel6api34DebugAndroidTest。在普通的CI主机上,无界面启动是这样的:
emulator -avd ci-api34 -no-window -no-audio -no-boot-anim -gpu swiftshader_indirect
adb wait-for-device
./gradlew connectedDebugAndroidTest
  • 模拟各种条件。模拟器控制台可以随时设置位置、电量和网络质量,这一点真手机和云手机都没这么方便:
adb emu geo fix 13.405 52.52
adb emu power capacity 5
adb emu network speed edge
  • 所有API级别,包括预览版。Google会在手机出货之前发布新版本的系统镜像。

什么时候该用云手机

当设备本身就是问题的一部分,或者手机需要比一次测试会话活得更久时,云手机更合适。

  • 真实机型。复现某款手机上报的问题,或者在用户实际使用的屏幕上检查布局。机型列表列出了可用的机型。
  • 持久保留的手机。测试账号保持登录,数据跨天保留,长时间观察应用行为,这是每个任务结束就丢弃的CI模拟器做不到的。
  • 无需安装。测试、设计或客服人员在浏览器里打开手机就行。想要插线体验的开发者用ADB。
  • AI Agent。Agent需要一台能在整个任务期间观察和操作的手机,这一用法见AI Agent页面。
  • 国家。应用在不同地区表现不同,手机可以从你需要的国家联网。

以Clousd为例,一台手机大约一分钟创建好,支持Android 12到17,从你选择的国家联网,时区和语言随之匹配,每轮之间可以重置到全新状态。

什么时候只能用实体手机

摄像头画质、传感器精度、图形和电池性能、发热表现、NFC和蓝牙,以及任何依赖厂商原厂固件的东西,都要留给真实硬件。基于硬件的认证也属于这一类:不要指望任何虚拟化的Android能做到。

免费的选择

搜“免费安卓云模拟器”,最后通常会落到三个地方之一。

  1. 你自己的电脑。Android Emulator免费,在任何一台较新的笔记本上都很快。对很多开发者来说这就是正确答案,根本不需要云。
  2. CI运行器。现在很多CI服务在Linux运行器上开放了KVM,所以模拟器可以在免费额度内加速运行,公开仓库尤其如此。查看你所用服务的文档;有些需要先修改/dev/kvm的权限。
  3. 托管手机的试用。想不装任何东西、在真实机型上快速看一眼应用,免费云手机试用给你30分钟,无需绑卡。

提醒一句:那些不用注册账号、让你直接上传APK的免费在线模拟器网站,等于把你的构建包交给了身份不明的一方。不要上传正式版构建包,更不要上传带有生产环境密钥的包。如果目标只是在浏览器里打开一个应用,选择一家你能确认身份的服务商提供的在线安卓模拟器更安全,浏览器里的安卓模拟器比较了各种选择。

继续阅读

全部指南

准备好启动
你的第一台云手机了吗?

免费试用30分钟

无需绑卡