web-dev-qa-db-fra.com

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

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

Je pensais que cela était impossible, car tous les fichiers APK des applications non-système se trouvent dans/data/app, et l'accès à ce dossier nécessite l'autorisation root. Ensuite, j'ai trouvé que de nombreuses applications dans le Google Play Store semblaient 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?

164
pinas

L'accès à/data/app est possible sans autorisation root; les autorisations sur ce répertoire sont rwxrwx - x. Exécuter la permission sur un répertoire signifie que vous pouvez y accéder. Toutefois, le manque de permission de lecture empêche d'obtenir une liste de son contenu. Pour y accéder, vous devez connaître le nom du fichier auquel vous allez accéder. Le gestionnaire de paquets d'Android vous dira le nom de l'apk stocké pour un paquet donné.

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

Avec le nom du paquet, nous pouvons obtenir le nom de fichier actuel et l'emplacement du fichier APK à l'aide de 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 pour avoir signalé que, sous Lollipop, le chemin d'accès apk sera /data/app/your-package-name-1/base.apk

339
mah

Android ajoute un numéro de séquence au nom du package pour générer le nom de fichier APK final (il est possible que cela varie avec la version du système d'exploitation Android). 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 le résultat sous la forme: 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
    
46
Yojimbo

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);
}
17
Sagar Waghmare
  1. vérifiez la liste des apk installés (la commande suivante répertorie également le chemin où elle est installée et le nom du paquet) . adb Shell pm list packages -f
  2. utilisez adb pull/chemin_package/nom du paquet/chemin_in_pc (chemin du paquet et nom du paquet que l'on peut obtenir en utilisant la commande 1 ci-dessus)
6
goldy021

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 activer 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 du milieu, sélectionnez l'onglet "Explorateur de fichiers" et sélectionnez Système> Application.
  • Maintenant, vous pouvez sélectionner un ou plusieurs fichiers, puis cliquer sur l'icône "Extraire un fichier .__ du périphérique" en haut (à droite des onglets).
  • Sélectionnez le dossier cible - tada!
6
anon

Sous Nougat (7.0), exécutez adb Shell pm list packages pour répertorier les packages installés sur l'appareil . Exécutez ensuite adb Shell pm path your-package-name pour afficher le chemin d'accès à l'apk . Après avoir utilisé adb, copiez-le dans Téléchargements adb Shell cp /data/app/com.test-1/base.apk /storage/emulated/0/Download. Tirez l'apk de Téléchargements sur votre machine en exécutant adb pull /storage/emulated/0/Download/base.apk.

5
Buhiire Keneth

J'ai trouvé un moyen d'obtenir le nom du package de l'APK dans un périphérique 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 de commande du PC, tapez les commandes suivantes:

 adb Shell dumpsys activity a > dump.txt

la sortie de cette commande étant nombreuse, il est recommandé de rediriger vers un fichier.

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

pour 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 paquet est dans la 3ème ligne, com.tencent.mm pour cet exemple.

pour Android 4.4 et versions ultérieures:
la sortie de dumpsys a un peu changé. Essayez de chercher "Pile n ° 1", le nom du paquet serait très proche en dessous.

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

0
Swing

List PackageManager.getInstalledApplications () vous donnera une liste des applications installées, et ApplicationInfo.sourceDir est le chemin du 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
0
Pankaj Arora

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