我想从adb
安装诊断应用程序,并从bash脚本中获取数据。我知道如何从adb
开始一个活动,但我无法找到任何方法来获取数据,除非我打印到logcat
并解析输出,但这听起来像一个黑客。有没有办法从使用adb
开始的活动中接收数据?
答案 0 :(得分:8)
如果要发送回自动化脚本的数据可以序列化为长度小于4k的字符串 - 使用logcat
是一个很自然的选择。
只需进行活动即可使用Log.i("UNIQUE_TAG", the_data_string_you_want_to_send_back_to_your_script);
将数据打印到日志中,然后使用自动化脚本中的以下命令捕获输出:
# clear the logcat buffer
adb logcat -c
# start your activity
adb shell am start <INTENT>
# this line will block until a string with "UNIQUE_TAG" tag and "Info" priority
# is printed to the main log
adb shell 'logcat -b main -v raw -s UNIQUE_TAG:I | (read -n 1 && kill -2 $((BASHPID-1)))'
# now you can capture the data and process it
DATA=$(adb logcat -d -b main -v raw -s UNIQUE_TAG:I)
在最新的Android版本(7.0+)中,logcat
正确支持-m <count>
,-t <time>
和-T <time>
参数,您可以使用这个更简单的版本,而无需清除首先使用logcat -c
登录:
# instead of clearing the log just get the current timestamp
TS=$(adb shell 'echo $EPOCHREALTIME; log ""')
# start your activity
adb shell am start <INTENT>
# this command will return immediately if the data has been printed already or block if not
DATA=$(adb shell "logcat -b main -T $TS -m 1 -v raw -s UNIQUE_TAG:I")
答案 1 :(得分:0)
有一些In / Out bash样本:
第一次准备:
tmpfile=$(mktemp /tmp/adb-XXXXXXXXX)
exec 5> >(adb shell >$tmpfile)
exec 6<$tmpfile
rm $tmpfile
然后你可以写信给&5
并阅读&6
:
read -t .1 -u 6 foo;echo $foo
shell@HWY625-U:/ $
read -t .1 -u 6 foo;echo $foo
echo date >&5
read -t .1 -u 6 foo;echo $foo
date
read -t .1 -u 6 foo;echo $foo
Sat Dec 17 18:20:35 CET 2016
Nota:我rm $tmpfile
出于安全原因,但是当描述符保持打开状态时,您可以使用它们(read
的超时选项可以正常使用while
循环):
>&5 echo uptime
while read -t .1 -u 6 foo;do echo $foo;done
uptime
up time: 08:16:42, idle time: 01:20:19, sleep time: 06:47:13
和
ls -l $tmpfile
ls: cannot access /tmp/adb-hbmJrFVX4: No such file or directory
ls -l /proc/self/fd
total 0
lrwx------ 1 user user 64 Dec 17 18:24 0 -> /dev/pts/8
l-wx------ 1 user user 64 Dec 17 18:24 1 -> pipe:[22316547]
lrwx------ 1 user user 64 Dec 17 18:24 2 -> /dev/pts/8
l-wx------ 1 user user 64 Dec 17 18:24 5 -> pipe:[22316558]
lr-x------ 1 user user 64 Dec 17 18:24 6 -> /tmp/adb-hbmJrFVX4 (deleted)
完成后,关闭所有内容:
>&5 echo exit
while read -t .1 -u 6 foo;do echo $foo;done
exit
exec 5>&-
exec 6<&-