web-dev-qa-db-fra.com

adb Push / pull avec barre de progression

C'est vraiment ennuyeux si vous ajoutez/transférez des fichiers volumineux sur l'appareil qu'il n'y a aucun moyen de savoir jusqu'où il se trouve. Est-il possible d'exécuter adb Push ou adb pull et d'obtenir une barre de progression en utilisant l'utilitaire 'bar'?

Le problème principal ici est que je pense que adb attend deux noms de fichiers, si le fichier d'entrée peut être remplacé par stdin, vous pouvez diriger l'utilitaire 'bar' et obtenir une barre de progression. Jusqu'à présent, je n'ai pas réussi à le faire, mais je ne suis pas vraiment un gourou de Shell, c'est pourquoi je pose la question ici :)

Notez que je suis sous Linux en utilisant bash.

34
darkwings

Il semble que la dernière adb ait un support de progression.

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)

Cependant, les réponses ci-dessus fonctionnent également pour 'adb install' qui n'a pas d'option de progression. J'ai modifié le script de la première réponse pour fonctionner de cette façon:

Créez "adb-install.sh" quelque part dans votre CHEMIN et exécutez "adb-install.sh" au lieu de "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
28
jpage4500

Actuellement, j'ai ce petit morceau de 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.
}

Ça marche un peu, ça montre une barre de progression allant de 0 à 100 ce qui est sympa. Cependant, ce ne sera pas correct si vous faites beaucoup de petits fichiers, et pire encore, les octets/s et le nombre total d'octets affichés par 'bar' ne sont pas corrects.

Je vous mets au défi d'améliorer mon script; ça ne devrait pas être difficile! ;)

14
darkwings

J'ai fait un patch pour adb pour résoudre ce problème.

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

9
user3408864

Voici ma solution, elle affichera une barre de progression simple et la progression numérique actuelle

[==================================================] 100%

Usage

./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 

Test sur Ubuntu 14.04

$ bash --version
GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)

À FAIRE

support d'annuaire

la taille de la barre de progression change lorsque la taille de l'écran change

8
alijandro

QtADB a des barres de progression par fichier et total. http://qtadb.wordpress.com/

4
nuclearmistake

Eh bien, je peux vous donner une idée:

ADB_TRACE=adb adb Push <source> <destination> 

renvoie des journaux pour toute commande, par exemple la commande copy, qui ressemble à:

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

ici, vous pouvez obtenir la longueur totale des octets avant, avec ls -a, puis analyser la sortie d'adb avec grep ou awk, incrémenter un compteur interne et envoyer la progression actuelle à l'utilitaire bar.

Lorsque vous avez réussi, veuillez publier le script ici.

4
joecks

J'ai trouvé un Python Pastebin qui est incomplet mais proche: il a besoin d'un \r et support des arguments.

1
chx