web-dev-qa-db-ja.com

adbプッシュ/プルとプログレスバー

大きなファイルをデバイスにプッシュ/プルする場合、それがどれだけ進んでいるかを知る方法はありません。 adb Pushまたはadb pullを実行し、 'bar'ユーティリティを使用して進行状況バーを取得することは可能ですか?

ここでの主な問題は、adbが2つのファイル名を想定していることです。入力ファイルをstdinで置き換えることができれば、「bar」ユーティリティをパイプ処理して進行状況バーを取得できます。これまでのところ成功していませんが、実際にはシェルの第一人者ではないため、ここで質問します:)

Linuxではbashを使用していることに注意してください。

34
darkwings

最新の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インストール」でも機能します。最初の回答のスクリプトを次のように変更しました。

PATHのどこかに「adb-install.sh」を作成し、「adb install -f」の代わりに「adb-install.sh」を実行します

#!/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
28
jpage4500

現在、私はこの小さな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」で示されるバイト/秒と合計バイト数は正しくありません。

私のスクリプトを改善するようにお願いします。難しいことではありません! ;)

14
darkwings

これを修正するパッチをadbに作成しました。

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

9
user3408864

これが私の解決策です、単純な進行状況バーと現在の数値の進行状況が表示されます

[==================================================] 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 [〜#〜]

ディレクトリのサポート

画面サイズが変わるとプログレスバーのサイズが変わる

8
alijandro

QtADBには、ファイルごとのプログレスバーと合計プログレスバーの両方があります。 http://qtadb.wordpress.com/

4
nuclearmistake

さて私はあなたにアイデアを与えることができます:

ADB_TRACE=adb adb Push <source> <destination> 

任意のコマンドのログを返します。たとえば、次のようなcopyコマンドを返します。

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

ここでは、ls -aを使用して前に合計バイト長を取得し、次にgrepまたはawkを使用してadbの出力を解析し、内部カウンターをインクリメントして、現在の進行状況をバーユーティリティに送信できます。

成功したら、こちらにスクリプトを投稿してください。

4
joecks

Python Pastebin は見つかりましたが、不完全ですが近いです。\rと引数のサポートが必要です。

1
chx