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?
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
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é :
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
.
Tirez le fichier APK de l'appareil Android vers la boîte de développement.
adb pull /data/app/com.example.someapp-2.apk
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);
}
Lorsque vous avez installé le développement Eclipse pour Android:
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
.
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!
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
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)