ChatGPT解决这个技术问题 Extra ChatGPT

How do I get the APK of an installed app without root access?

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?

I think this question is already answered. Kindly give a look at stackoverflow.com/a/12197924/1016544
My reading of this is that @pinas was asking how to code this programatically - referencing apps that do it as if to say "These apps do it, but how?". The "on hold" reason here is wrong in my opinion because of that.

O
OneWorld

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


To do this from the command line, use 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 is org.mozilla.firefox, use adb pull /data/app/org.mozilla.firefox-1.apk.
To get the actual file name of the APK, use adb shell pm path your-package-name. See this question for a more detailed answer stackoverflow.com/questions/4032960/…
for lollipop the apk path will be /data/app/your-package-name-1/base.apk
@0xcaff Android has changed quite a bit in the 5 years since this answer was provided; perhaps this path is one of those changes. You should be able to log in and locate the file manually in order to come up with whatever path is appropriate for your version of the os.
It works! On Windows I use PowerShell with the same commands, and after 'adb pull full/directory/of/the.apk' I can find the.apk in my default foder C:\Users\myName\the.apk
Z
Zeeshan

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.


Can confirm this solution worked on a non rooted device, though does require knowledge of the package name prior to the first command! Use 'adb shell pm list packages' to get a list of all packages on the phone incase you aren't sure of the package name of your desired app
What folder on the puller's local machine does the apk go into? EDIT: nvm, whatever directory you were in when doing the adb pull...
@IgorGanapolsky try using adb pull /data/app/com.example.someapp-2/base.apk
@zelanix after doing adb pull, where i can c the .apk file. Thank you
I found the apk location in the project build view on Android Studio.
S
Sagar Waghmare

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);
}

B
Buhiire Keneth

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.


Work great for me whereas the other methods fails on a non rooted device. I could use an app as MyAppSharer but I prefer this scriptable method.
g
goldy021

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.)


v
vanduc1102

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)

Great workaround for SELinux problems, thank you!
a
anon

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!


There are only system-apps (aka preinstalled apps) in /system/app.
P
Pankaj Arora

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

J
JenyaKh

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.


S
Swing

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!


N
Ninazu

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

J
Jelle Geerts

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


R
Rohan

Or you can get 'Bluetooth File Transfer' from Google Play and set the home folder to /system/ . Then you can even go to / .