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

codeskyblue · 2016年05月27日 · 最后由 codeskyblue 回复于 2019年09月10日 · 7739 次阅读

之前发过一篇文章 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 快速截图 中提及了此贴 09月10日 10:31
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册