用adb命令给安卓设备截屏

对于一位Android程序猿来说,截屏是日常工作中很常用的操作。本文介绍一下用adb命令给安卓设备截屏的技巧。

本文适用于Android设备,包括安卓手机和Rokid开发套件RADK。
以下内容在Mac OS和Ubuntu上测试通过。

前提

电脑端已经安装/配置好adb命令
手机用usb线(或其它方式)连接电脑

1. 简单易懂的方法

使用screencap命令,可以实现截屏、保存为文件的功能。
所以,我们可以 (1)用screencap截屏并保存;(2)用adb pull把截屏文件复制到本地电脑;(3)把手机上的截屏文件删除。

adb shell screencap -p /sdcard/screenshot.png
adb pull /sdcard/screenshot.png
adb shell rm /sdcard/screenshot.png

2. 高级方法(难懂但一行搞定)

screencap命令其实是支持stdout的,但是我们尝试adb shell screencap -p >screenshot.png,却得到了损坏的文件。是什么原因呢?

原来,adb shell这个命令在传送文件时,对文件末尾的最后一个字符EOL进行了转换,把LF转换成了CR+LF。我们需要把这儿多出来的CR去掉。

CR = \r = 0x0D
LF = \n = 0x0A

2.1 Ubuntu环境

adb shell screencap -p | sed 's/\r$//' > screenshot.png

在这条sed命令中,使用正则表达式进行搜索替换,把找到的\r$ ($代表文件末尾)替换掉,等同于删除。

2.2 Mac OS环境

adb shell screencap -p | perl -pe 's/\x0D\x0A/\x0A/g' > screenshot.png

上述sed方法在Mac OS中不好用,所以使用perl命令来代替。

在这条perl命令中,使用正则表达式进行搜索替换,把找到的\x0D\x0A (代表CR LF)替换成\x0A(代表LF),达到了删除CR的效果。

然后我写了一个shot.sh脚本,并chmod a+x shot.sh给了它运行的权限。内容如下:

dd=`date +%Y-%m-%d-%h-%M-%s`

adb shell screencap -p /sdcard/screenshot.png
adb pull /sdcard/screenshot.png
adb shell rm /sdcard/screenshot.png
mv screenshot.png $dd.png
echo "Screenshot was saved to "$dd.png
open ./$dd.png -R
open -a Preview $dd.png

这样每次执行./shot.sh就可以了。得到的截屏会按当前日期时间命名,保存为png文件,为方便查看,还会自动打开Finder定位到png文件所在的位置,并自动高亮此文件,同时,还会使用Preview打开这个文件。

测试完美成功!

备注:

为了方便在任何目录使用此命令,在~/.bash_profile中加入一行:

alias shot="~/shot.sh"

然后执行source ~/.bash_profile使之生效即可。

完美!

完美!