如何从Android设备获取apk文件?


484

如何从Android设备获取apk文件?或者如何将apk文件从设备传输到系统?

Answers:


118

使用adb。当设备通过USB连接时,可以使用adb pull 将文件从设备复制到系统。

当然,您还需要正确的权限才能访问文件所在的目录。如果没有,则需要首先root设备。


如果您发现许多APK都被命名为“ base.apk”,则还可以使用此命令将所有APK从您可以访问的电话中拉出,同时将任何“ base.apk”名称重命名为程序包名称。这也解决了名称后似乎带有随机字符的APK路径的目录找不到问题:

for i in $(adb shell pm list packages | awk -F':' '{print $2}'); do adb pull "$(adb shell pm path $i | awk -F':' '{print $2}')"; mv base.apk $i.apk 2&> /dev/null ;done

如果收到“ adb:错误:无法统计远程对象”,则表明您没有所需的权限。我在未扎根的Moto Z2上运行了该程序,并且能够下载除youtube之外我未卸载的所有APK(请参见下文)。

adb shell pm uninstall --user 0 com.android.cellbroadcastreceiver   <--- kills presidential alert app!

(以查看运行adb shell pm list用户的用户)这是一种删除/卸载(不是从手机恢复出厂设置的方法)的方法,几乎没有root包含系统应用程序的任何应用程序(提示更新手机的烦人的更新应用程序可以通过grepping“ ccc”找到它是否行)


1
感谢Maurits Rijk。请帮我 我想将iTwips.apk文件从设备复制到系统。我正在使用以下命令。这是对的吗 ?我收到错误消息“ Android2.2Froyo / sdcard / iTwips.apk”没有退出... / Users / bbb / Android / android-sdk-mac_86 / tools / adb pull Android2.2Froyo / sdcard / iTwips.apk / Users / bbb谢谢。……
Finder

在我的设备(Android 2.1)上,该命令将为“ adb pull /sdcard/test.jpg”,用于将test.jpg从我的SD卡复制到当前目录。请首先使用“ adb shell”找到您的iTwips.apk文件。这将在设备上启动外壳程序,您可以使用标准的Unix命令(如ls和cd)浏览目录。
莫里斯·赖克

嗨,实际上,iTwips.apk存储在设备的内部存储器中。我该如何使用外壳?我正在使用以下命令adp -d <devicenumber> shell ..但它不起作用..请帮助我..提前致谢。
Finder 2010年

嗨,非常感谢你。我现在可以从sdcard获取图像。但我想从设备(managementApplication文件夹)中提取apk文件。iTwips apk存储在“应用程序”文件夹中。请帮我
Finder 2010年

16
@Finder @Maurits Rijk实际上,您不必拉起设备即可拉apk。只要您知道该apk的完整路径即可。如果安装的APK,找到第一个寻找与包名的完整路径adb shell pm list packages,它的完整路径adb shell pm path your.package.name,然后从你的电脑,你可以简单adb pull /full/path/to/your.apk
伊萨一

1548

这些建议对我都不起作用,因为Android会在包名称后附加序列号以产生最终的APK文件名。在较新的Android版本(Oreo和Pie)上,附加了不可预测的随机字符串。以下命令序列对非root用户的设备有效

1)确定应用程序的软件包名称,例如“ com.example.someapp”。如果您已经知道软件包名称,请跳过此步骤。

adb shell pm list packages

浏览软件包名称列表,并尝试在有问题的应用程序和软件包名称之间找到匹配项。通常这很容易,但是请注意,程序包名称可能与应用程序名称完全无关。如果您无法从包名称列表中识别该应用,请尝试使用浏览器在Google Play中找到该应用。Google Play中应用程序的网址包含程序包名称。

2)获取所需软件包的APK文件的完整路径名。

adb shell pm path com.example.someapp

输出看起来像
package:/data/app/com.example.someapp-2.apk

package:/data/app/com.example.someapp-nfFSVxn_CTafgra3Fr_rXQ == / base.apk

3)使用第2步中的完整路径名,将APK文件从Android设备拉至开发框。

adb pull /data/app/com.example.someapp-2.apk path/to/desired/destination

65
这是最好的答案,无需腐烂设备!非常感谢
Muhannad A.Alhariri

14
这适用于我所有的Android设备,应该是公认的答案。
b.mcewan 2013年

8
pm list packages支持该-f标志,该标志为您列出.apk的位置,例如package:/data/app/com.google.android.apps.maps-1.apk=com.google.android.apps.maps。内置的pm帮助没什么用,但是pm也可以过滤软件包的类型,请参阅developer.android.com/studio/command-line/adb.html#pm了解更多信息。编辑:刚注意到下面的答案说明了这一点,但这个答案几乎不像这个答案那样。
Hitechcomputergeek

9
对我不起作用。我收到以下错误:adb: error: remote object '/data/app/path.of.the.app-2/base.apk' does not exist。如果使用文件浏览器浏览这些文件夹,则文件夹为空。
Bevor

7
我有一个与@Bevor类似的问题,在拉动时出现了apk“不存在”的错误。我用固定它adb shell,然后cp PathToApk /sdcard/再从SD卡复制。
科林

124

不需要root:

此代码将获得名称为3rd party的包路径,以便您轻松识别APK

adb shell pm list packages -f -3

输出将是

包:/data/app/XX.XX.XX.apk=YY.YY.YY

现在,使用以下代码提取该软件包:

adb pull /data/app/XX.XX.XX.apk

如果您在中的cmd上方执行了操作C:>\,那么您将在那里找到该程序包。


1
这是很棒的答案!非常感谢您:)
Drag0

1
由于某些原因,我在/ data / app /目录中找不到APK 。那里总是有一个子目录。
IgorGanapolsky

系统应用程序使用-f -s而不是-f -3
palindrom

57

我已经看到许多解决此问题的方法,要么您必须扎根手机,要么必须安装应用程序。然后经过大量的搜索,我得到了针对非root / root用户的电话的解决方案。

列出您到目前为止获得的应用程序。

adb shell pm list packages

然后您可以选择一个应用程序,例如twitter

adb backup -apk com.twitter.android

这里重要的是不要设置用于加密备份的密码

这将创建一个名为backup.ap的文件,但是您仍然无法打开它。为此,您必须使用dd命令再次将其提取。

dd if=backup.ab bs=24 skip=1 | openssl zlib -d > backup.tar

在此之后,您要做的就是提取tar内容并完成。

希望它对你们有用


7
blog.shvetsov.com/2013/02/…中,如果您的openssl没有zlib,则此方法可能有效:dd if = backup.ab bs = 1 skip = 24 | python -c“导入zlib,sys; sys.stdout.write(zlib.decompress(sys.stdin.read()))” | 焦油-xvf -
科迪

1
这是对我有用的,而不是已接受答案中的步骤。今天,当我需要我的一个旧应用程序的APK时,它确实对我有所帮助,但是除了从我的手机上以外,我无法使用它。
zeeshan 2014年

1
下面是详细信息,如果您的OpenSSL缺乏支持zlib:stackoverflow.com/questions/29830981/...
尼科威德曼

19

将APK从设备下载到桌面的步骤

A)确保您正在运行(仿真器/真实设备)。要检查使用此命令

adb devices

B)选择设备中安装的所有可用软件包列表。您可以使用grep命令选择要下载的特定软件包。

adb shell pm list packages
adb shell pm list packages -f -3

输出(可用软件包列表)

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)从上面的链接复制软件包(您要下载)。在我们的案例中,我选择了这个(com.example.myapplication)包

Syntax : adb shell pm path [your_package_name]
Command: adb shell pm path com.example.myapplication

输出量

package:/data/app/com.example.myapplication-nd1I4FGnTZnQ9PyRbPDHhw==/base.apk

D)最后,要从您的(模拟器/真实设备)下载APK

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

示例:尝试在本地计算机(Mac)中提取此CertInstaller.apk文件

adb pull /system/app/CertInstaller/CertInstaller.apk /Users/$(whoami)/Documents/APK/download_apk/

E)在您的本地目录中确认

ls -la /Users/$(whoami)/Documents/

目的是提取单个apk,但是在第4步中,您将提取两个其他文件,而没有说明或先前的参考。
卡尔斯·阿尔科利亚

我通过阐明每个步骤来修改了这篇文章。希望这种修改将是有用的并且易于理解。
Farid Haq

18
C:\Users\xyz>adb shell pm list packages -f | findstr whatsapp
package:/data/app/com.whatsapp-1/base.apk=com.whatsapp

C:\Users\xyz>adb pull /data/app/com.whatsapp-1/base.apk Desktop
/data/app/com.whatsapp-1/base.apk: 1 f.... 13.8 MB/s (32803925 bytes in 
2.269s)

我认为这是最直接的方法。谢谢!
8bitcartridge

1
使用linux或mac而不是findstr的家伙使用grep
Jeeva


7

完成@Yojimbo的答案,这就是我所做的(仅Linux / Mac,在Windows上无法使用...也许在git的bash shell中):

for i in $(adb shell pm list packages -f -3 | cut -d= -f 1 | cut -d ":" -f 2); do adb pull $i; done

这是丑陋的打击,但有效:)

编辑:它不再适用于AndroidM:所有文件都在另一个目录下被命名为“ base.apk”。应该是“琐碎的”修复。


7

在unix系统上,可以尝试以下功能:

function android_pull_apk() {
    if [ -z "$1" ]; then
        echo "You must pass a package to this function!"
        echo "Ex.: android_pull_apk \"com.android.contacts\""
        return 1
    fi

    if [ -z "$(adb shell pm list packages | grep $1)" ]; then
        echo "You are typed a invalid package!"
        return 1
    fi

    apk_path="`adb shell pm path $1 | sed -e 's/package://g' | tr '\n' ' ' | tr -d '[:space:]'`"
    apk_name="`adb shell basename ${apk_path} | tr '\n' ' ' | tr -d '[:space:]'`"

    destination="$HOME/Documents/Android/APKs"
    mkdir -p "$destination"

    adb pull ${apk_path} ${destination}
    echo -e "\nAPK saved in \"$destination/$apk_name\""
}
  • 范例android_pull_apk com.android.contacts
  • 注意:要识别包装:adb shell pm list packages

6

如上所述,您可以使用adb中的pull命令获取apk。

由于您正在谈论已安装的应用程序,因此请继续查看Android文件系统的/ data / app目录。您会在其中找到APK。

然后使用adb命令-adb pull /data/data/appname.apk


6

尝试使用此liner bash命令来备份所有应用程序:

for package in $(adb shell pm list packages -3 | tr -d '\r' | sed 's/package://g'); do apk=$(adb shell pm path $package | tr -d '\r' | sed 's/package://g'); echo "Pulling $apk"; adb pull -p $apk "$package".apk; done

该命令源自Firelord的脚本。我只是将所有apk重命名为其软件包名称,以使用elcuco的脚本解决问题,即相同base.apk文件在Android 6.0“棉花糖”及更高版本上被覆盖。

请注意,此命令仅备份第3方应用程序,因为我看不到备份内置应用程序的意义。但是,如果您也想备份系统应用程序,请忽略该-3选项。


5

如果您知道(或可以“猜测”)路径.apk(它的格式似乎是)/data/app/com.example.someapp-{1,2,..}.apk,那么您也可以从中复制它/data/app。即使在我的非根目录,库存的Android手机上也可以使用。

只需使用Terminal Emulator应用程序(例如this)并运行:

# step 1: confirm path
ls /data/app/com.example.someapp-1.apk
# if it doesn't show up, try -2, -3. Note that globbing (using *) doesn't work here.
# step 2: copy (make sure you adapt the path to match what you discovered above)
cp /data/app/com.example.someapp-1.apk /mnt/sdcard/

然后,您可以将其从SD卡移动到所需位置(或将其附加到电子邮件等)。最后一点在技术上可能是可选的,但是当您尝试对.apk文件进行操作时,这会使您的工作变得更加轻松。


5

此处概述的过程不适用于Android 7(牛轧糖)(可能还适用于Android 6,但我无法验证)。您不能将.apk文件直接拉到Nougat(除非在root模式下,但这需要有root权限的电话)。但是,您可以使用adb shell将.apk复制到电话上的备用路径(例如/ sdcard / Download),然后可以从备用路径进行adb拉取。


3
可接受的答案(包括adb shell来自@Isa A的评论的命令)对我在Android 7.1.1上运行正常,但没有root。
乔纳森·科特里尔

4
  1. 打开您想要从手机中提取apk的应用。
  2. 使用以下方法获取当前打开的应用程序:

    adb shell dumpsys activity activities | grep mFocusedActivity
  3. 获取包名称的路径

    adb shell pm path <packagename.apk>

4,将获得的路径复制到sdcard目录

    adb shell cp /data/app/<packagename.apk> /sdcard

5,拉apk

    adb pull /sdcard/base.apk

编辑

如果第2步不起作用,请使用以下命令:

adb shell dumpsys window windows | grep mCurrentFocus

3

这是您的操作方式:

在设备中下载并安装APK Extractor。它是免费的,并且几乎与所有Android设备兼容。另一个优点是它甚至不需要root或任何东西即可工作。安装后,启动它。在此处,您会看到设备中包含的应用程序列表,其中包括您以后安装的应用程序以及系统应用程序。长按要提取的任何应用程序(可以一次选择多个或所有应用程序),然后单击顶部显示的提取选项。您还可以选择通过蓝牙或消息共享。完成后,您将看到提取的应用程序为AppName_AppPackage_AppVersionName_AppVersionCode.apk,默认情况下将保存在路径/ sdcard / ExtractedApks /中。

有关如何在android中提取apk文件的详细说明,请访问:http : //appslova.com/how-to-extract-apk-files-in-android/


3

对于从设备检索到的每个apk文件,所有这些答案都需要执行多个步骤。1.确定程序包名称,2.查找文件,然后3.下载。我构建了一个简单的apk_grabberpython脚本,可对与给定正则表达式匹配的任何应用执行此操作,然后将这些apk反编译为jar文件。


1

我没有使用代码从移动设备中提取.apk文件,但是我一直在使用从移动设备中提取.apk文件的软件,而我使用的软件在下面带有google play链接:

  1. ES File Explorer文件管理器
  2. ASTRO Cloud&File Manager 3. 软件数据线

希望对您有帮助。


2
我使用了ES File Explorer。我不扎根。我只是去了Tools-> App Manager并长按了我想要APK的应用程序。这选择了应用程序(并允许我选择其他应用程序)。我认为按下了“共享”按钮并能够将APK发送给我自己(使用“推项目符号”,但对您有用)。
舒尔茨特2014年

如果您不
感到沮丧,



1

我有一个 does not exist error

这就是我的工作方式

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)

0

另一个bash脚本(即适用于大多数基于Unix的系统)。根据Pedro Rodrigues的回答,但使用起来稍微容易一些。

对Pedro版本的改进:

  1. 原始方法在Android 7上对我不起作用:adb pull一直抱怨no such file or directory何时adb shell可以访问文件。因此,我对临时文件使用了不同的方法。
  2. 当不带任何参数启动时,我的脚本将仅列出所有可用的软件包。提供部分软件包名称时,它将尝试猜测完整的软件包名称。如果有几种可能的扩展,它将抱怨。
  3. 我不对目标路径进行硬编码。而是将APK保存到当前工作目录。

将此保存到可执行文件中:

#!/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\""

0

最简单的方法是:在手机上安装“ ShareIt”应用程序。现在,在PC或其他手机上安装shareIt应用。现在,从安装了应用程序的电话中打开ShareIt并发送。在其他电话或PC上,打开ShareIt并接收。


0

我真的很喜欢所有这些答案。大多数导出和重命名所有脚本均使用Bash编写。我做了一个小的Perl脚本,它执行相同的操作(该脚本在Windows和Linux的Perl中均应工作,仅在Ubuntu上进行了测试)。

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 @list = split(/\s*/, `adb shell pm list packages -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;
}
  1. 确保adb(.exe)在您的路径或相同目录中
  2. 连接手机
  3. 运行download-apk.pl

输出类似于:

# ./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.

-1

这将为正在寻找非技术性答案的人提供帮助

这是简单的黑客

App Share/Send Pro从Google Play商店下载应用程序。选择要发送的应用程序,然后选择发送方法。

我通常使用蓝牙将应用程序发送到我的PC或其他电话。


使用
起来
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.