adb push / pull с индикатором выполнения - PullRequest
34 голосов
/ 06 июля 2011

Это действительно раздражает, если вы добавляете push / pull большие файлы к устройству, так как нет никакого способа узнать, как далеко оно находится. Можно ли запустить adb push или adb pull и получить индикатор выполнения с помощью утилиты 'bar'?

Основная проблема здесь, я думаю, что adb ожидает два имени файла, если входной файл можно заменить на stdin, вы можете передать через утилиту 'bar' и получить индикатор выполнения. Пока что мне это не удалось, но я на самом деле не гуру оболочки, поэтому я спрашиваю здесь:)

Обратите внимание, что я использую bash для Linux.

Ответы [ 7 ]

28 голосов
/ 09 января 2015

Похоже, что последний 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', у которой нет параметра прогресса. Я изменил скрипт первого ответа, чтобы он работал следующим образом:

Создайте "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: /8209483/adb-push-pull-s-indikatorom-vypolneniya

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
14 голосов
/ 13 июля 2011

В настоящее время у меня есть небольшой кусочек 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', неверны.

Я призываю вас улучшить мойсценарий;это не должно быть сложно!;)

9 голосов
/ 12 марта 2014

Я сделал патч для adb, чтобы это исправить.

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

8 голосов
/ 30 декабря 2014

Вот мое решение, оно покажет простой индикатор выполнения и текущий числовой прогресс

[==================================================] 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 голосов
/ 27 апреля 2012

QtADB имеет как отдельные файлы, так и общие индикаторы выполнения.http://qtadb.wordpress.com/

4 голосов
/ 06 июля 2011

Ну, я могу дать вам идею:

ADB_TRACE=adb adb push <source> <destination> 

возвращает журналы для любой команды, например, для команды копирования, которая выглядит следующим образом:

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

здесь вы можете получить общую длину байтов раньше, с помощью ls -a, затем проанализировать вывод adb с помощью grep или awk, увеличить внутренний счетчик и отправить текущий прогресс утилите bar.

Если вам это удалось, пожалуйста, опубликуйте скрипт здесь.

1 голос
/ 23 декабря 2014

Я нашел Python pastebin , который является неполным, но близким: ему требуется \r и поддержка аргументов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...