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的帮助和下面的连接: