Ich versuche, die APK-Datei einer installierten Android-App OHNE Root-Berechtigungen zu extrahieren.
Ich dachte, dies sei unmöglich, da sich alle APK-Dateien für Nicht-System-Apps in/data/app befinden und der Zugriff auf diesen Ordner eine Root-Berechtigung erfordert. Dann habe ich festgestellt, dass es im Google Play Store zahlreiche Apps gibt, die auch auf nicht gerooteten Geräten Zugriff auf die APK-Dateien zu haben scheinen.
Kann mir jemand sagen, wie das möglich ist? Gibt es keine Sicherungs-Apps, die die APK-Dateien ohne Root sichern?
Der Zugriff auf/data/app ist ohne Root-Berechtigung möglich. Die Berechtigungen für dieses Verzeichnis lauten rwxrwx - x. Ausführungsberechtigung für ein Verzeichnis bedeutet, dass Sie auf das Verzeichnis zugreifen können. Aufgrund fehlender Leseberechtigung können Sie jedoch keine Auflistung des Inhalts aufrufen. Um auf das Verzeichnis zugreifen zu können, müssen Sie den Namen der Datei kennen, auf die Sie zugreifen. Der Paketmanager von Android teilt Ihnen den Namen der gespeicherten apk für ein bestimmtes Paket mit.
Verwenden Sie hierzu adb Shell pm list packages
von der Befehlszeile aus, um die Liste der installierten Pakete abzurufen und das gewünschte Paket zu suchen.
Mit dem Paketnamen können wir den tatsächlichen Dateinamen und den Ort des APK mithilfe von adb Shell pm path your-package-name
abrufen.
Und wenn wir das vollständige Verzeichnis kennen, können wir endlich die Adresse mithilfe von adb pull full/directory/of/the.apk
ziehen.
Dank an @tarn für den Hinweis, dass unter Lollipop der apk-Pfad /data/app/your-package-name-1/base.apk
lautet.
Android fügt eine Sequenznummer an den Paketnamen an, um den endgültigen Namen der APK-Datei zu erzeugen (dies ist möglich, je nach Version des Android-Betriebssystems). Die folgende Befehlssequenz funktioniert auf einem nicht gerooteten Gerät :
Rufen Sie den vollständigen Pfadnamen der APK-Datei für das gewünschte Paket ab.
adb Shell pm path com.example.someapp
Dies gibt die Ausgabe als: package:/data/app/com.example.someapp-2.apk
.
Ziehen Sie die APK-Datei vom Android-Gerät in die Entwicklungsbox.
adb pull /data/app/com.example.someapp-2.apk
Sie benötigen keine ROOT-Berechtigungen, um die Liste der installierten Apps abzurufen.
Sie können dies mit dem Android PackageManager tun.
Nachfolgend finden Sie einen kleinen Code-Ausschnitt.
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);
}
Wenn Sie Eclipse für Android-Entwicklung installiert haben:
Auf Nougat (7.0) Android-Version führen Sie adb Shell pm list packages
aus, um die auf dem Gerät installierten Pakete aufzulisten . Führen Sie dann adb Shell pm path your-package-name
aus, um den Pfad der apk ..__ anzuzeigen. Nach der Verwendung von adb kopieren Sie das Paket in Downloads adb Shell cp /data/app/com.test-1/base.apk /storage/emulated/0/Download
..__ Ziehen Sie die apk von Downloads auf Ihren Computer, indem Sie adb pull /storage/emulated/0/Download/base.apk
ausführen.
Ich habe einen Weg gefunden, um den Paketnamen des APK in einem Nicht-Root-Gerät abzurufen. Es ist nicht so elegant, funktioniert aber immer.
Schritt 1 : Öffnen Sie auf Ihrem Gerät die Ziel-APK
Schritt 2 : Geben Sie im PC-Cmd-Fenster die folgenden Befehle ein:
adb Shell dumpsys activity a > dump.txt
da die Ausgabe dieses Befehls zahlreich ist, wird die Umleitung in eine Datei empfohlen.
Schritt 3 : Öffnen Sie diese dump.txt-Datei mit einem beliebigen Editor.
für Gerät vor Android 4.4:
Der Anfang der Datei würde folgendermaßen aussehen:
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
der Paketname befindet sich in der 3. Zeile, com.tencent.mm für dieses Beispiel.
für Android 4.4 und höher:
Die dumpsys-Ausgabe hat sich etwas geändert. Versuchen Sie, "Stack # 1" zu suchen. Der Name des Pakets wäre sehr nahe darunter.
Suchen Sie auch nach "baseDir", Sie finden den vollständigen Pfad der apk-Datei!
List PackageManager.getInstalledApplications () gibt Ihnen eine Liste der installierten Anwendungen, und ApplicationInfo.sourceDir ist der Pfad zur APK-Datei.
// 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
Ich habe einen does not exist error
So mache ich es:
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)