It is really annoying if you adb push/pull large files to the device that there's no way to now how far along it is. Is it possible to run adb push or adb pull and get a progress bar using the 'bar' utility?
The main issue here is I think that adb expects two file names, if the input file could be replaced by stdin you could pipe through the 'bar' utility and get a progress bar. So far I haven't succeeded in doing so, but I'm not really a shell guru which is why I'm asking here :)
Note that I'm on Linux using bash.
It looks like the latest adb has progress support.
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)
However, the answers above also work for 'adb install' which do not have a progress option. I modified the first answer's script to work this way:
Create "adb-install.sh" somewhere in your PATH and run "adb-install.sh " instead of "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
Currently I have this little piece of 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. }
It works somewhat, it shows a progress bar going from 0 to 100 which is nice. However, it won't be correct if you do a lot of small files, and worse, the bytes/s and total bytes shown by 'bar' aren't correct.
I challenge you to improve on my script; it shouldn't be hard! ;)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With