1 votes

Sauvegarde de tous les apks du périphérique en utilisant adb : pourquoi cette boucle dans le script bash ne fonctionne pas ?

Vous pouvez faire adb shell pm list packages et, après avoir lu la liste, faire un adb shell pm path "com.yourpackage" pour obtenir le chemin complet et faire un simple adb pull .

Le fait est que : Je veux automatiser tout ça. J'ai pensé à un script bash très simple :

for apk in $(adb shell pm list packages | sed 's/package://g' | sort); do
    # If you just do an echo, IT WORKS
    # echo $apk
    # But here it doesn't work
    adb shell pm path $apk
done

Mais cela ne fonctionne tout simplement pas. Il semble que "$apk" devienne perdu ou quelque chose comme ça et rien n'est montré dans cet extrait. Je ne sais pas si c'est un problème de sous-shell, ou une particularité lors de l'utilisation de variables qui sont passées par un shell adb.

Devrais-je créer un script apks.sh en utilisant simplement pm list pour et autres, le pousser sur mon appareil, exécuter adb shell une seule fois et exécuter apks.sh ?

4voto

Firelord Points 23064

Cela ne fonctionne pas car adb ajoute un retour chariot dans la sortie. Vous pouvez lire Réponse de Gilles pour plus d'informations à ce sujet.

Tout ce que vous avez à faire est d'enlever le retour chariot. Voici votre script modifié :

#!/bin/bash

for package in $(adb shell pm list packages | tr -d '\\r' | sed 's/package://g'); do
    apk=$(adb shell pm path $package | tr -d '\\r' | sed 's/package://g');
    echo "Pulling $apk";
    adb pull -p "$apk";
done

Vous pouvez utiliser -p con adb pull si seulement vous avez la version 1.0.32 ou supérieure de adb. sort n'est pas nécessaire, à mon avis.

3voto

J'ai dérivé une commande bash en une ligne à partir de La réponse géniale de Firelord :

for package in $(adb shell pm list packages -3 | tr -d '\r' | sed 's/package://g'); do apk=$(adb shell pm path $package | tr -d '\r' | sed 's/package://g'); echo "Pulling $apk"; adb pull -p $apk "$package".apk; done

Changements/améliorations par rapport à la version originale :

  • Sauvegarde uniquement les applications tierces, car je ne vois pas l'intérêt de sauvegarder les applications intégrées. Cependant, si vous voulez sauvegarder les applications du système aussi, il suffit de sauter l'option -3 drapeau.
  • Renomme tous les apks avec leur nom de paquet au lieu d'écraser le même nom. base.apk dans Android 6.0 "Marshmallow" et plus.

androidalle.com

AndroidAlle est une communauté de androiders où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X