ATX [atx 系列] 安卓手机的快速截图

codeskyblue · May 27, 2016 · Last by codeskyblue replied at September 10, 2019 · 5385 hits

之前发过一篇文章 ATX 系列 - 让 adb install 也能看到进度,看反馈效果还挺好的。所以继续写第二篇。

今天介绍的是atx下的另一个命令行工具,专门负责快速的截图。

背景介绍

目前的安卓截图工具虽然很多,比如命令行本身自带的screencap,或者用第三方工具 豌豆荚,iTools 等等,然而截图的效率以及易用性都还一般,有很多的改进的空间。
随着时间的推移,技术在阳光的照耀下,不断的在进步,一个利用安卓系统的隐藏接口进行快速截图minicap项目就这样悄然诞生了,将截图的速度优化到了ms级别。感谢openstf团队做出的杰出贡献。

如何使用

首先利用pip需要安装atx

pip install --pre --upgrade atx

然后根据atx项目的说明安装python-opencv,这一步的安装比想象中的要简单的多。

之后手机连接上电脑,进行minicap的安装。(这个步骤可能在以后还会变化,因为并不优雅

python -matx minicap

如果没有什么报错的话,就可以用minicap截图了。然而并非所有手机都支持minicap,此时atx会回滚到传统的截图方法,保证其可用性。

截图命令

python -matx screencap -o screen.png

打开screen.png就可以看到截图的文件了

原理

关于minicap的原理,我并没有仔细的去研究,据文档上说,是利用了安卓系统的隐藏的api,所以编译minicap时,需要整个安卓系统的源码。
关于minicap兼容性的问题,因为国内的手机太多,而项目的作者又不在中国,所以并不可能测试过所有的国内手机。据坊间传闻,阿里内部对minicap做了修改,兼容90%以上的国内手机,可惜目前不开源。

问题反馈

该工具为了还会做不断的完善和修改。如果使用遇到了问题,可以留言,不过强烈推荐反馈到 github的issue上面,目前的地址是 https://github.com/codeskyblue/AutomatorX/issues

备注

版权所有ATX开发组,如需转载请注明testerhome文章的地址

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

你跟 @wuxc 是什么关系啊

#1楼 @seveniruby 同一个开发组

从那里打开screen.png

—— 来自TesterHome官方 安卓客户端

#3楼 @xuexi123 用文件浏览器打开

@codeskyblue 您好,请教一下,为什么我按照python -matx screencap -o screen.png 截图 花费时间要大于1秒呢,达不到您文章中所述的毫秒级别。

下面是cmd 输出
python -matx screencap -m minicap -o 1.jpg
PID: 20962
INFO: Using projection 720x1280@720x1280/0
INFO: (external/MY_minicap/src/minicap_19.cpp:255) Creating SurfaceComposerClient
INFO: (external/MY_minicap/src/minicap_19.cpp:258) Performing SurfaceComposerClient init check
INFO: (external/MY_minicap/src/minicap_19.cpp:265) Creating virtual display
INFO: (external/MY_minicap/src/minicap_19.cpp:271) Creating buffer queue
INFO: (external/MY_minicap/src/minicap_19.cpp:278) Creating CPU consumer
INFO: (external/MY_minicap/src/minicap_19.cpp:284) Creating frame waiter
INFO: (external/MY_minicap/src/minicap_19.cpp:288) Publishing virtual display
INFO: (jni/minicap/JpgEncoder.cpp:64) Allocating 2766852 bytes for JPG encoder
1719 KB/s (45780 bytes in 0.026s)
File saved to "1.jpg"

#5楼 @hiyolanda 也可能跟手机有关系,有些手机对minicap支持的不是很好

#2楼 @codeskyblue 屏幕录制命令详细的怎么写

—— 来自TesterHome官方 安卓客户端

#8楼 @codeskyblue 我篇文章也看过来,就是在实际的操作过程中我输入的命令可能哪里不对,我输入的Python -matx screenrecord -o screenrecord.avi 返回
C:\Users\Administrator>python -matx screenrecord -o screenrecord.avi
screen orientation changed to 0
Traceback (most recent call last):
File "C:\Python27\lib\site-packages\atx\adb2.py", line 679, in _listen
listener(line)
File "C:\Python27\lib\site-packages\atx\adb2.py", line 619, in _on_rotation
self.start_minicap(_on_screenchange)
File "C:\Python27\lib\site-packages\atx\adb2.py", line 694, in start_minicap
raise EnvironmentError('minicap not available')
EnvironmentError: minicap not available

是哪里的问题

需要先安装下minicap python -m atx minicap 安装下

#9楼 @xuexi123 看上条评论

#11楼 @codeskyblue 安装过了,可以截屏的 截屏命令这样写的python -matx screencap -o screen.png 录制的命令你能给我写两个例子吗

#12楼 @xuexi123 给你写一个,不过也很简单的,那篇文章里也有介绍 python -m atx screenrecord -o out.avi

#13楼 @codeskyblue C:\Users\Administrator>python -m atx screenrecord -o out.avi
screen orientation changed to 0
Traceback (most recent call last):
File "C:\Python27\lib\site-packages\atx\adb2.py", line 735, in _pull
m assert p.poll() is None
inicap diedA
ssertionError
ERROR: invalid format for -P, need x@x/{0|90|180|270}
Process died.

老报这个错,帮忙看看什么原因

升级下atx
pip install --upgrade --pre atx

#15楼 @codeskyblue 升级成功了,接着执行录制命令
C:\Users\Administrator>python -m atx screenrecord -o out.avi
Traceback (most recent call last):
File "C:\Python27\lib\site-packages\atx\adbkit\mixins.py", line 152, in _pull
assert p.poll() is None
AssertionError
Process died.
ERROR: invalid format for -P, need x@x/{0|90|180|270}

minicap died
报这个错

看你这个样子,是什么手机呢?Android版本多少呢?

#17楼 @codeskyblue 小米note

—— 来自TesterHome官方 安卓客户端

#17楼 @codeskyblue 红米 note Android4.4.4

#19楼 @xuexi123 我先记录下了,有空我看下

#19楼 @xuexi123 fixed. 后续关于该问题的讨论,迁移到这里 https://github.com/codeskyblue/AutomatorX/issues/48

#21楼 @codeskyblue 好的,多谢啦

—— 来自TesterHome官方 安卓客户端

现在写了一个java方法,调用linux下的python命令,通过java -jar的方式执行得到正确结果,但是通过jenkins在该linux的slave上执行时Process waitfor的值为1,slave通过root账户启动。

/bin/sh -c python -matx screencap -o /tmp/2.jpg 

@adfghzhang 输出内容呢?

#24楼 @codeskyblue 错误流中的信息:

/usr/bin/python: libopencv_gpu.so.2.4: cannot open shared object file: No such file or directory; 'atx' is a package and cannot be directly executed

#25楼 @adfghzhang 看来opencv没有装

#26楼 @codeskyblue 不是这个啊 我直接执行命令是正常的哦

python -matx screencap -o /tmp/0.jpg
Started screencap
Time spend: 0.84s
File saved to "/tmp/0.jpg"

#27楼 @adfghzhang 也许就是java导致的环境变量缺失的问题

#28楼 @codeskyblue 应该是了,环境的问题挺让人郁闷的。我查查看

@codeskyblue 升级了Android6.0,安装minicap报错

#30楼 @adfghzhang 刚修复,更新一下atx就好了,原因是因为stf主页上的minicap被转移到别的目录了

我测试了一下 minicap 的速度好像也不怎么快。。

11111111 回复

说错了,确实快了。抱歉~

楼主您好,我用python和java都尝试调用过这个截图命令,发现程序里面调用的时间都是大于命令行里面返回的时间的,请问这是为什么呢?

在linux shell里面使用time命令也是如此。

是不是ATX在调用minicap截图的过程中,从我输入命令到started screencap这个过程中消耗了时间?

codeskyblue 回复

您好,请问一下我希望每秒截图10次软件工具可以达到吗

codeskyblue openatx/uiautomator2 快速截图 中提及了此贴 10 Sep 10:31
需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up