我怎么从Android设备上获取apk文件?

时间:2010-10-27 12:06:20

标签: android adb apk

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

24 个答案:

答案 0 :(得分:1373)

这些建议都不适用于我,因为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

输出看起来像是什么    包:/data/app/com.example.someapp-2.apk

   包:/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

答案 1 :(得分:104)

无需root:

此代码将获取名称的第三方包路径,以便您轻松识别您的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

如果你在C:>\中执行了上面的cmd,那么你会在那里找到那个包。

答案 2 :(得分:81)

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

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


如果您发现许多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:error:failed of stat remote object”,则表示您没有所需的权限。我在一个没有根据的Moto Z2上运行它,并且能够下载除了youtube之外我没有卸载的所有APK(见下文)。

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

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

答案 3 :(得分:52)

我已经看到很多这个问题的解决方案要么你必须手机根,要么你必须安装一个应用程序。然后经过大量谷歌搜索后,我得到了这个解决方案,用于非root / rooted手机。

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

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内容并完成。

希望它对你们有用

答案 4 :(得分:17)

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)

答案 5 :(得分:9)

适用于所有Android版本的一个班轮:

adb shell 'cat `pm path com.example.name | cut -d':' -f2`' > app.apk

答案 6 :(得分:8)

完成@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 :(得分: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

答案 8 :(得分:6)

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

因为,您正在谈论已安装的应用程序,请继续查看Android文件系统的 / data / app 目录。你会在那里找到APK。

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

答案 9 :(得分:5)

此处列出的程序不适用于Android 7(Nougat)[可能还有Android 6,但我无法验证]。您无法直接在Nougat下提取.apk文件(除非在root模式下,但需要有根电话)。但是,您可以使用adb shell将.apk复制到手机上的备用路径(例如/ sdcard / Download),然后您可以从备用路径执行adb pull。

答案 10 :(得分:5)

如果您知道(或者您可以&#34;猜测&#34;).apk的路径(似乎的格式为/data/app/com.example.someapp-{1,2,..}.apk ,那么你也可以从/data/app复制它。这甚至可以在我的非root用户手机上运行。

只需使用终端模拟器应用(例如this one)并运行:

# 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文件时,它会让您的生活更轻松。

答案 11 :(得分:4)

尝试使用此一行内衬bash命令备份所有应用:

getPrices() {
    return this._http.get(`https://min-api.cryptocompare.com/data/pricemulti?fsyms=${this.coinsList}&tsyms=USD`)
        .map(result => this.result = result);
}

此命令源自Firelord's script。我刚刚将所有apks重命名为他们的软件包名称以解决elcuco's script的问题,即在Android 6.0“Marshmallow”及更高版本上覆盖相同的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 文件。

请注意,此命令仅备份第三方应用,因为我没有看到备份内置应用的重点。但是如果你想备份系统应用程序,只需省略base.apk选项。

答案 12 :(得分:4)

将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)程序包

Syntex: 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

Syntex: 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/

答案 13 :(得分:3)

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

答案 14 :(得分:3)

这是你如何做到的:

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

有关how to extract apk files in android的详细说明,请访问:http://appslova.com/how-to-extract-apk-files-in-android/

答案 15 :(得分:1)

想要非常非常舒适的1分钟解决方案吗?

只是你这个应用https://play.google.com/store/apps/details?id=com.cvinfo.filemanager(谷歌播放的智能文件管理器)。

点按&#34; apps&#34;,选择一个并点按&#34; backup&#34;。它将最终出现在app_backup文件夹中的文件系统;)

答案 16 :(得分:1)

我没有使用代码从移动设备中提取.apk文件,但我一直在使用软件从移动设备中提取.apk文件,我使用的软件在下面跟谷歌播放链接:

  1. ES File Explorer File Manager
  2. ASTRO Cloud & File Manager 3。Software Data Cable
  3. 希望它可以帮到你。

答案 17 :(得分:1)

无根且无ADB工具要求的方法。 从Play商店安装MyAppSharer应用。

答案 18 :(得分: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)

答案 19 :(得分:0)

又一个bash脚本(即适用于大多数基于unix的系统)。基于the answer by Pedro Rodrigues,但稍微更容易使用。

改进Pedro的版本:

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

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

答案 20 :(得分:0)

最简单的是: 安装&#34; ShareIt&#34;手机上的应用程序 现在在PC或其他手机中安装shareIt应用程序。 现在,从安装了应用程序的手机,打开ShareIt并发送。 在其他手机或PC上,打开ShareIt并接收。

答案 21 :(得分:0)

  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

答案 22 :(得分: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.

答案 23 :(得分:-1)

这对于正在寻找非技术性答案的人

有帮助

这很简单 hack

从Google Play商店下载应用@Override public E create(E e) throws Exception { throw new UnsupportedOperationException("this operation is not supported"); } 。选择要发送的应用程序和方法发送应用程序。

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