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

Android 通过adb shell am start将数据发送回启动活动的脚本,android,bash,adb,Android,Bash,Adb,我想从adb安装一个诊断应用程序,并从bash脚本中获取数据。我知道如何从adb启动一个活动,但我找不到任何方法来获取数据,除非我打印到logcat并解析输出,但这听起来像是一个黑客。是否有方法从使用adb启动的活动接收数据?有一个小的输入/输出示例: 第一次准备: tmpfile=$(mktemp /tmp/adb-XXXXXXXXX) exec 5> >(adb shell >$tmpfile) exec 6<$tmpfile rm $tmpfile 注:出于安全

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

有一个小的输入/输出示例:

第一次准备:

tmpfile=$(mktemp /tmp/adb-XXXXXXXXX)
exec 5> >(adb shell >$tmpfile)
exec 6<$tmpfile 
rm $tmpfile
注:出于安全原因,我
rm$tmpfile
,但是当描述符保持打开状态时,您可以使用它们(
read
的超时选项在
while
循环中正常工作):

完成后,关闭所有内容:

>&5 echo exit  
while read -t .1 -u 6 foo;do echo $foo;done
exit
exec 5>&-                                          
exec 6<&-
&5回显退出
而读-t.1-u6foo;DoEcho$foo;完成
出口
执行官5>&-

exec 6如果要发送回自动化脚本的数据可以序列化为长度小于4k的字符串,则使用
logcat
是一种自然选择。 只需使用
log.i(“UNIQUE_TAG”,您想要的_数据_字符串_发送_返回_脚本)将数据打印到日志中即可
然后在自动化脚本中使用以下命令捕获输出:

# 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)

打印到logcat然后对结果进行解析不是一个简单的过程hack@AlexP. 好的,在这种情况下,您或任何人可以告诉我如何打开logcat并等待结果吗?如果我在
am start
之后立即运行
logcat-d
,输出还不会出现,我不想猜测启动过程需要多长时间。只需使用
am start-W
@Paschalis,您就有权发表您的意见。但很可能你只是不知道如何正确地做它。@Paschalis,你做错了。如果操作正确,则丢失任何数据的可能性为0。这与原始问题有何关系?似乎我不太理解这个问题,但使用adb进行诊断意味着USB网桥连接,如果您想通过网桥调试某些内容,这是一种通过adb编写交互式脚本的有效方法。使用相同的原理,ssh可以很好地工作,但是对于mysql,我已经运行了exec 5>(stdbuf-oL mysql-ANu username database>$tmpfile)
您一直没有抓住要点。你的答案与原来的问题根本不相关。它不能解决OP的任何问题。@AlexP。使用它,您可以在一个bash脚本中使用一个
adb shell
会话,使用不同的选项和过滤器,连续生成
logcat-d*:W…
,解析并对答案做出反应,甚至可以运行另一个命令
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<&-
# 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)
# 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")