从0到1打造货拉拉云真机平台

3,696 阅读9分钟

背景

随着货拉拉业务的不断发展,研发团队逐渐壮大,对测试手机的需求量也逐渐增大。经常会面临手机资源管理混乱,各团队之间手机资源不能公用,手机利率低,机型覆盖不够全面,手机上的自动化任务难于监控等问题。为了解决这些问题,货拉拉大数据研发团队从0到1打造了货拉拉云真机平台。

介绍

image.png

云真机并不是什么新兴的概念了,它是随着移动互联网的兴起而出现的一种服务模式。将各种品牌、型号、系统的手机放在云端,通过远程控制的形式在云端完成真机环境下的测试/调试。 远程真机使用方便,减少了开发测试人员设备不足的烦恼,也解决了硬件购置成本、手机型号、系统版本复杂,碎片化严重等问题,极大地降低了购置、运维的费用,也使测试效率有了规模化的提升。

货拉拉云真机平台主要是为了方便内部研发团队的开发测试,合理化利用手机资源。核心功能如下:

  • 手机投屏及远程操控
  • 手机运行状态监控
  •  手机分组管理
  • 自动化任务的批量分发

方案选择

关于云真机的开源技术实现主要有OpenSTF和OpenATX。目前市面上比较成熟的产品有百度MTC、Testin云测、腾讯WeTest。 通过对OpenSTF和OpenATX的源码解读以及实现原理分析,发现底层核心的技术实现都是基于以下3点:

  1. 1. 基于adb实现电脑端到手机端的命令交互
  2. 2. 基于minicap快速截图实现手机端到电脑端的实时投屏
  3. 3. 基于minitouch实现电脑端对手机的远程操控

结合货拉拉研发团队内部的主流技术体系,最终确定采用如下技术方案:

  1. 1. 采用Spring Boot作为项目的基础框架
  2. 2. 采用Netty-Websocket实现高效稳定的双向通讯
  3. 3. 采用minicap实现手机投屏
  4. 4. 采用minitouch实现远程操控

核心技术

1. adb

adb即Android Debug Bridge,主要用于电脑端与Android设备交互,是在电脑端实现安卓手机群控的核心,adb下载地址。

在服务器上安装好adb后,就可以通过usb接入手机设备。一般服务器上的usb接口都比较有限,需要借助usb hub进行usb接口的扩展,这里需要注意一定要选用支持外接电源的usb hub设备,以保障多个usb设备接入后仍然能正常供电。

机架部署图:

image.png adb的常用命令:

//启动adb server命令,一般执行adb命令会自动拉起adb服务
adb start-server

//停止adb server命令
adb kill-server

//查看接入adb的所有设备列表
adb devices

//查看指定设备CPU支持的abi型号
adb -s FIKN7SRCJV65T8M7  shell getprop ro.product.cpu.abi

//查看指定设备的SDK版本
adb -s FIKN7SRCJV65T8M7  shell getprop ro.build.version.sdk

//查看指定设备的Android系统版本
adb -s FIKN7SRCJV65T8M7 shell getprop ro.build.version.preview_sdk

//查看指定设备对应目录下的文件
adb -s FIKN7SRCJV65T8M7 shell ls /data/local/tmp/

//推送minicap驱动文件到设备的/data/local/tmp/目录下
adb -s FIKN7SRCJV65T8M7 push minicap /data/local/tmp/

//驱动文件赋权
adb -s FIKN7SRCJV65T8M7 shell chmod 777  /data/local/tmp/minicap

//启动指定设备上的minicap服务 
adb -s FIKN7SRCJV65T8M7 shell LD_LIBRARY_PATH=/data/local/tmp /data/local/tmp/minicap -P 1080x1920@1080x1920/0 -t

//创建minicap服务的forward端口,用来建立socket长链接通讯
adb -s FIKN7SRCJV65T8M7  forward tcp:1313 localabstract:minicap

2. minicap

minicap是STF开源的安卓手机截图工具,用来替代安卓系统原生的screencap截图工具,借助minicap生成图片流可以实现手机的投屏效果。其特点是截图速度非常快,可控性强,支持socket接口,可以轻松达到30-40FPS的投屏效果,minicap github地址。

该工具分为两个部分,一个是动态连接库.so文件,一个是minicap可执行文件。STF提供的minicap文件根据CPU 的ABI分为如下4种:x86_64 、x86、armeabi-v7a、arm64-v8a。而minicap.so文件在这个基础上还要分为不同的sdk版本。 在实际开发过程中,需要根据安卓手机CPU 的ABI型号和sdk版本选择相对应的minicap、minicap.so驱动文件推送到安卓手机上,并赋予执行权限。

image.png

minicap实现实时投屏效果的步骤如下:

image.png

3. minitouch

minitouch也是STF提供的开源产品,用于模拟触发Android 设备上的多点触摸事件和手势操作,实现手机的远程操控。github地址。

该工具只包含一个minitouch可执行文件,根据CPU 的ABI分为如下4种:x86_64 、x86、armeabi-v7a、arm64-v8a。在实际开发过程中,需要根据安卓手机CPU 的ABI型号选择相对应的驱动文件推送到安卓手机上,并赋予执行权限。

image.png

minitouch实现远程操控的步骤如下:

image.png

重点实现

1. 采用Netty-Socket通讯

要实现对一台安卓手机的实时投屏和远程操控,需要在服务后台和手机同时建立minicap的socket连接以及minitouch的socket连接。其中minicap的socket连接用来实时接受minicap产生的图片流信息,minitouch的socket连接用来接受用户在浏览器上对投屏的手机界面通过鼠标操作生成的操作指令流信息。 由于后端服务需要实时将minicap生成的图片流推送到前端,所以这里采用了WebSocket技术。经过实际测试发现,常用的基于tomcat的Websocket实现,在高并发、高流量场景下稳定性实在太差,最终我们选择了基于Netty实现的Websocket通讯,在应对上百台手机的接入、大流量实时投屏的场景时,依然可以保持非常稳定流畅的通讯。

maven依赖

<dependency>
    <groupId>org.yeauty</groupId>
    <artifactId>netty-websocket-spring-boot-starter</artifactId>
    <version>0.9.5</version>
</dependency>

image.png

2. 自动安装minicap、minitouch驱动

要实现手机的实时投屏和远程操控,依赖于minicap、minitouch这两项技术,但是一般安卓手机上默认情况下都没有相关的驱动文件,需要我们主动将驱动文件推送到手机上。如果接入上百台手机都需要手动去推送驱动文件,显然将是个巨大的工程,基于此我们加入了自动安装minicap、minitouch驱动的功能。 其实现原理是建立一个监听器用来监听接入adb的安卓设备,如果检测到设备没有安装minicap、minitouch驱动,则根据设备CPU 的ABI型号以及SDK版本自动推送驱动文件,并给驱动文件赋权,完成驱动安装后给手机打上标识避免驱动文件的重复检测和安装。

3. 场景投屏模式

实时投屏是云真机平台中最大的技术难点。如果要保证实时投屏效果的清晰度和流畅度,则minicap产生的图片流就会很大,会加大图片流传输和解析的压力,导致系统的并发能力降低,接入的设备数量受限。而如果直接降低图片流的清晰度和数量,则会导致投屏的清晰度降低,远程操作卡顿的问题。

那么究竟该如何取舍呢?

货拉拉云真机平台,结合系统中的各种场景,将投屏模式做了如下3种区分:

单机操控场景

该场景是最典型的投屏场景,其特点是对投屏效果的清晰度和流畅度以及实时性都要求较高,用户的远程操控需要能实时在投屏界面上显示出来。 当用户选中需要操控的手机进入对应的操控界面后,即为单机操控场景。该场景下,前端只需要保持与操控手机的WebSocket连接,断开其他WebSocket连接,以减少资源消耗。

为了保证投屏的实时性,需要与手机上的minicap服务建立socket连接,实时接受图片流,返回给前端展示。

用户也可以在投屏界面中,自己设置投屏的图片质量。其底层原理是通过设置minicap启动命令中的参数,改变返回的图片质量。

adb  shell LD_LIBRARY_PATH=/data/local/tmp /data/local/tmp/minicap -h

image.png

其中,参数Q是用来控制图片质量,取值范围为0~100.

image.png

多机监控场景

多机监控场景主要是用来对一组手机上的自动化任务的运行情况进行实时监控。其特点是需要对多个手机同时进行投屏展示,对投屏的实时性要求较低,且不需要支持手机远程操控的功能。 其底层实现是给每个投屏手机都建立一个Netty Websocket连接,但是后端服务并不需要实时监听minicap返回的图片流,而是只需要通过定时任务间隔1~3s获取最新的手机截图,推送到前端即可。 这样既可以满足多机监控场景的需求,又不会因为多机投屏监控产生太大的图片流,对系统造成较大的IO压力。

image.png

静默场景

静默场景是最简单的一种场景,该场景下并不会自动刷新手机投屏的界面,仅仅在用户进入手机列表页面或刷新页面时,才会去请求后端获取最新的手机截屏来展示。

通过针对不同场景的投屏机制管理,最终货拉拉云真机平台既满足了各场景的投屏需求,又做到了投屏IO流量的可控。

总结

货拉拉云真机平台起步时间较晚,旨在整合内部手机资源,提高手机的利用率以及监控手机上自动化任务的运行情况。相较市面上成熟的云真机产品,确实还存在诸多不足,但单从实时投屏和远程操控等核心功能上来说,基本能满足内部需求,走出了从0到1的坚实一步。后续我们将立足公司实际业务场景,持续演进,一步步打磨好货拉拉云真机平台。

笔者介绍:万里 |高级大数据工程师,现任职于货拉拉大数据应用团队,主要负责智能定价、数据云台等大数据产品的建设工作。