web-dev-qa-db-fra.com

Comment obtenir un fichier apk depuis un appareil Android?

Comment puis-je obtenir le fichier apk depuis un appareil Android? Ou comment transférer le fichier apk d'un périphérique à un autre?

405
Finder

Utilisez adb . Avec adb pull, vous pouvez copier des fichiers de votre appareil sur votre système lorsque l’appareil est connecté à l’USB.

Bien entendu, vous devez également disposer des autorisations appropriées pour accéder au répertoire dans lequel se trouve votre fichier. Dans le cas contraire, vous devez d'abord rooter le périphérique.


Si vous constatez que de nombreux fichiers APK portent le nom "base.apk", vous pouvez également utiliser cette commande d'une ligne pour extraire tous les fichiers APK d'un téléphone auquel vous pouvez accéder en renommant tout nom "base.apk" en nom de package. Cela corrige également le problème d'annuaire introuvable pour les chemins d'accès APK avec des caractères apparemment aléatoires après le nom:

for i in $(adb Shell pm list packages | awk -F':' '{print $2}'); do adb pull "$(adb Shell pm path $i | awk -F':' '{print $2}')"; mv base.apk $i.apk 2&> /dev/null ;done

Si vous obtenez "adb: erreur: échec de stat objet distant" qui indique que vous n'avez pas les autorisations nécessaires. Je l'ai exécuté sur un Moto Z2 non rooté et j'ai pu télécharger TOUS les fichiers APK que je n'ai pas désinstallés (voir ci-dessous), à l'exception de YouTube.

adb Shell pm uninstall --user 0 com.Android.cellbroadcastreceiver   <--- kills presidential alert app!

(pour afficher les utilisateurs exécutant adb Shell pm list users) C’est un moyen de supprimer/désinstaller (pas du téléphone car il revient avec la réinitialisation usine) presque TOUTE APPLICATION SANS racine, y compris les applications système Astuce l'application de mise à jour ennuyeuse qui met à jour votre ligne téléphonique peut être trouvée par grepping pour "ccc")

71
Maurits Rijk

Aucune de ces suggestions n'a fonctionné pour moi, car Android ajoutait un numéro de séquence au nom du package pour générer le nom de fichier APK final. Sur les versions plus récentes d'Android (Oreo et Pie), une chaîne aléatoire imprévisible est ajoutée. La séquence de commandes suivante est celle qui a fonctionné pour moi sur un périphérique non rooted :

1) Déterminez le nom du package de l'application, par exemple. "com.example.someapp". Ignorez cette étape sivous connaissez déjà le nom du paquet.

adb Shell pm list packages

Parcourez la liste des noms de packages et essayez de trouver une correspondance entre l'application en question et le nom du package. Cela est généralement facile, mais notez que le nom du package peut ne pas avoir de lien avec le nom de l'application. Si vous ne pouvez pas reconnaître l'application dans la liste des noms de packages, essayez de la rechercher dans Google Play à l'aide d'un navigateur. L'URL d'une application dans Google Play contient le nom du package.

2) Obtenez le nom de chemin complet du fichier APK pour le package souhaité.

adb Shell pm path com.example.someapp

La sortie ressemblera à quelque chose comme
package: /data/app/com.example.someapp-2.apk
ou
package: /data/app/com.example.someapp-nfFSVxn_CTafgra3Fr_rXQ ==/base.apk

3) À l'aide du nom de chemin complet de l'étape 2, extrayez le fichier APK du périphérique Android vers la zone de développement.

adb pull /data/app/com.example.someapp-2.apk path/to/desired/destination
1322
Yojimbo

Aucune racine n'est requise:

Ce code obtiendra le chemin des paquets tiers avec le nom afin que vous puissiez facilement identifier votre APK

adb Shell pm list packages -f -3

la sortie sera 

package: /data/app/XX.XX.XX.apk=YY.YY.YY

maintenant, tirez ce paquet en utilisant le code ci-dessous:

adb pull /data/app/XX.XX.XX.apk

si vous avez exécuté ci-dessus cmd dans C:>\, alors vous trouverez ce paquet là.

102
Faris Al-Abed

J'ai vu que de nombreuses solutions à ce problème, soit vous devez rooter votre téléphone, soit vous devez installer une application. Puis après beaucoup de recherches sur Google, j’ai eu cette solution pour les téléphones non enracinés.

Pour lister les applications que vous avez obtenues jusqu'à présent.

adb Shell pm list packages

Ensuite, vous pouvez sélectionner une application, par exemple Twitter

adb backup -apk com.Twitter.Android

Une chose importante ici est de ne pas configurer de mot de passe pour chiffrer votre sauvegarde

Cela va créer un fichier nommé backup.ap, mais vous ne pouvez toujours pas l'ouvrir. Pour cela, vous devez extraire à nouveau, mais en utilisant la commande dd.

dd if=backup.ab bs=24 skip=1 | openssl zlib -d > backup.tar

Après cela, tout ce que vous avez à faire est d'extraire le contenu de goudron et c'est fait.

J'espère que ça marche pour vous les gars

51
C:\Users\xyz>adb Shell pm list packages -f | findstr whatsapp
package:/data/app/com.whatsapp-1/base.apk=com.whatsapp

C:\Users\xyz>adb pull /data/app/com.whatsapp-1/base.apk Desktop
/data/app/com.whatsapp-1/base.apk: 1 f.... 13.8 MB/s (32803925 bytes in 
2.269s)
17
RVR

Un liner qui fonctionne pour toutes les versions Android:

adb Shell 'cat `pm path com.example.name | cut -d':' -f2`' > app.apk
9
Vitaly Dyatlov

Complétant la réponse de @Yojimbo, voici ce que j’ai fait (Linux/Mac uniquement, cela ne fonctionnera pas immédiatement sous Windows ... peut-être dans le shell bash de git):

for i in $(adb Shell pm list packages -f -3 | cut -d= -f 1 | cut -d ":" -f 2); do adb pull $i; done

C'est moche, mais ça marche :)

EDIT: Il ne fonctionne plus sous AndroidM: tous les fichiers sont nommés "base.apk" sous un autre répertoire. Devrait être "trivial" pour résoudre.

8
elcuco

Comme indiqué ci-dessus, vous pouvez obtenir l'apk en utilisant la commande pull dans adb. 

Puisque vous parlez de vos applications installées, allez-y et regardez dans le répertoire/data/app de votre système de fichiers Android. Vous trouverez l'APK là-bas. 

Utilisez ensuite la commande adb - adb pull /data/data/appname.apk

6
aditya.gupta

Sur les systèmes Unix, vous pouvez essayer cette fonction:

function Android_pull_apk() {
    if [ -z "$1" ]; then
        echo "You must pass a package to this function!"
        echo "Ex.: Android_pull_apk \"com.Android.contacts\""
        return 1
    fi

    if [ -z "$(adb Shell pm list packages | grep $1)" ]; then
        echo "You are typed a invalid package!"
        return 1
    fi

    apk_path="`adb Shell pm path $1 | sed -e 's/package://g' | tr '\n' ' ' | tr -d '[:space:]'`"
    apk_name="`adb Shell basename ${apk_path} | tr '\n' ' ' | tr -d '[:space:]'`"

    destination="$HOME/Documents/Android/APKs"
    mkdir -p "$destination"

    adb pull ${apk_path} ${destination}
    echo -e "\nAPK saved in \"$destination/$apk_name\""
}
  • Exemple : Android_pull_apk com.Android.contacts
  • Remarque : Pour identifier le package: adb Shell pm list packages
6
Pedro Rodrigues

Si vous connaissez (ou si vous pouvez "deviner") le chemin d'accès au .apk (il semble avoir le format /data/app/com.example.someapp-{1,2,..}.apk à, alors vous pouvez simplement le copier à partir de /data/app. Cela fonctionnait même avec mon téléphone Android enraciné, stock.

Utilisez simplement une application Terminal Emulator (telle que celle-ci ) et exécutez:

# step 1: confirm path
ls /data/app/com.example.someapp-1.apk
# if it doesn't show up, try -2, -3. Note that globbing (using *) doesn't work here.
# step 2: copy (make sure you adapt the path to match what you discovered above)
cp /data/app/com.example.someapp-1.apk /mnt/sdcard/

Vous pouvez ensuite le déplacer de la carte SD où vous le souhaitez (ou le joindre à un courrier électronique, etc.). Le dernier bit peut être techniquement optionnel, mais cela vous simplifie la vie lorsque vous essayez de faire quelque chose avec le fichier .apk.

5
m01

Les procédures décrites ici ne fonctionnent pas pour Android 7 (Nougat) [et peut-être Android 6, mais je suis incapable de vérifier]. Vous ne pouvez pas extraire les fichiers .apk directement sous Nougat (sauf en mode racine, mais cela nécessite un téléphone enraciné). Mais, vous pouvez copier le fichier .apk sur un autre chemin (par exemple,/sdcard/Download) à l'aide du shell adb, puis vous pouvez extraire un adb de ce chemin.

5
SamG

Essayez cette commande one liner bash pour sauvegarder toutes vos applications:

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

Cette commande est dérivée de Le script de Firelord . Je viens de renommer tous les apks en leurs noms de paquet pour résoudre le problème avec le script elcuco , c'est-à-dire le même fichier base.apk écrasé sous Android 6.0 "Marshmallow" et les versions ultérieures.

Notez que cette commande ne sauvegarde que les applications tierces, car je ne vois pas l'intérêt de sauvegarder des applications intégrées. Mais si vous souhaitez également sauvegarder les applications système, omettez simplement l'option -3.

4
HEXcube

Toutes ces réponses nécessitent plusieurs étapes pour chaque fichier apk récupéré à partir du périphérique. 1. déterminez le nom du paquet, 2. trouvez le fichier et 3. téléchargez-le. J'ai construit un simple script python apk_grabber pour le faire pour toutes les applications qui correspondent à une expression rationnelle donnée, puis j'ai décompilé ces apks en fichiers jar.

3
Jeff Brateman

Voici comment vous le faites: 

Téléchargez et installez APK Extractor sur votre appareil. Il est gratuit et compatible avec presque tous les appareils Android. Un autre avantage est qu’il n’a même pas besoin de root ni de quoi que ce soit… .. Après l’avoir installé, lancez-le. Vous y verrez une liste des applications qui se trouvent sur votre appareil, y compris les applications que vous avez installées ultérieurement, ainsi que les applications du système. Appuyez longuement sur l'application que vous voulez extraire (vous pouvez sélectionner plusieurs applications ou toutes les applications à la fois), puis cliquez sur l'option d'extrait que vous voyez en haut. Vous aurez également la possibilité de partager via Bluetooth ou la messagerie . Vous avez terminé, vous verrez les applications extraites sous le nom AppName_AppPackage_AppVersionName_AppVersionCode.apk, qui seront enregistrées dans le chemin/sdcard/ExtreatedApks/par défaut.

Pour une description détaillée de comment extraire des fichiers apk sous Android , visitez: http://appslova.com/how-to-extract-apk-files-in-Android/

3
Pramod Mahato

Étapes pour télécharger l'APK de l'appareil au bureau

A) Assurez-vous que vous utilisez (émulateur/périphérique réel). Pour vérifier utiliser cette commande

adb devices

B) Sélectionnez toute la liste de paquets disponibles installés sur votre appareil. Vous pouvez utiliser la commande grep pour sélectionner le package spécifique que vous souhaitez télécharger.

adb Shell pm list packages
adb Shell pm list packages -f -3

Sortie (Liste des packages disponibles)

package:/data/app/com.example.mytestapplication-sOzKi5USzfbYLPNDmaaK6g==/base.apk=com.example.mytestapplication
package:/data/app/com.example.myapplication-nd1I4FGnTZnQ9PyRbPDHhw==/base.apk=com.example.myapplication

C) Copiez le package (que vous souhaitez télécharger) à partir du lien ci-dessus. Je choisis ce paquet (com.example.myapplication)

Syntex: adb Shell pm path [your_package_name]
Command: adb Shell pm path com.example.myapplication

Sortie

package:/data/app/com.example.myapplication-nd1I4FGnTZnQ9PyRbPDHhw==/base.apk

D) Enfin, télécharger l'APK de votre (émulateur/appareil réel) 

Syntex: adb pull /data/app/[your_package_name]-1/base.apk  [your_destination_path]
Command: adb pull /data/app/com.example.myapplication-3j4CVk0Tb2gysElgjz5O6A==/base.apk /Users/$(whoami)/Documents/your_apk.apk

Exemple: tentative d'extraire ce fichier CertInstaller.apk sur votre ordinateur local (Mac) 

adb pull /system/app/CertInstaller/CertInstaller.apk /Users/$(whoami)/Documents/APK/download_apk/

E) Confirmer dans votre répertoire local 

ls -la /Users/$(whoami)/Documents/
2
Farid Haq

voulez très, très confortable solution 1 minute?

juste vous cette application https://play.google.com/store/apps/details?id=com.cvinfo.filemanager (gestionnaire de fichiers intelligent de Google Play).

appuyez sur "Applications", choisissez-en une et appuyez sur "Sauvegarder". il se retrouvera sur votre système de fichiers dans le dossier app_backup;)

1
user3350906

Je n'ai pas utilisé de code pour extraire un fichier .apk depuis un mobile, mais j'utilise un logiciel pour extraire un fichier .apk depuis un mobile.

  1. Gestionnaire de fichiers ES File Explorer
  2. ASTRO Cloud & File Manager 3. Câble de données logicielles

J'espère que cela vous aide.

1
surhidamatya

Encore un autre script bash (c’est-à-dire que cela fonctionnera pour la plupart des systèmes basés sur Unix). Basé sur la réponse de Pedro Rodrigues , mais est légèrement plus facile à utiliser.

Améliorations par rapport à la version de Pedro:

  1. L'approche originale ne fonctionnait pas pour moi sur Android 7: adb pull n'arrêtait pas de se plaindre de no such file or directory tandis que adb Shell pouvait accéder au fichier. J'ai donc utilisé une approche différente, avec fichier temporaire.
  2. Une fois lancé sans arguments, mon script ne listera que tous les paquets disponibles. Lorsque le nom du paquet partiel est fourni, il essaiera de deviner le nom complet du paquet. Il se plaindra s'il y a plusieurs extensions possibles.
  3. Je ne code pas le chemin de destination; au lieu de cela, les fichiers APK sont enregistrés dans le répertoire de travail actuel.

Enregistrez ceci dans un fichier exécutable:

#!/bin/bash
# Obtain APK file for given package from the device connected over ADB

if [ -z "$1" ]; then
    echo "Available packages: "
    adb Shell pm list packages | sed 's/^package://'
    echo "You must pass a package to this function!"
    echo "Ex.: Android_pull_apk \"com.Android.contacts\""
    exit 1
fi

fullname=$(adb Shell pm list packages | sed 's/^package://' | grep $1)
if [ -z "$fullname" ]; then
    echo "Could not find package matching $1"
    exit 1
fi
if [ $(echo "$fullname" | wc -l) -ne 1 ]; then
    echo "Too many packages matched:"
    echo "$fullname"
    exit 1
fi
echo "Will fetch APK for package $fullname"

apk_path="`adb Shell pm path $fullname | sed -e 's/package://g' | tr '\n' ' ' | tr -d '[:space:]'`"
apk_name="`basename ${apk_path} | tr '\n' ' ' | tr -d '[:space:]'`"

destination="${fullname}.apk"

tmp=$(mktemp --dry-run --tmpdir=/sdcard --suffix=.apk)
adb Shell cp "${apk_path}" "$tmp"
adb pull "$tmp" "$destination"
adb Shell rm "$tmp"

[ $? -eq 0 ] && echo -e "\nAPK saved in \"$destination\""
0
MarSoft

Méthode sans racine ni outils ADB requis . Installez MyAppSharer app à partir du Play Store.

0
moberme

J'ai un does not exist error

Voici comment je le fais fonctionne

adb Shell pm list packages -f | findstr zalo
package:/data/app/com.zing.zalo-1/base.apk=com.zing.zalo

adb Shell
mido:/ $ cp /data/app/com.zing.zalo-1/base.apk /sdcard/zalo.apk
mido:/ $ exit


adb pull /sdcard/zalo.apk Desktop

/sdcard/zalo.apk: 1 file pulled. 7.7 MB/s (41895394 bytes in 5.200s)
0
vanduc1102

J'ai vraiment aimé toutes ces réponses ... La plupart des scripts à exporter et renommer ont tous été écrits en Bash ... J'ai créé un petit script Perl qui fait la même chose (qui devrait fonctionner à la fois en Perl pour Windows et Linux, uniquement testé sur Ubuntu).

download-apk.pl

#!/usr/bin/Perl -w
# Automatically export all available installed APK's using adb
use strict;
print "Connect your device...\n";
system("adb", "wait-for-device");
open(my $OUT, '-|', 'adb', 'Shell', 'pm', 'list', 'package', '-f');
my @list = split(/\s*/, `adb Shell pm list packages -f`);
my $count = 0;
while(my $line = <$OUT>) {
        $line =~ s/^\s*|\s*$//g;
        my ($type, $path, $package) = $line =~ /^(.*?):(.*)=(.*)$/ ? ($1,$2,$3) : die('invalid line: '.$line);
        my $category = $path =~ /^\/(.*?)\// ? $1 : 'unknown';
        my $baseFile = $path =~ /\/([^\/]*)$/ ? $1 : die('Unknown basefile in path: '.$path);
        my $targetFile = "$category-$package.apk";
        print "$type $category $path $package $baseFile >> $targetFile\n";
        system("adb", "pull", $path);
        rename $baseFile, $targetFile;
}
  1. Assurez-vous que adb (.exe) est dans votre chemin ou même répertoire
  2. Connectez votre téléphone
  3. Lancer download-apk.pl

La sortie est quelque chose de similaire à:

# ./download-apk.pl
Connect your device...
* daemon not running. starting it now on port 5037 *
* daemon started successfully *
package system /system/app/YouTube/YouTube.apk com.google.Android.youtube YouTube.apk >> system-com.google.Android.youtube.apk
5054 KB/s (11149871 bytes in 2.154s)
package data /data/app/com.ghostsq.commander-1/base.apk com.ghostsq.commander base.apk >> data-com.ghostsq.commander.apk
3834 KB/s (1091570 bytes in 0.278s)
package data /data/app/de.blinkt.openvpn-2/base.apk de.blinkt.openvpn base.apk >> data-de.blinkt.openvpn.apk
5608 KB/s (16739178 bytes in 2.914s)
etc.
0
Gerben Versluis

Le plus simple est: Installez l'application "ShareIt" sur le téléphone . Installez maintenant l'application shareIt sur un PC ou un autre téléphone . Maintenant, à partir du téléphone où l'application est installée, ouvrez ShareIt et envoyez . Sur un autre téléphone ou PC, ouvrez ShareIt et recevez.

0
Sirsendu
  1. Ouvrez l'application dont vous souhaitez extraire l'apk sur votre téléphone.
  2. Obtenez l'application actuellement ouverte avec:

    adb Shell dumpsys activity activities | grep mFocusedActivity
    
  3. Obtenir le chemin du nom du paquet

    adb Shell pm path <packagename.apk>
    

4.Copiez le chemin que vous avez trouvé dans le répertoire sdcard 

    adb Shell cp /data/app/<packagename.apk> /sdcard

5. Tirez l'apk

    adb pull /sdcard/base.apk
0
Bryan Ibrahim