ATX atxserver2 手机设备管理平台 重装上阵

codeskyblue · April 30, 2019 · Last by 小狮子coding replied at July 16, 2019 · 9953 hits
本帖已被设为精华帖!

前言

在一年前写过一篇安卓设备集群管理 atx-server的文章,主推设备的无线接入,服务端用的是我最喜欢的Go语言。承蒙大家厚爱,文章不仅加精,而且还有1万6千多的阅读量,很多人将这套工具部署到了公司内部,给ATX的QQ群带了源源不断的人群。我作为开发者,也在内部部署了一套,在陆陆续续的使用中,体会到了它的优点,也渐渐的发现了它的不足。

优点主要体现在设备接入方便,手机通过数据线完成初始化后,就可以拿在手里到处跑了。平台可以直接连接手机运行自动化脚本,下载日志,甚至远程操作。
缺点则主要体现在稳定性上,数据线的速度传输速度显然要比WIFI连接快的多,而且还不用担心手机没电的问题。

重构计划

atx-server在使用的过程中不断的优化,当有一天最终优化不下去了。于是开始了atxserver2的筹备计划。这个项目2019/01/15号开始开发的,目前开发了大概3个月了。已经比较稳定了。以前的服务端是用的Go+RethinkDB,现在则是用的Python3+NodeJS+RethinkDB。

架构图

thanks to 坚果云绘图工具

主要希望提供的Features(不过有些完成了,有些没完成)

  • [x] 使用Python重写服务端和客户端(Go语言写服务端速度有点慢,没有Python弄的快)
  • [x] 网页控制手机提供更全的功能(原有的atx-server功能非常的少,只有操作手机和一个手机shell终端)
  • [x] 支持USB设备的接入 (主要是为了提高稳定性)
  • [x] 支持iOS设备 (这个功能的呼声一直很高)
  • [x] 全面的REST API文档。(原来可能有,但是不全)
  • [ ] 支持WIFI设备的接入(这个暂时还没搞完,不过很快了)
  • [ ] 支持跨网段的设备接入 (假如有这个功能的话,感觉家里闲置的手机也能派上用场了)

有个用户迫切需要WIFI设备的接入功能,我问他为什么。他的理由真的让人无法反驳,他说:“我们的电脑没有USB接口”。

如果还想要其他的Feature,可以留言,或提Issue到这里 https://github.com/openatx/atxserver2/issues/1 虽然我不一定会有时间做

网页功能预览

远程控制原理简介

Android的远程控制主要还是基于 minicap+minitouch+atx-agent (不过感觉最近openstf的作者们,有点太忙了,没空管这个项目。之前adbkit有个bug,我提了一个pr,很久都没有收到回复。)我估计下个版本我就不用minicap+minitouch了。有个 scrcpy看起来不错,或许以后可以合并进来。

iOS的远程控制主要还是基于appium fork的WebDriverAgent。因为appium在WDA中增加了MJPEG Server,所以让远程投屏成为了可能。不过只支持iOS 12.0以上。

REST API接口

这个版本相比之前的atx-agent,有着更全面的权限控制。一旦你释放了设备,安卓或苹果的远程连接地址就会立刻换掉,防止平台上没有占用设备,但是却可能控制设备的事情发生。

See also: https://github.com/openatx/atxserver2/blob/master/API.md

项目地址和部署方法

https://github.com/openatx/atxserver2

目前这个版本提供了Docker的部署方式,可谓是简单快捷。一句docker-compose up命令就能将服务端启动起来。而provider的部署,用docker run ...就可以运行起来。手机连接上去之后,就会自动安装需要的apk和二进制文件。如果需要支持iOS,可能步骤要多点,不要有很详细的步骤供参考。

因为大部分是Python写的,我想这个版本贡献代码的人应该会多起来吧。

FAQ

为什么还在用RethinkDB?

总有人问我RethinkDB不是停止维护了吗?为什么要选这个数据库。因为这玩意实在太好用了,功能多,内存占用少,支持各种各样的平台部署。见过好的之后,你就再也不想用以前的。实际上这个数据库已经转交Linux基金会了,Github上这个项目还是有断断续续的提交,且它运行的一直还都很稳定。所以就先这样吧。

提示错误:zipfile.BadZipFile: File is not a zip file

因为用到了git-lfs,用来往项目中塞二进制文件。没有安装它,就不会下载哪些必要的二进制文件。修复方法:根据https://git-lfs.github.com/的安装提示完成git-lfs的安装,之后执行git lfs install && git lfs pull,然后重新运行即可。

其他问题欢迎留言

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 80 条回复 时间 点赞
蓝眼墨 回复

好像是拨号 *#8011# 就行,之前试过感觉怪怪的,就没用OPPO手机了

作者你好 我在运行到这一步的时候SERVER_URL="http://localhost:4000" # 这里修改成atxserver2的地址
python3 main.py -s $SERVER_URL 出现了9100端口无法连接,打开web也是显示设备屏幕同步中断
还发现一个bug
[D 190710 10:42:24 heartbeat:88] websocket send: {'udid': 'fa22e915edd5932b7dbad053fbab506651a1fead', 'provider': {'wdaUrl': 'http://10.211.55.3:20002'}, 'properties': {'ip': '10.168.1.172', 'version': '12.3.1', 'sdkVersion': '12.2'}, 'command': 'update', 'platform': 'apple'}
internal/modules/cjs/loader.js:628
throw err;
^

Error: Cannot find module 'mjpeg-consumer'
Require stack:

/Users/virtual/Desktop/atxserver2/atxserver2-ios-provider/wdaproxy.js
at Function.Module._resolveFilename (internal/modules/cjs/loader.js:625:15)
at Function.Module._load (internal/modules/cjs/loader.js:527:27)
at Module.require (internal/modules/cjs/loader.js:683:19)
at require (internal/modules/cjs/helpers.js:16:16)
at Object. (/Users/virtual/Desktop/atxserver2/atxserver2-ios-provider/wdaproxy.js:16:23)
at Module._compile (internal/modules/cjs/loader.js:776:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:787:10)
at Module.load (internal/modules/cjs/loader.js:643:32)
at Function.Module._load (internal/modules/cjs/loader.js:556:12)
at Function.Module.runMain (internal/modules/cjs/loader.js:839:10) {
code: 'MODULE_NOT_FOUND',
requireStack: [
'/Users/virtual/Desktop/atxserver2/atxserver2-ios-provider/wdaproxy.js'
]
}
[D 190710 10:43:25 idb:261] [fa22e..ad:“hp”的 iPhone-iPhone 7 Plus] is fine

stf中的jade改不动,python3比较好改,转战atx,谢谢大佬👍

作者你好我也是遇到73楼一样的问题 启动就设备屏幕中断第一次安装 我打开9100端口查看也是无反应 请问新的iproxy貌似有点问题,暂时用一个node写的usbmux客户端代替了,更新一下再重新npm install一下就好了“
您的这句话可以具体操作代码贴出来吗?小白一枚

codeskyblue 回复

好像是没有安装adb

ljm1000 回复

没装adb?

请教一下大佬,我在配置环境到最后一步时报错,该怎么处理


有没有哪位大佬遇到过这个问题?请指教

hwq8888 回复

新的iproxy貌似有点问题,暂时用一个node写的usbmux客户端代替了,更新一下再重新npm install一下就好了

cszzh 回复

还没做好

stronger 回复

你好,”ios提示 设备屏幕同步中断“ 这个问题我也遇到了,在web页面使用真机之后,FPS/Frames数值一直在快速滚动,然后5s左右之后就弹出这个报错,然后真机就不能用了。
请问大家谁有解决方案吗?

开了F12网络包看到服务器返回是{"success": true, "description": "Device activated time updated"}

楼主,请问支持wifi吗,我用usb是可以连接上的,能正常操作,但是拔完线,连接就断了,wifi该怎么连接上,能ping通的。

14Floor has been deleted
15Floor has been deleted

小白求助,在局域网一台linux服务器上部署完atxserver2 及atxserver2-android-provider后,必须把手机通过USB连接到部署了该服务linux服务器去吗? 我现在插到使用的windows机器上没用,打开atxserver2-android-provider的部署机器web:3500,提示 404: Not Found

强烈建议大佬多加点代码注释😂

发现一个很烦恼的问题:从remoteControl界面切换到另外一个浏览器页面后,再切回来,页面就会报【设备屏幕同步中断】,只能通过停止使用设备,再重新占用设备后显示才正常。有人知道怎么回事么?

ios提示 设备屏幕同步中断,大神们是咋回事?

Sutune 回复

iOS的远程控制主要还是基于appium fork的WebDriverAgent。因为appium在WDA中增加了MJPEG Server,所以让远程投屏成为了可能。不过只支持iOS 12.0以上。

我们方法类似,不过我们做的支持iOS 11及以上,老哥攻坚一下,尝试兼容iOS10呗。

yca 回复

那挺不错的😀

Sutune 回复

能做到一拖六,不过我们用的不是codeskyblue的开源框架,但是修改wda的原理类似。

codeskyblue 回复

打算接入10台左右的iOS设备,这个框架iOS设备支持有上限吗?

codeskyblue #24 · May 29, 2019 作者
Sutune 回复

多少台吗?我手里就两台iphone手机,你可以试试更多台。

可以支持多设台iOS设备连接吗?

codeskyblue #26 · May 23, 2019 作者
240581580 回复

我们又不是在美国本土开发的,跟我们没多大关系。就算有关系到时候再换个地方好了

Author only
蓝眼墨 回复

之前oppo手机是通过设备是否处于充电状态来判断的,现在新机型不知道还是不是以这个来判断,你可以试一下,用adb命令修改电池的充电状态 adb shell dumpsys battery set ac 1

luo000luo123 回复

服务器如果是win 可以在远程桌面连接里面设置把本地的端口映射到远程

大佬,请教atxserver2能实现跨网段接入设备么?云服务器上部署了项目,无法通过adb去连接设备,互相也ping不通,有没啥解决方案呢?

codeskyblue 回复

主要是我换电脑装部署,那个版本号又是新的,我以为是部署的时候出了问题

codeskyblue #32 · May 14, 2019 作者
啵板 回复

用来记录我代码有重大更新时用,不是每次都更新

大佬,网页上的版本号不会更新吗?
我 pull 下了新代码,版本号还是显示第一次部署的编号。

其实通过无线+有线 这种双重保活的方式,有可能让真机的稳定性更好一些.

楼主好,上面截图的问题按照你的方法执行git lfs install提示安装了,但是执行git lfs pull后提示Not in a git repository.这个怎么处理

0x88 回复

确实有点反人类

37Floor has been deleted
Maxdong24 回复

ios-provider 执行下 npm install 然后再启动看看

*#8011#有问题,还不如,过9分钟调用下adb shell echo online

啵板 回复

*#8011# 应该只是R9 R11 效果比较好, R15 R17 等最新的手机还是会自动关闭.

这个管理平台是否Android与ios的手机都支持?

ios提示 设备屏幕同步中断,大神们是咋回事?

43Floor has been deleted
codeskyblue #44 · May 07, 2019 作者
啵板 回复

赞一个

一个新问题,执行这个命令后(python main.py --server localhost:4000)报错,如截图

枫叶 回复

找到原因了:
因为没有共享磁盘!右击“docker desktop is runing”,就是电脑右下角的一个图标。
点击“settings”
再点击“shared Drives”
然后把磁盘都勾上,就可以了

嗨,遇到一个问题,当执行这个命令(docker-compose up)后,出现这样的报错 for rethinkdb Cannot create container for service rethinkdb: b'Drive has not been shared',麻烦看下啥问题

codeskyblue #49 · May 07, 2019 作者
ltyd5788 回复

我的OC不咋地,不太会改WDA的源码

iOS 常用功能注:iOS的弹窗不能通过屏幕点击选择,请问是出于什么考虑呢

蓝眼墨 回复

oppo还有个坑爹的就是点击到开发者的黄色下拉就会断掉,这个只能把点击区域这块去掉,如果是用monkey一定要定制坐标点,不给点击到那个下拉条。当然最好是让oppo那边的开发者不要设计这么反人类的功能。

剪烛 回复

wifi连接就不用 打开usb调试

0x88 回复

oppo 手机有个 10分钟 不使用 自动关闭开发者选项的 功能,然后 开发者选项里usb调试也就被关闭了,设备就断线了

蓝眼墨 回复

为什么断掉呢?了解一下android的回收机制。android手机一开始和苹果手机差别在哪里呢?其中一个就是android手机开机久了就会越来越卡,而且耗电非常快,于是厂商就不断优化手机。说了这么多,解决办法就是把stfservice加入耗电白名单或是允许后台运行的类似关键字。这个问题不仅仅是在oppo手机上出现,不同的手机还有不一样的界面入口。

支持楼主 👍

蓝眼墨 回复

额,难道用wifi可以解决?

codeskyblue #57 · May 06, 2019 作者
蓝眼墨 回复

据说输入个什么命令改下oppo的配置就行了。这个可能需要问问OPPO的开发们

请教个问题,oppoUSB调试,10分钟不操作就会关闭,定时传输adb命令也没有用,如果不用wifi怎么解决?

现在是不是不支持wifi

楼主牛逼

怒赞啊!!!!

之前写的atx-test已经支持atxserver2

android修改config下的Url和token就可以可以和以前一样运行了
ios写了个简单的网易云音乐的demo
https://github.com/pengchenglin/ATX-Test

codeskyblue #63 · May 02, 2019 作者

一开始重做是因为stf部署麻烦,现在感觉还是重做的用起来顺手,并且bug也更好修了

感觉你在重做stf了。。。
绘图可以用下plantuml,
改天上社区公开课演示下吧。

思寒_seveniruby 将本帖设为了精华贴 02 May 08:24

666大赞,假期结束就拿公司试试,哈哈哈哈

大佬厉害,已经搭建用起来了,provider多地设计太方便了,相比v1好很多了。正在试用ios。

6666大佬厉害了。马上去体验一波先。

0x88 回复

本来这个系统也不需要rethinkdb有多好的性能,只能稳定就够了

Lucas 回复

缺少周函数,应该不属于bug范围吧

rethinkdb在做统计方面坑的很,而且有个已知的bug,缺少周函数。

Rethinkdb没有做性能测试还是担心有问题,不像mongo这类经过大量项目的实践,最好是换掉的好。工作量也不大。

剪烛 回复

用WiFi 电脑和手机通信 互相传输内容,安全应该还会找事吧

剪烛 回复

咱们平安的电脑还是可以开usb连接的,需要找桌面运维把Usb驱动装上,再装上相应的手机驱动。这个事情我花了一个星期去找人,嗯就是这样。

watchdog 回复

不是没有usb接口的手机,是有usb口,但是只能向里传送数据,adb是无法使用的(一般外包使用的都是这种电脑,我们其实希望组织起大部分的功能测试人员来写用例,所以有这种需求)

剪烛 回复

没有USB接口的电脑,是啥电脑?

膜拜

atxserver1怎么设计成atxserver2呢?

有个用户迫切需要WIFI设备的接入功能,我问他为什么。他的理由真的让人无法反驳,他说:“我们的电脑没有USB接口”。

就是我本人了。。。。 我们暂时解决了这个问题了,通过ws传送python-uiautomator2的指令,但是stf的数据还没有解决。

先装起来试试

楼主V5,前排占楼

大佬,给力了,后面正要规划一个专用的多设备连接的情况,及时雨啊

这我可就忍不住要赞你了。

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up