Adb push/pull с индикатором выполнения
Это действительно раздражает, если вы adb нажимаете на большие файлы на устройство, чтобы не было способа, насколько это далеко продвинулось. Можно ли запустить adb push или adb pull и получить индикатор выполнения с помощью утилиты "bar"?
Основная проблема здесь: я думаю, что adb ожидает два имени файла, если входной файл может быть заменен на stdin, вы можете проехать через утилиту "bar" и получить индикатор выполнения. До сих пор мне это не удалось, но я на самом деле не гуру-оболочку, поэтому я спрашиваю здесь:)
Обратите внимание, что я использую Linux с помощью bash.
Ответы
Ответ 1
Похоже, что последняя версия adb имеет поддержку прогресса.
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)
Однако вышеприведенные ответы также работают для "adb install", у которых нет опции прогресса. Я изменил первый ответ script таким образом:
Создайте "adb-install.sh" где-нибудь в вашем PATH и запустите "adb-install.sh" вместо "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
Ответ 2
В настоящее время у меня есть этот маленький кусочек 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 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.
}
Он работает несколько, он показывает индикатор выполнения от 0 до 100, что приятно. Тем не менее, это не будет правильно, если вы сделаете много мелких файлов, и, что еще хуже, байты/с и суммарные байты, показанные "баром", неверны.
Я призываю вас улучшить мой script; это не должно быть сложно!;)
Ответ 3
Вот мое решение, оно покажет простой прогресс и текущий числовой ход.
[==================================================] 100%
Использование
./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
Тестирование на Ubuntu 14.04
$ bash --version
GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)
TODO
поддержка каталогов
Изменение размера панели результатов при изменении размера экрана
Ответ 4
Я сделал патч для adb, чтобы исправить это.
https://android-review.googlesource.com/#/c/87748
Ответ 5
QtADB имеет как общие, так и итоговые индикаторы выполнения. http://qtadb.wordpress.com/
Ответ 6
Ну, я могу дать вам идею:
ADB_TRACE=adb adb push <source> <destination>
возвращает журналы для любой команды, поэтому, например, команда копирования выглядит так:
writex: fd=3 len=65544: 4441544100000100000000021efd DATA....#....b..
здесь вы можете получить общую длину байтов раньше, используя ls -a, затем проанализируйте вывод adb с помощью grep или awk, увеличьте внутренний счетчик и отправьте текущий прогресс в утилиту bar.
Когда вы преуспели, отправьте script здесь.
Ответ 7
Я нашел Python pastebin, который является неполным, но близким: ему нужна поддержка \r
и аргументов.