Adb push / pull con barra de progreso

Es realmente molesto si adb empujar / tirar archivos grandes para el dispositivo que no hay manera de ahora lo lejos que está. ¿Es posible ejecutar adb push o adb pull y obtener una barra de progreso utilizando la utilidad 'bar'?

El problema principal aquí es que creo que adb espera dos nombres de archivo, si el archivo de entrada podría ser reemplazado por stdin que podría canalizar a través de la utilidad 'barra' y obtener una barra de progreso. Hasta ahora no he tenido éxito en hacerlo, pero no soy realmente un gurú de la concha que es porqué estoy pidiendo aquí 🙂

Tenga en cuenta que estoy en Linux utilizando bash.

Parece que el último anuncio tiene soporte de progreso.

Android Debug Bridge version 1.0.32 device commands: adb push [-p] <local> <remote> - copy file/dir to device ('-p' to display the transfer progress) 

Sin embargo, las respuestas anteriores también funcionan para 'adb install' que no tienen una opción de progreso. Modifiqué el script de la primera respuesta para que funcione de esta manera:

Cree "adb-install.sh" en algún lugar de su PATH y ejecute "adb-install.sh" en lugar de "adb install -f"

 #!/bin/bash # adb install with progressbar displayed # usage: <adb-install.sh> <file.apk> # original code from: http://stackoverflow.com/questions/6595374/adb-push-pull-with-progress-bar function usage() { echo "$0 <apk to install>" exit 1 } function progressbar() { bar="================================================================================" barlength=${#bar} n=$(($1*barlength/100)) printf "\r[%-${barlength}s] %d%%" "${bar:0:n}" "$1" # echo -ne "\b$1" } export -f progressbar [[ $# < 1 ]] && usage SRC=$1 [ ! -f $SRC ] && { \ echo "source file not found"; \ exit 2; \ } which adb >/dev/null 2>&1 || { \ echo "adb doesn't exist in your path"; \ exit 3; \ } SIZE=$(ls -l $SRC | awk '{print $5}') export ADB_TRACE=all adb install -r $SRC 2>&1 \ | sed -n '/DATA/p' \ | awk -v T=$SIZE 'BEGIN{FS="[=:]"}{t+=$7;system("progressbar " sprintf("%d\n", t/T*100))}' export ADB_TRACE= echo echo 'press any key' read n 

Actualmente tengo este pequeño pedazo de bash:

 function adb_push { # NOTE: 65544 is the max size adb seems to transfer in one go TOTALSIZE=$(ls -Rl "$1" | awk '{ sum += sprintf("%.0f\n", ($5 / 65544)+0.5) } END { print sum }') exp=$(($TOTALSIZE * 7)) # 7 bytes for every line we print - not really accurate if there's a lot of small files :( # start bar in the background ADB_TRACE=adb adb push "$1" "$2" 2>&1 | unbuffer -p awk '/DATA/ { split($3,a,"="); print a[2] }' | unbuffer -p cut -d":" -s -f1 | unbuffer -p bar -of /dev/null -s $exp echo # Add a newline after the progressbar. } 

Funciona un poco, muestra una barra de progreso que va de 0 a 100, lo cual es bueno. Sin embargo, no será correcto si hace un montón de archivos pequeños, y peor aún, los bytes / sy los bytes totales mostrados por 'barra' no son correctos.

Te reto a mejorar mi guión; No debe ser difícil! 😉

Aquí está mi solución, mostrará una barra de progreso simple y el progreso numérico actual

 [==================================================] 100% 

Uso

 ./progress_adb.sh source destination 

Progress_adb.sh

 #!/bin/bash function usage() { echo "$0 source destination" exit 1 } function progressbar() { bar="==================================================" barlength=${#bar} n=$(($1*barlength/100)) printf "\r[%-${barlength}s] %d%%" "${bar:0:n}" "$1" # echo -ne "\b$1" } export -f progressbar [[ $# < 2 ]] && usage SRC=$1 DST=$2 [ ! -f $SRC ] && { \ echo "source file not found"; \ exit 2; \ } which adb >/dev/null 2>&1 || { \ echo "adb doesn't exist in your path"; \ exit 3; \ } SIZE=$(ls -l $SRC | awk '{print $5}') ADB_TRACE=adb adb push $SRC $DST 2>&1 \ | sed -n '/DATA/p' \ | awk -v T=$SIZE 'BEGIN{FS="[=:]"}{t+=$7;system("progressbar " sprintf("%d\n", t/T*100))}' echo 

Pruebas en Ubuntu 14.04

 $ bash --version GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu) 

QUE HACER

Soporte de directorio

Cambio de tamaño de la barra de progreso cuando cambia el tamaño de la pantalla

Hice un parche a adb para arreglar esto.

https://android-review.googlesource.com/#/c/87748

QtADB tiene barras de progreso por archivo y totales. http://qtadb.wordpress.com/

Bueno, puedo darte una idea:

 ADB_TRACE=adb adb push <source> <destination> 

Devuelve registros para cualquier comando, por ejemplo, el comando copy, que se parece a:

 writex: fd=3 len=65544: 4441544100000100000000021efd DATA....#....b.. 

Aquí puede obtener la longitud total de bytes antes, con ls -a, luego analizar la salida de adb con grep o awk, incrementar un contador interneral y enviar el progreso actual a la utilidad barra.

Cuando consiguió, por favor, publique el script aquí.

Encontré un Python pastebin que está incompleto pero cerca: necesita un respaldo de argumentos y.

  • ¿Cómo mostrar el estado de la barra de progreso por porcentaje mientras se suben los datos de json?
  • Subida de archivos ¿No obtiene respuesta de devolución de llamada regular?
  • Android ProgressBar: cómo configurar el color secundario mediante programación
  • android.widget.ProgressBar no se puede convertir en android.widget.LinearLayout
  • Android: Animación horizontal personalizada de la barra de progreso
  • Cómo crear barra de progreso como la imagen en Android
  • ProgressBar no se restablece a "0" al abrir la segunda vez
  • Cómo cambiar dinámicamente el color del fondo de la barra de progreso android
  • Cómo establecer el tema para ProgressBar indeterminista en ProgressDialog en Android
  • Cómo actualizar barra de progreso mediante el tema
  • Androide progreso dentro de edittext
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.