
“2024 年,Google 将 ADB 暴露列为十大云原生安全风险之一;同年,某头部社交 App 因公网开放 5555 端口,3 小时被植入挖矿木马,测试集群直接变‘矿场’。”
——The Stack 年度安全报告
当 Jenkins 的构建红灯一次次亮起,测试同学把咖啡当水喝,CTO 在群里@全员:“谁能把 Android 自动化测试从 3 天压缩到 1 天,团建预算翻倍。” 这篇文章,给你一个可落地的答案:用星界云手机的 ADB 白名单连接,把云真机无缝接入 CI/CD,让流水线像打手游一样丝滑。
1. 企业场景:Jenkins+ADB 批量操控的刚需
敏捷迭代越来越快,每周一次大版本已成常态。传统做法里,测试部要:
- 借 30 台实体机,插线、ROOT、装包、调环境;
- 用开源框架挨个跑 Monkey、遍历 UI、截图比对;
- 崩溃日志导回电脑,人工归因,平均定位 1 个 BUG 需 45 分钟。
一旦设备被同事“顺手”升级系统,脚本全崩。
痛点总结:设备碎片化、借还流程、 ROOT 不稳定、USB 掉线、公网 ADB 高危。
2. 安全陷阱:公网暴露 ADB=瞬间被挖矿
ADB 默认 5555 端口没有任何加密,明文传输 Shell 命令。Shodan 上随时能搜到几十万台开放在公网的手机、盒子、开发板。攻击者只需三行代码即可植入挖矿程序,CPU 飙到 100%,测试任务全卡死。
更糟的是,部分云平台为了“开箱即用”,把 ADB 直接映射到公网,用户侧零配置,却留下巨大隐患。企业安全合规一票否决,测试再快也上不了生产。
3. 星界方案:IP 白名单+密钥校验,30 秒接入
星界云手机在云端复刻了完整的 Android 系统,所有机型默认关闭 ADB;需要使用时,控制台一键开启,并强制填写IP 白名单。
- 仅允许白名单内的公网 IP 访问 5555,拒绝其他所有连接;
- 传输仍走 ADB 官方协议,无需额外 VPN,Jenkins 节点、本地电脑、容器云均可直接调用;
- 支持子账号分权,测试组开 20 台、开发组开 50 台,互不干扰;
- 单数据中心统一白名单,一次设置,账户下所有云手机生效,后续加机器零配置。
操作流程(实测 30 秒)
1. 打开 星界控制台 → 选中云手机 → 更多操作 → ADB 连接;
2. 填写本机公网 IP(可访问 ip138.com 查看)→ 确定;
3. 返回页面复制“ADB 连接地址”;
4. 本地 adb connect 云手机域名:端口 立即上线,后续与真机无差别。
4. 代码示例:Python 脚本循环装包、跑 Monkey、导出日志
以下脚本可直接在 Jenkins Pipeline 里新建一个“Execute Python”步骤,5 分钟搞定 nightly build。
import os, subprocess, time, datetime
devices = [
"cn-x-x-starcloud.chinac.com:17111",
"cn-x-x-starcloud.chinac.com:17112",
"cn-x-x-starcloud.chinac.com:17113"
]
apk_path = "app-debug.apk"
pkg_name = "com.example.app"
log_dir = f"logs/{datetime.datetime.now():%m%d_%H%M}"
os.makedirs(log_dir, exist_ok=True)
for d in devices:
# 1. 连接
subprocess.run(["adb", "connect", d], check=True)
# 2. 安装
subprocess.run(["adb", "-s", d, "install", "-r", apk_path], check=True)
# 3. Monkey 5 万事件
monkey = subprocess.Popen(
["adb", "-s", d, "shell", "monkey", "-p", pkg_name,
"--pct-touch", "50", "--pct-motion", "30",
"--throttle", "200", "-v", "50000"],
stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True)
# 4. 实时日志
logcat = subprocess.Popen(
["adb", "-s", d, "logcat", "-v", "time"],
stdout=open(f"{log_dir}/{d}.log", "w", encoding="utf-8"))
time.sleep(300) # 运行 5 分钟后结束
monkey.terminate(); logcat.terminate()
# 5. 导出崩溃
subprocess.run(["adb", "-s", d, "shell", "am", "force-stop", pkg_name])
subprocess.run(["adb", "-s", d, "pull", f"/sdcard/Android/data/{pkg_name}/files/crash", f"{log_dir}/{d}_crash"])
跑完 30 台并行,只需把 devices 数组换成星界提供的 ADB 地址列表即可。日志统一归档到 Jenkins 工作区,失败用 plot 插件直接出图表,第二天上班看报告就能定位问题。
5. 成果:测试周期从 3 天缩到 8 小时,故障定位效率×5
某跨境电商客户端团队 3 月接入星界云手机, nightly build 跑在 40 台直播增强版 1080P 机型上(8 核 5G,GPU 硬加速)。
- 过去:实体机 30 台 + 手工借还,完整回归 3 天;
- 现在:云手机 40 台 + Jenkins 并行,8 小时跑完 3 万 Monkey 事件、UI 遍历、性能采样;
- 崩溃日志秒级回传,关键字自动聚类,平均定位时间从 45 分钟降到 9 分钟;
- 无需 ROOT,支持 Android 7.1/11/13 多版本同时验证,兼容性问题提前暴露;
- 公网 ADB 零暴露,安全部直接放行上生产。
CTO 在复盘会上说:“团建预算翻倍,今晚海底捞,星界那边的销售也一起。”
写在最后
如果你也在为“设备不够、ROOT 太烦、公网 ADB 高危”而头疼,不妨到星界云手机官网注册账号,联系客服申请一天免费试用——30 秒开启白名单,把云真机写进 Jenkinsfile,让下一次迭代从“人等设备”变成“云机等脚本”。
敏捷测试的终局,是让开发者把精力留给创新,而不是 USB 线。
