Comment obtenir l'APK d'une application installée sans accès root?

196

J'essaie d'extraire le fichier APK d'une application Android installée SANS autorisations root.

Je pensais que cela était impossible, car tous les fichiers APK pour les applications non système se trouvent dans / data / app, et l'accès à ce dossier nécessite une autorisation root. Ensuite, j'ai constaté qu'il existe de nombreuses applications dans le Google Play Store qui semblent avoir accès aux fichiers APK même sur des appareils non rootés.

Quelqu'un peut-il me dire comment cela est possible? N'y a-t-il pas des applications de sauvegarde qui sauvegardent les fichiers APK sans root?

pinas
la source
2
Je pense que cette question est déjà répondu. Veuillez jeter un œil à stackoverflow.com/a/12197924/1016544
Wahib Ul Haq
2
Copie possible de Comment puis-je obtenir un fichier apk à partir d'un appareil Android?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
3
Ma lecture de ceci est que @pinas demandait comment coder cela par programmation - référençant les applications qui le font comme pour dire "Ces applications le font, mais comment?". La raison «en attente» ici est erronée à mon avis à cause de cela.
Richard Le Mesurier

Réponses:

380

L'accès à / data / app est possible sans autorisation root; les autorisations sur ce répertoire sont rwxrwx - x. Exécuter l'autorisation sur un répertoire signifie que vous pouvez y accéder, mais l'absence d'autorisation de lecture signifie que vous ne pouvez pas obtenir une liste de son contenu - donc pour y accéder, vous devez connaître le nom du fichier auquel vous accéderez. Le gestionnaire de packages d'Android vous indiquera le nom de l'apk stocké pour un package donné.

Pour ce faire à partir de la ligne de commande, utilisez adb shell pm list packagespour obtenir la liste des packages installés et recherchez le package souhaité.

Avec le nom du package, nous pouvons obtenir le nom de fichier réel et l'emplacement de l'APK en utilisant adb shell pm path your-package-name.

Et connaissant le répertoire complet, nous pouvons enfin extraire l'adb en utilisant adb pull full/directory/of/the.apk

Nous remercions @tarn d'avoir souligné que sous Lollipop, le chemin apk sera /data/app/your-package-name-1/base.apk

mah
la source
33
Pour ce faire à partir de la ligne de commande, utilisez adb shell pm list packagespour obtenir la liste des packages installés, choisissez le package souhaité, ajoutez -1.apk-le et extrayez-le /data/app. Exemple: si le nom du package est org.mozilla.firefox, utilisez adb pull /data/app/org.mozilla.firefox-1.apk.
sschuberth
11
Pour obtenir le nom de fichier réel de l'APK, utilisez adb shell pm path your-package-name. Voir cette question pour une réponse plus détaillée stackoverflow.com/questions/4032960/…
Yojimbo
2
pour lollipop, le chemin apk sera /data/app/your-package-name-1/base.apk
tarn
Ça ne marche pas pour moi. adb: error: remote object '/data/app/com.Slack-1/base.apk' does not exist
J'obtiens l'
1
@ 0xcaff Android a beaucoup changé depuis 5 ans que cette réponse a été fournie; peut-être que cette voie fait partie de ces changements. Vous devriez pouvoir vous connecter et localiser le fichier manuellement afin de trouver le chemin approprié à votre version du système d'exploitation.
mah
55

Android ajoute un numéro de séquence au nom du package pour produire le nom de fichier APK final (il est possible que cela varie selon la version d'Android OS). La séquence de commandes suivante fonctionne sur un périphérique non rooté :

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

    adb shell pm path com.example.someapp

    Cela donne la sortie comme: package:/data/app/com.example.someapp-2.apk.

  2. Tirez le fichier APK de l'appareil Android vers la boîte de développement.

    adb pull /data/app/com.example.someapp-2.apk

L'emplacement de l'APK après une extraction réussie sera à ../sdk/platform-tools/base.apk sur votre PC / ordinateur portable.

Yojimbo
la source
4
Peut confirmer que cette solution a fonctionné sur un périphérique non rooté, mais nécessite la connaissance du nom du package avant la première commande! Utilisez «adb shell pm list packages» pour obtenir une liste de tous les packages sur le téléphone au cas où vous ne seriez pas sûr du nom du package de votre application souhaitée
AndroidNoob
Dans quel dossier de la machine locale de l'extracteur l'apk va-t-il? EDIT: nvm, quel que soit le répertoire dans lequel vous vous trouviez lorsque vous faites l'adb pull ...
Adam Johns
@IgorGanapolsky essayez d'utiliser adb pull /data/app/com.example.someapp-2/base.apk
Chris - Jr
@zelanix après avoir fait adb pull, où je peux c le fichier .apk. Merci
Vijaya Varma Lanke
21

Vous n'avez pas besoin d'autorisations ROOT pour obtenir la liste des applications installées.

Vous pouvez le faire avec android PackageManager.

Vous trouverez ci-dessous un petit extrait de code.

final PackageManager pm = getPackageManager();
//get a list of installed apps.
List<ApplicationInfo> packages =  pm.getInstalledApplications(PackageManager.GET_META_DATA);

for (ApplicationInfo packageInfo : packages) {
    Log.d(TAG, "Installed package :" + packageInfo.packageName);
    Log.d(TAG, "Apk file path:" + packageInfo.sourceDir);
}
Sagar Waghmare
la source
7
  1. vérifiez la liste des apk installés (la commande suivante indique également le chemin où il est installé et le nom du package). adb shell pm list packages -f
  2. utilisez adb pull / package_path / package name / path_in_pc (chemin d'accès au package et nom du package que l'on peut obtenir à partir de la commande 1 ci-dessus).
goldy021
la source
6

Lorsque vous avez installé le développement Eclipse pour Android:

  • Utilisez votre appareil comme appareil de débogage. Sur votre téléphone: Paramètres> Applications> Développement et activez le débogage USB, voir http://developer.android.com/tools/device.html
  • Dans Eclipse, ouvrez la fenêtre DDMS: Fenêtre> Ouvrir la perspective> Autre ...> DDMS, voir http://developer.android.com/tools/debugging/ddms.html
  • Si vous ne voyez pas votre appareil, essayez de (ré) installer le pilote USB pour votre appareil
  • Dans le volet central, sélectionnez l'onglet "Explorateur de fichiers" et accédez à système> application
  • Vous pouvez maintenant sélectionner un ou plusieurs fichiers puis cliquer sur l'icône "Extraire un fichier de l'appareil" en haut (à droite des onglets)
  • Sélectionnez le dossier cible - tada!
anon
la source
Il n'y a que des applications système (alias applications préinstallées) dans / system / app.
arne.jans
6

Sur Nougat (7.0), la version Android s'exécute adb shell pm list packagespour répertorier les packages installés sur l'appareil. Ensuite, exécutez adb shell pm path your-package-namepour montrer le chemin de l'apk. Après avoir utilisé adb pour copier le package dans Téléchargements adb shell cp /data/app/com.test-1/base.apk /storage/emulated/0/Download. Ensuite, tirez l'apk de Téléchargements sur votre machine en exécutant adb pull /storage/emulated/0/Download/base.apk.

Buhiire Keneth
la source
2

j'ai un does not exist error

Voici comment je le fais fonctionner:

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)
vanduc1102
la source
0

Liste PackageManager.getInstalledApplications () vous donnera une liste des applications installées et ApplicationInfo.sourceDir est le chemin d'accès au fichier .apk.

// in oncreate
   PackageManager pm = getPackageManager(); 
   for (ApplicationInfo app : pm.getInstalledApplications(0)) {
 Log.d("PackageList", "package: " + app.packageName + ", sourceDir: " + app.sourceDir);
 }

//output is something like
D/PackageList(5010): package: com.example.xmlparse, sourceDir: /data/app   /com.example.xmlparse-2.apk
D/PackageList(5010): package: com.examples.android.calendar, sourceDir: /data/app/com.examples.android.calendar-2.apk
D/PackageList(5010): package: com.facebook.katana, sourceDir: /data/app/com.facebook.katana-1.apk
D/PackageList(5010): package: com.facebook.samples.profilepicture, sourceDir: /data/app/com.facebook.samples.profilepicture-1.apk
D/PackageList(5010): package: com.facebook.samples.sessionlogin, sourceDir: /data/app/com.facebook.samples.sessionlogin-1.apk
D/PackageList(5010): package: com.fitworld, sourceDir: /data/app/com.fitworld-2.apk
D/PackageList(5010): package: com.flipkart.android, sourceDir: /data/app/com.flipkart.android-1.apk
D/PackageList(5010): package: com.fmm.dm, sourceDir: /system/app/FmmDM.apk
D/PackageList(5010): package: com.fmm.ds, sourceDir: /system/app/FmmDS.apk
Pankaj Arora
la source
0

J'ai trouvé un moyen d'obtenir le nom du package de l'APK dans un appareil non root. ce n'est pas si élégant, mais ça marche tout le temps.

Étape 1 : sur votre appareil, ouvrez l'APK cible

Étape 2 : sur la fenêtre PC cmd, tapez ces commandes:

 adb shell dumpsys activity a > dump.txt

la sortie de cette commande étant nombreuse, la redirection vers un fichier est recommandée.

Étape 3 : ouvrez ce fichier dump.txt avec n'importe quel éditeur.

pour l'appareil avant Android 4.4:
le début du fichier ressemblerait à ceci:

ACTIVITY MANAGER ACTIVITIES (dumpsys activity activities)  
  Main stack:  
  * TaskRecord{41aa9ed0 #4 A com.tencent.mm U 0}  
    numActivities=1 rootWasReset=true userId=0  
    affinity=com.tencent.mm  
    intent={act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10600000 cmp=com.tencent.mm/.ui.LauncherUI}  
    realActivity=com.tencent.mm/.ui.LauncherUI  
    askedCompatMode=false  
    lastThumbnail=null lastDescription=null  
    lastActiveTime=19915965 (inactive for 10s)  
    * Hist #9: ActivityRecord{41ba1a30 u0 com.tencent.mm/.ui.LauncherUI}  
        packageName=com.tencent.mm processName=com.tencent.mm 

le nom du package se trouve sur la 3ème ligne, com.tencent.mm pour cet exemple.

pour Android 4.4 et
versions ultérieures: la sortie de dumpsys a légèrement changé. essayez de rechercher "Stack # 1", le nom du paquet serait très proche en dessous.

Aussi, recherchez "baseDir", vous trouverez le chemin complet du fichier apk!

Balançoire
la source
-1

Ouvrez ES explorer -> appuyez sur le bouton Menu dans le coin supérieur gauche (trois bandes horizontales) -> dans la section Bibliothèques, choisissez APP.

Ainsi, vous obtenez la liste de toutes les applications utilisateur. Trouvez votre application et sélectionnez-la en appuyant longuement dessus. Appuyez ensuite sur "Plus" dans le coin inférieur droit et choisissez "Envoyer". Ensuite, vous pouvez utiliser différentes options, par exemple, vous pouvez choisir "ES Save To" afin d'enregistrer le fichier .apk dans votre répertoire personnel ou ailleurs.

JenyaKh
la source
-2

Ou vous pouvez obtenir «Transfert de fichiers Bluetooth» depuis Google Play et définir le dossier de départ sur /system/. Ensuite, vous pouvez même aller à /.

AJD
la source