2014-04-03 4 views
6

Ich möchte eine Diagnose-App von adb installieren und Daten aus einem Bash-Skript zurück erhalten. Ich weiß, wie man eine Aktivität von adb startet, aber ich kann keine Möglichkeit finden, Daten zurück zu bekommen, es sei denn vielleicht, wenn ich auf logcat drucke und die Ausgabe parse, aber das klingt wie ein Hack. Gibt es eine Möglichkeit, Daten von einer Aktivität zu empfangen, die mit adb gestartet wurde?Senden Sie Daten zurück an das Skript, das die Aktivität über adb gestartet hat shell am start

+0

Druck auf Logcat und dann für das Ergebnis Parsen ist kein Hack –

+0

@ AlexP. Okay, in diesem Fall können Sie oder jemand mir sagen, wie Logcat zu öffnen und auf ein Ergebnis warten? Wenn ich "logcat -d" sofort nach dem Start starte, ist die Ausgabe noch nicht da und ich rate nicht, wie lange der Prozess dauern wird. –

+0

verwenden Sie einfach "am Anfang -W" –

Antwort

3

Wenn die Daten, die Sie zurück zu Ihrem Automatisierungs-Script senden möchten könnte in eine Zeichenfolge von weniger als 4k Länge serialisiert werden - mit logcat ist eine natürliche Wahl. So stellen Sie Ihre Aktivität, die Daten in das Protokoll mit Log.i("TAG", "DATA=" + your_data_string); und verwenden Sie die folgenden Befehle in Ihrer Automatisierungs Skript drucken die Ausgabe zu erfassen:

# clear the logcat buffer 
adb logcat -c 

# start your activity 
adb shell am start <INTENT> 

# this line will block until a string with "TAG" tag and "Info" priority and 
# starting with "DATA=" is printed to the main log 
adb shell 'logcat -b main -v raw -s TAG:I | (grep -q ^DATA= && kill -2 $((BASHPID-1)))' 

# now you can capture the data and process it 
DATA=$(adb logcat -d -b main -v raw -s TAG:I | grep ^DATA=) 
0

Es gibt ein kleines In/Out Beispiel:

1. Vorbereitung:

tmpfile=$(mktemp /tmp/adb-XXXXXXXXX) 
exec 5> >(adb shell >$tmpfile) 
exec 6<$tmpfile 
rm $tmpfile 

Dann könnte man auf &5 schreiben und lesen von &6:

read -t .1 -u 6 foo;echo $foo 
[email protected]:/ $ 
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: Ich rm $tmpfile Aus Sicherheitsgründen, aber während Deskriptoren geöffnet bleiben, können Sie sie verwenden (Timeout-Option read Arbeit ganz gut mit while Loop):

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

Und

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) 

Wenn Sie fertig sind, in der Nähe alles:

>&5 echo exit 
while read -t .1 -u 6 foo;do echo $foo;done 
exit 
exec 5>&-           
exec 6<&- 
+0

Wie genau ist das für die ursprüngliche Frage relevant? –

+0

Scheint, ich verstehe die Frage nicht gut, aber als * adb für die Diagnose verwenden * meine * USB-Brücke verbunden *, wenn Sie etwas über Bridge debuggen möchten, ist dies eine effiziente [tag: bash] Möglichkeit zum Schreiben interaktiver Schrift durch * adb * . –

+0

Mit dem gleichen Prinzip arbeiten Sie schön mit 'ssh', aber für mysql habe ich' exec 5>> (stdbuf -oL mysql -ANu Benutzername Datenbank> $ tmpfile) ' –

Verwandte Themen