2014-04-03 14 views
6

Desidero installare un'app di diagnostica da adb e recuperare i dati da esso all'interno di uno script bash. So come avviare un'attività da adb, ma non riesco a trovare alcun modo per ottenere i dati indietro a meno che forse se stampo su logcat e analizziamo l'output, ma suona come un hack. C'è un modo per ricevere i dati da un'attività avviata utilizzando adb?Inviare i dati allo script che ha avviato l'attività tramite adb shell inizio

+0

stampa a Logcat e poi l'analisi per il risultato non è un hack –

+0

@ AlexP. Ok, in tal caso puoi o qualcuno dirmi come aprire logcat e aspettare un risultato? Se eseguo 'logcat -d' immediatamente dopo' am start' l'output non sarà ancora lì, e preferirei non immaginare per quanto tempo il processo richiederà l'avvio. –

+0

basta usare 'am start -W' –

risposta

3

Se i dati che si desidera inviare di nuovo al vostro script di automazione potrebbe essere serializzato in una stringa inferiore a 4k - usare logcat è una scelta naturale. Basta fare la vostra attività per stampare i dati al registro con Log.i("TAG", "DATA=" + your_data_string); e quindi utilizzare i seguenti comandi nello script di automazione per catturare l'output:

# 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

C'è un po 'In/Out campione:

prima preparazione:

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

allora si potrebbe scrivere a &5 e leggere da &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: I rm $tmpfile per motivi di sicurezza, ma mentre i descrittori rimangono aperti, è possibile utilizzarli (opzione timeout di read funzionano bene con while anello):

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

E

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) 

Al termine, chiudere tutto:

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

Quanto è pertinente la domanda originale? –

+0

Sembra che non ho capito bene la domanda, ma come * usando adb per diagnostica * medio * USB bridge connected *, se vuoi eseguire il debug di qualcosa tramite bridge, questo è un modo efficiente [tag: bash] per scrivere script interattivo tramite * adb * . –

+0

Usando lo stesso principio funziona con 'ssh', ma per mysql, ho eseguito' exec 5>> (stdbuf -oL mysql -anu username database> $ tmpfile) ' –

Problemi correlati