Enviar datos al script que inició la actividad a través de adb shell am start

Quiero instalar una aplicación de diagnóstico desde adb y recuperar datos desde dentro de un script bash. Sé cómo comenzar una actividad desde adb , pero no puedo encontrar ninguna forma de recuperar los datos, a menos que imprima en logcat y logcat el resultado, pero eso suena como un hack. ¿Hay alguna manera de recibir datos de una actividad que comenzó usando adb ?

Si los datos que desea enviar a su secuencia de comandos de automatización se pueden serializar en una cadena de menos de 4k de longitud, el uso de logcat es una elección natural. Simplemente realice su actividad para imprimir los datos en el registro con Log.i("UNIQUE_TAG", the_data_string_you_want_to_send_back_to_your_script); y luego use los siguientes comandos en su script de automatización para capturar el resultado:

 # clear the logcat buffer adb logcat -c # start your activity adb shell am start  # 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) 

En versiones de Android más recientes (7.0+) donde logcat admite adecuadamente los logcat -m , -t y -T puede usar esta versión mucho más simple sin tener que borrar el registro con logcat -c primero:

 # instead of clearing the log just get the current timestamp TS=$(adb shell 'echo $EPOCHREALTIME; log ""') # start your activity adb shell am start  # 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") 

Hay una pequeña muestra de entrada / salida bash :

1ra preparación:

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

Entonces podrías escribir en &5 y leer en &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 por razones de seguridad, pero mientras los descriptores permanecen abiertos, puede usarlos (la opción de tiempo de espera de read funciona bien con 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 

Y

 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) 

Cuando termine, cierre todo:

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