通过adb shell am start将数据发送回启动活动的脚本

时间:2014-04-03 16:49:50

标签: android bash adb

我想从adb安装诊断应用程序,并从bash脚本中获取数据。我知道如何从adb开始一个活动,但我无法找到任何方法来获取数据,除非我打印到logcat并解析输出,但这听起来像一个黑客。有没有办法从使用adb开始的活动中接收数据?

2 个答案:

答案 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 样本:

第一次准备:

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<&-