How do I get the apk file from an android device? Or how do I transfer the apk file from device to system?
How do I get the apk file from an android device? Or how do I transfer the apk file from device to system?
Steps to Download APK from Device to Desktop
A) Make sure that your running (emulator/real Device). To check use this command
adb devices
B) Select all the available package list installed in your device. You can use grep command to select the specific package you intend to download.
adb shell pm list packages
adb shell pm list packages -f -3
Output (List of available packages )
package:/data/app/com.example.mytestapplication-sOzKi5USzfbYLPNDmaaK6g==/base.apk=com.example.mytestapplication
package:/data/app/com.example.myapplication-nd1I4FGnTZnQ9PyRbPDHhw==/base.apk=com.example.myapplication
C) Copy the package (which you like to download) from the above link. Form our case I choose this (com.example.myapplication) package
Syntax : adb shell pm path [your_package_name]
Command: adb shell pm path com.example.myapplication
Output
package:/data/app/com.example.myapplication-nd1I4FGnTZnQ9PyRbPDHhw==/base.apk
D) Finally, To download APK from your (emulator/real device)
Syntax : adb pull /data/app/[your_package_name]-1/base.apk [your_destination_path]
Command: adb pull /data/app/com.example.myapplication-3j4CVk0Tb2gysElgjz5O6A==/base.apk /Users/$(whoami)/Documents/your_apk.apk
Example: Trying to pull this CertInstaller.apk file in your local machine ( Mac )
adb pull /system/app/CertInstaller/CertInstaller.apk /Users/$(whoami)/Documents/APK/download_apk/
E) Confirm in your local directory
ls -la /Users/$(whoami)/Documents/
One liner which works for all Android versions:
adb shell 'cat `pm path com.example.name | cut -d':' -f2`' > app.apk
Get the currently opened app with:
adb shell dumpsys activity activities | grep mFocusedActivity
Get the path to the package name
adb shell pm path <packagename.apk>
4.Copy the path you got to the sdcard directory
adb shell cp /data/app/<packagename.apk> /sdcard
5.Pull the apk
adb pull /sdcard/base.apk
Edit
If step no 2 doesn't work use this:
adb shell dumpsys window windows | grep mCurrentFocus
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)
I really liked all these answers. Most scripts to export and rename all of them were written in Bash. I made a small Perl script which does the same (which should work both in Perl for windows and linux, only tested on Ubuntu).
This uses ADB: https://developer.android.com/studio/command-line/adb
download-apk.pl
#!/usr/bin/perl -w
# Automatically export all available installed APK's using adb
use strict;
print "Connect your device...\n";
system("adb", "wait-for-device");
open(my $OUT, '-|', 'adb', 'shell', 'pm', 'list', 'package', '-f');
my $count = 0;
while(my $line = <$OUT>) {
$line =~ s/^\s*|\s*$//g;
my ($type, $path, $package) = $line =~ /^(.*?):(.*)=(.*)$/ ? ($1,$2,$3) : die('invalid line: '.$line);
my $category = $path =~ /^\/(.*?)\// ? $1 : 'unknown';
my $baseFile = $path =~ /\/([^\/]*)$/ ? $1 : die('Unknown basefile in path: '.$path);
my $targetFile = "$category-$package.apk";
print "$type $category $path $package $baseFile >> $targetFile\n";
system("adb", "pull", $path);
rename $baseFile, $targetFile;
}
The output is something similar to:
# ./download-apk.pl
Connect your device...
* daemon not running. starting it now on port 5037 *
* daemon started successfully *
package system /system/app/YouTube/YouTube.apk com.google.android.youtube YouTube.apk >> system-com.google.android.youtube.apk
5054 KB/s (11149871 bytes in 2.154s)
package data /data/app/com.ghostsq.commander-1/base.apk com.ghostsq.commander base.apk >> data-com.ghostsq.commander.apk
3834 KB/s (1091570 bytes in 0.278s)
package data /data/app/de.blinkt.openvpn-2/base.apk de.blinkt.openvpn base.apk >> data-de.blinkt.openvpn.apk
5608 KB/s (16739178 bytes in 2.914s)
etc.
Yet another bash script (i.e. will work for most unix-based systems). Based on the answer by Pedro Rodrigues, but is slightly easier to use.
Improvements over Pedro's version:
adb pull kept complaining about no such file or directory while adb shell could access the file. Hence I used different approach, with temporary file.Save this to an executable file:
#!/bin/bash
# Obtain APK file for given package from the device connected over ADB
if [ -z "$1" ]; then
echo "Available packages: "
adb shell pm list packages | sed 's/^package://'
echo "You must pass a package to this function!"
echo "Ex.: android_pull_apk \"com.android.contacts\""
exit 1
fi
fullname=$(adb shell pm list packages | sed 's/^package://' | grep $1)
if [ -z "$fullname" ]; then
echo "Could not find package matching $1"
exit 1
fi
if [ $(echo "$fullname" | wc -l) -ne 1 ]; then
echo "Too many packages matched:"
echo "$fullname"
exit 1
fi
echo "Will fetch APK for package $fullname"
apk_path="`adb shell pm path $fullname | sed -e 's/package://g' | tr '\n' ' ' | tr -d '[:space:]'`"
apk_name="`basename ${apk_path} | tr '\n' ' ' | tr -d '[:space:]'`"
destination="${fullname}.apk"
tmp=$(mktemp --dry-run --tmpdir=/sdcard --suffix=.apk)
adb shell cp "${apk_path}" "$tmp"
adb pull "$tmp" "$destination"
adb shell rm "$tmp"
[ $? -eq 0 ] && echo -e "\nAPK saved in \"$destination\""
Simplest one is: Install "ShareIt" app on phone. Now install shareIt app in PC or other phone. Now from the phone, where the app is installed, open ShareIt and send. On other phone or PC, open ShareIt and receive.