adb推/拉进度条

如果您将大文件推送/拉出到设备,现在还没有办法,那么真的很烦人。 是否可以运行adb push或adb pull并使用“bar”工具获取进度条

这里的主要问题是我认为adb需要两个文件名,如果input文件可以用stdinreplace,你可以通过“bar”工具pipe道并获得一个进度条。 到目前为止,我还没有成功,但我不是一个真正的shell大师,这就是为什么我在这里问:)

请注意,我在Linux上使用bash。

Solutions Collecting From Web of "adb推/拉进度条"

它看起来像最新的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”。 我修改了第一个答案的脚本以这种方式工作:

在PATH的某处创建“adb-install.sh”,运行“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 

目前我有这一小块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. } 

它有点作用,它显示进度条从0到100这是很好的。 但是,如果你做了很多小文件,这将是不正确的,更糟糕​​的是,'bar'显示的字节数和总字节数是不正确的。

我挑战你改进我的剧本; 它不应该很难! ;)

这是我的解决方案,它会显示一个简单的进度条和当前的数字进度

 [==================================================] 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) 

去做

目录支持

屏幕大小更改时进度栏大小更改

我做了一个补丁来解决这个问题。

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

QtADB具有每个文件和总进度条。 http://qtadb.wordpress.com/

那么我可以给你一个想法:

 ADB_TRACE=adb adb push <source> <destination> 

返回任何命令的日志,例如复制命令,如下所示:

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

在这里你可以用ls -a得到总字节长度,然后用grep或awk解析adb的输出,增加一个interneral计数器并把当前进度发送到bar工具。

当你成功了,请在这里发表脚本。

我发现了一个不完整但接近的Python pastebin :它需要一个\r和参数支持。