I'm trying to extract the APK file of an installed Android app WITHOUT root permissions.
I thought that this was impossible, because all APK files for non-system-apps are located in /data/app, and accessing this folder requires root permission. Then I found that there are numerous apps in the Google Play store that seem to have access to the APK files even on non-rooted devices.
Can someone tell me how this is possible? Aren't there backup apps which backup the APK files without root?
Accessing /data/app is possible without root permission; the permissions on that directory are rwxrwx--x. Execute permission on a directory means you can access it, however lack of read permission means you cannot obtain a listing of its contents -- so in order to access it you must know the name of the file that you will be accessing. Android's package manager will tell you the name of the stored apk for a given package.
To do this from the command line, use adb shell pm list packages
to get the list of installed packages and find the desired package.
With the package name, we can get the actual file name and location of the APK using adb shell pm path your-package-name
.
And knowing the full directory, we can finally pull the adb using adb pull full/directory/of/the.apk
. The APK file gets stored to the directory from which you run your console.
Credit to @tarn for pointing out that under Lollipop, the apk path will be /data/app/your-package-name-1/base.apk
Android appends a sequence number to the package name to produce the final APK file name (it's possible that this varies with the version of Android OS). The following sequence of commands works on a non-rooted device:
Get the full path name of the APK file for the desired package. adb shell pm path com.example.someapp This gives the output as: package:/data/app/com.example.someapp-2.apk. Pull the APK file from the Android device to the development box. adb pull /data/app/com.example.someapp-2.apk
The location of APK after successful pulling will be at ../sdk/platform-tools/base.apk on your pc/laptop.
You don't need ROOT permissions to get the list of Installed Apps.
You can do it with android PackageManager.
Below is a small code snippet.
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);
}
On Nougat(7.0) Android version run adb shell pm list packages
to list the packages installed on the device. Then run adb shell pm path your-package-name
to show the path of the apk. After use adb to copy the package to Downloads adb shell cp /data/app/com.test-1/base.apk /storage/emulated/0/Download
. Then pull the apk from Downloads to your machine by running adb pull /storage/emulated/0/Download/base.apk
.
check the list of installed apk's (following command also list the path where it is installed and package name). adb shell pm list packages -f use adb pull /package_path/package name /path_in_pc (package path and package name one can get from above command 1.)
I got a does not exist error
Here is how I make it works:
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)
When you have Eclipse for Android developement installed:
Use your device as debugging device. On your phone: Settings > Applications > Development and enable USB debugging, see http://developer.android.com/tools/device.html
In Eclipse, open DDMS-window: Window > Open Perspective > Other... > DDMS, see http://developer.android.com/tools/debugging/ddms.html
If you can't see your device try (re)installing USB-Driver for your device
In middle pane select tab "File Explorer" and go to system > app
Now you can select one or more files and then click the "Pull a file from the device" icon at the top (right to the tabs)
Select target folder - tada!
List PackageManager.getInstalledApplications() will give you a list of the installed applications, and ApplicationInfo.sourceDir is the path to the .apk file.
// 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
Open ES explorer -> push Menu button at the left upper corner (three horizontal stripes) -> in the Libraries section choose APPs.
Thus, you get the list of all the user apps. Find your app and select it with long pushing on it. Then press "More" in the right low corner and choose "Send". Then you can use different options, e.g. you can choose "ES Save To" in order to save the .apk file to your home directory or anywhere else.
I found a way to get the APK's package name in a non-root device. it's not so elegant, but works all the time.
Step 1: on your device, open the target APK
Step 2: on PC cmd window, type this commands:
adb shell dumpsys activity a > dump.txt
because the output of this command is numerous, redirect to a file is recommended.
Step 3: open this dump.txt file with any editor.
for device befor Android 4.4: the beginning of the file would be looked like this:
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
the package name is in the 3rd line, com.tencent.mm for this example.
for Android 4.4 and later: the dumpsys output has changed a little. try search "Stack #1", the package name would be very close below it.
Also, search "baseDir", you will find the full path of the apk file!
One line command, with separated download to paths by packages
SEARCH_APP="minecraft" && PKGS=$(adb shell pm list packages | grep ${SEARCH_APP}) && for PKG in ${PKGS}; do PKG=${PKG#*:} && mkdir -p ${SEARCH_APP}/${PKG} && PKG_FILES=$(adb shell pm path ${PKG}) && for PKG_FILE in ${PKG_FILES}; do PKG_FILE=${PKG_FILE#*:} && adb pull $PKG_FILE ${SEARCH_APP}/${PKG}; done; done
Obtaining an APK file of an installed app is possible via the free and open-source Ghost Commander app, which is available on both F-Droid and the Play Store.
In the Ghost Commander app, go to Apps, then simply long-tap an app from the list and choose Copy. The .apk file will be available in the other file panel; you can put it wherever you want.
Note that, since Ghost Commander is a two-panel file manager, you first have to use the other panel and open a folder there (which is where we want to copy the apk file into). Then, go to the other panel and go to Apps there.
(If you don't see 'Apps', first tap the arrow and select Home.)
Links:
https://f-droid.org/packages/com.ghostsq.commander/ https://sourceforge.net/projects/ghostcommander/ https://play.google.com/store/apps/details?id=com.ghostsq.commander
Or you can get 'Bluetooth File Transfer' from Google Play and set the home folder to /system/
. Then you can even go to /
.
Success story sharing
adb shell pm list packages
to get the list of installed packages, pick the desired package, append-1.apk
to it, and pull it from/data/app
. Example: If the package name isorg.mozilla.firefox
, useadb pull /data/app/org.mozilla.firefox-1.apk
.