在真机型号上测试安卓应用
安卓兼容性测试:真机型号矩阵,无需自建机房
在真机型号上测试安卓应用,而且就是你的用户手里的那些机型:11个品牌的150+款机型,Android 12–17。每次运行前恢复到干净的快照,克隆出多台并行跑,每台手机都能通过ADB和API访问。
用户手里的那些手机。
不用自建机房的安卓真机测试平台:从平价的Galaxy A系列到今年的Pixel,每款机型都根据真机的完整信息采集打造,并在开放启动前与真机逐项对比。它不是模拟器:Android以该机型的配置原生运行在ARM服务器上。
在真实屏幕上看布局
分辨率、像素密度和显示特性都与真机屏幕一致,布局、截图和视觉检查都和真机对得上。
图形参数与出厂一致
GPU厂商和渲染器字符串、OpenGL和Vulkan版本都来自真实芯片组,你的应用看到的就是它预期的硬件。
内置Google Play
像真手机一样预装Google Play服务和Play商店,需要它们来登录、支付或更新的应用都能正常用。
每次运行都是一台干净的手机。
把手机调到测试需要的状态,拍个快照,每次运行前都恢复到这个状态。一台不够用,就从同一个快照克隆更多台。一次调用即可恢复到干净快照。
- 每次运行前恢复一次调用就把手机回滚到干净快照,每次运行都从同一状态开始。
- 克隆并行运行从同一个快照创建新手机,每台都有独立的设备身份,把测试套件拆到多台设备上跑。
- 每晚备份按计划每晚给手机拍快照;关机等待期间不收费。
需要深入底层时,用ADB。
每台手机都有独立的ADB中继。在你为指定IP、指定时长开启之前,它始终关闭;可能损坏设备的操作一律拒绝。
- 默认关闭,手动开启按手机单独开启,白名单最多20个IP或CIDR。
- 到期自动关闭默认24小时,最长7天;会话空闲30分钟后自动断开。
- 一次性登录码只显示一次;输错会锁定中继。每台手机最多3个会话,每个会话push和pull最多2 GiB。
- 危险服务一律拒绝root、remount、disable-verity、reverse、reboot、tcpip、usb、jdwp、sideload和restore始终被拒绝。每个会话都有日志。
# 1. open ADB on qa01 for your IP, 24 hours (dashboard or API) curl -X POST https://api.clousd.com/v1/devices/qa01/adb \ -H "Authorization: Bearer $CLOUSD_KEY" \ -H "Content-Type: application/json" \ -d '{"allow_ips":["203.0.113.7"],"ttl_hours":24}' # → connect command and a one-time code, shown once # 2. connect and sign in with the code adb connect $HOST:$PORT adb -s $HOST:$PORT shell clousd-login $CODE # 3. work as usual adb -s $HOST:$PORT install app-debug.apk adb -s $HOST:$PORT shell pm list packages | grep example adb -s $HOST:$PORT logcat -d | tail -n 50
接入CI。
测试运行需要的一切,都是https://api.clousd.com/v1上的一次REST调用。耗时操作会返回202和一个任务供你轮询,密钥可以限定到测试手机,并设为只读或控制权限。详见REST API与ADB中继和CI相关接口。
API=https://api.clousd.com/v1 AUTH="Authorization: Bearer $CLOUSD_KEY" # reset qa01 to its clean snapshot and wait for the job JOB=$(curl -s -X POST -H "$AUTH" \ $API/devices/qa01/snapshots/v20/restore | jq -r .job.id) until [ "$(curl -s -H "$AUTH" $API/jobs/$JOB | jq -r .job.state)" \ != running ]; do sleep 3; done # install this build and open it curl -s -H "$AUTH" -F apk=@app-release.apk $API/devices/qa01/apk curl -s -H "$AUTH" -H "Content-Type: application/json" \ -d '{"op":"open_app","package":"com.example.app"}' \ $API/devices/qa01/action # keep the evidence curl -s -H "$AUTH" $API/devices/qa01/screenshot -o after.png curl -s -H "$AUTH" $API/devices/qa01/logs > logcat.txt
# the same steps on four phones at once, 0–5 s apart curl -X POST https://api.clousd.com/v1/groups -H "$AUTH" \ -H "Content-Type: application/json" -d '{ "phones": ["qa01", "qa02", "qa03", "qa04"], "steps": [ {"op": "open_app", "package": "com.example.app"}, {"op": "wait", "seconds": 3}, {"op": "if_text", "text": "Sign in", "skip": 1}, {"op": "screenshot"} ], "stagger": [0, 5] }' # 202 → progress per phone in job.output
# a key created with a webhook URL receives signed events POST https://ci.example.com/clousd X-Clousd-Signature: 9f2c…e41a {"event": "job.finished", "ts": …, "phone": "qa01", "job": {…}} # events: job.finished · health.problem · health.resolved # signature: HMAC-SHA256 of the body · 3 delivery attempts
在不同国家测试你的应用。
给手机分配一个其他国家的出口,它的时区、语言、键盘、应用商店和SIM国家都会跟着变,你看到的应用就和当地用户看到的一样。坐在工位上就能实时看着测试运行。
你的网络变差时,画面会逐级降低画质;网络恢复后再升回来。Multi-view(多屏)同时显示多块屏幕,Sync(同步)把你的操作同步到选中的手机上。
应用测试常见问题
还有其他问题?请联系客服,通常一个工作日内由真人回复。
这是模拟器吗?
不是。Android以真机型号的配置原生运行在ARM服务器上,你的应用看到的是这款机型,而不是一台通用的模拟器设备。云手机与模拟器的区别
可以免费试用吗?
可以。你的第一台手机可免费运行30分钟,无需绑卡,也无需充值。之后按分钟计费,不按席位收费:手机运行时每分钟$0.004。
可以指定具体的Android版本吗?
可以,按手机单独选。机型库中每款机型都列出了今天能启动的版本,Android 12–17。Android 12–14为基础价;Android 15加价10%,Android 16和17加价25%。
两轮测试之间怎么重置手机?
在干净状态下拍一次快照,之后每轮运行前恢复这个快照。只需一次API调用,返回202和一个任务,在/v1/jobs/{id}轮询即可。
可以并行跑测试套件吗?
可以。从干净快照克隆出新手机,每台都有独立的设备身份,把套件拆到这些手机上跑;或者对整个分组执行同样的步骤,随机错开时间。
ADB会暴露在公网上吗?
不会。ADB默认关闭。你需要按手机单独开启,设置最多20个IP或CIDR的白名单和有效期(默认24小时,最长7天),用一次性验证码登录,每个会话都有日志。
可以安装我自己的APK吗?
可以:在控制台上传,发送到POST /v1/devices/{id}/apk,或者通过中继用adb install安装。
AI Agent能跑测试吗?
能,目前处于抢先体验阶段:Agent查看屏幕和界面元素,再通过observe和act调用点击、输入,每次运行都从干净快照开始。详见由Agent驱动的测试。
可以测试我的应用在其他国家的表现吗?
可以。给手机分配该国家的出口,它的时区、语言、键盘、应用商店和SIM国家都会跟着变。区域选离你的团队最近的,画面和ADB都会更流畅。