作者:汶水一方
2017.08.10本文软硬件环境
MacBook Pro, OS X El Capitan, 10.11.6
Android Studio v2.3
对于一位Android程序猿来说,截屏是日常工作中很常用的操作。本文介绍一下用adb命令给安卓手机截屏的技巧。
前提:
电脑端已经安装/配置好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
使之生效即可。
完美!
最后更新:2017.10.3