项目简介
STF(Smartphone Test Farm)是一个基于 Web 的远程智能手机调试平台,允许团队在浏览器中远程操控和调试真实的 Android 设备。由 DeviceFarmer 社区维护,它继承了原 OpenSTF 项目的精神,并持续更新以支持最新版本 Android 系统。
STF 的核心价值在于将多台 Android 设备集中管理,团队成员无论身在何处,都能通过浏览器实时操作设备,极大提升了移动端开发和测试的效率。
GitHub 数据
- 仓库地址: DeviceFarmer/stf
Stars: 4,451 Forks: 607 - License: Apache 2.0 衍生
- 语言: JavaScript
- 当前版本: v3.7.7 (2025-07-23)
- 创建时间: 2020-03-10
- Android 兼容范围: 2.3 ~ 15(含 Wear OS 5.1+、Fire OS)
核心功能
- 实时屏幕投射:30-40FPS 流畅度,几乎无延迟的设备屏幕镜像
- 多点触控支持:完整模拟触摸手势,包括缩放、滑动等
- APK 拖拽安装:直接将 APK 文件拖入浏览器窗口即可安装
- Shell 命令:内置终端,可远程执行 adb shell 命令
- ADB Connect:通过 adb 桥接连接设备,支持 USB 和无线连接
- 设备库存监控:可视化面板展示所有设备的状态、型号、Android 版本
- REST API:完整的 API 接口,可与 CI/CD 流水线集成
技术栈
| 技术 | 用途 |
|---|---|
| Node.js | 后端运行环境 |
| RethinkDB | 实时数据库,管理设备和会话状态 |
| ZeroMQ | 设备通信消息队列 |
| Protocol Buffers | 高效数据序列化 |
| ADB / minicap / minitouch | Android 设备底层交互 |
使用方式 / 安装
Docker 快速部署(推荐)
STF 官方推荐使用 Docker Compose 进行部署:
git clone https://github.com/DeviceFarmer/stf.git
cd stf
docker-compose up -d
手动安装
npm install -g stf
stf local --public-ip <your-ip>
访问与使用
启动后通过浏览器访问 http://你的IP:7100,登录后即可看到所有连接的 Android 设备。点击设备即可在浏览器中获得完整的设备控制权。
适用场景
- 移动端 QA 自动化测试:结合 Appium 等框架进行跨设备自动化测试
- 跨设备兼容性测试:在多种 Android 版本和设备上验证应用表现
- 远程设备管理:分布式团队共享设备资源,降低硬件采购成本
- 演示与培训:远程展示移动应用功能,无需录屏或实际设备
竞品对比
| 项目 | 类型 | 优势 | 劣势 |
|---|---|---|---|
| STF (DeviceFarmer) | 开源自托管 | 免费、完全可控、支持旧版 Android | 需自行维护服务器 |
| AWS Device Farm | 商业云服务 | 设备种类多、无缝对接 AWS 生态 | 按分钟计费、无实时人工操控 |
| Firebase Test Lab | 商业云服务 | 与 Firebase 集成、自动化测试 | 无实时操控、Google 生态限定 |
| OpenSTF(原始版) | 开源(已归档) | 开创性项目 | 已停止维护,功能落后 |
STF 最大的亮点是自托管方案,数据完全自主可控,同时支持实时人工操控,这在调试复杂交互问题时不可替代。
配置与扩展
STF 的架构设计使其具备良好的可扩展性。通过插件机制,可以添加自定义的设备交互能力;结合 CI/CD 流水线,可实现自动化测试的闭环管理。对于较大规模的团队,建议配合 Kubernetes 进行容器化编排,以支持设备池的动态扩缩容。
社区与生态
STF 的社区生态经历了从 OpenSTF 到 DeviceFarmer 的传承。目前 DeviceFarmer 组织维护着多个相关工具,包括 minicap(实时屏幕截图工具)、minitouch(触控事件注入工具)等底层组件,这些组件也被其他自动化测试框架广泛采用。
此外,STF 的 REST API 为生态系统提供了丰富的集成可能性。开发者可以基于 API 构建自定义的管理面板、告警系统或与现有的测试管理平台对接。结合 Appium,可以实现远程设备上的自动化测试执行。
参考资料
文档信息
- 本文作者:zhupite
- 本文链接:https://zhupite.com/tool/stf.html
- 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)