ADB的run-as和exec-out参数

run-as 可以用某个用户的权限来执行命令,这可以解决没有访问权限的问题,在不带这个参数时执行:

adb push sample.db /data/data/com.sample.foo/databases/sample.db

sample.db就不能被com.sample.foo访问,因为文件的用户和所在的组与com.sample.foo不一致,必须要经过chown修改用户和组后才能访问,而且由于每次app安装后获得的用户名不一致,没法将chown命令的参数批处理化,这是个很重要的缺陷。

带上run-as执行:

adb shell "run-as com.sample.foo sh -c 'cp /sdcard/sample.db /data/data/com.sample.foo/databases/sample.db'"

sample.db就变成com.sample.foo亲生的。如果你没有root权限,执行pull或者push时又提示Permission denied,不妨加上run-as参数看看。

exec-out是本文的另一个主角。在用adb pull从设备拉db之类的二进制文件的过程中,程序会自作主张的将\n转换成\r\n,最终导致得到的文件被修改,exec-out的意思是说,给我保留原汁原味,我不要添加剂,谢谢!

你可以对比以下命令的输出:

adb shell "su -c cat /data/data/com.android.providers.settings/databases/settings.db" > settings.db

adb exec-out "su -c cat /data/data/com.android.providers.settings/databases/settings.db" > settings.db

截屏和录屏

通过 ADB 截取 Android 设备屏幕是通过screencap命令,比如下面的命令:

adb exec-out screencap -p > screencap.png

这将会截取一张图片并保存在当前目录下,其中exec-out命令声明原样输出数据,p参数即指定保存图片为 png 格式。录制 Android 屏幕则是通过screenrecord命令,该命令仅支持 Android 4.4 及以上版本的系统,示例如下:

adb shell screenrecord --time-limit 15 --size 1280x720 --bit-rate 6000000 /mnt/sdcard/screenrecord.mp4

上面的指令执行后,将会开始录制 Android 设备屏幕,视频时长为15秒,分辨率为 720p,比特率为6Mbps,视频数据保存在 SD 卡的 screenrecord.mp4 文件里。

更详细的说明请参考adb的帮助和下面的连接: