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

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

603112 次浏览

使用# EYZ0。使用亚行拉,当设备连接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 &> /dev/null
done

如果你得到“adb: error: failed to stat remote object"这表明您没有所需的权限。我在一台非根Moto Z2上运行了这个程序,并且能够下载所有我没有卸载的apk(见下文),除了youtube。

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

(查看用户运行adb shell PM列表用户) 这是一种删除/卸载(不是从手机出厂复位)几乎任何应用程序没有根包括系统应用程序(提示烦人的更新应用程序更新你的电话线它或不可以通过grepping "ccc")

如上所述,您可以通过使用adb中的pull命令来获得apk。

由于您正在讨论已安装的应用程序,请继续查看Android文件系统的/数据/应用目录。你会在那里找到APK。

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

我已经见过很多解决这个问题的方法,要么你必须在你的手机上找到根目录,要么你必须安装一个应用程序。然后在谷歌了很多之后,我得到了这个非根/根电话的解决方案。

列出你目前获得的应用程序。

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

在此之后,你所要做的就是提取焦油含量,这就完成了。

希望这对你们有用

这些建议对我都不起作用,因为Android在包名后面附加了一个序列号来生成最终的APK文件名。在最新版本的Android (Oreo和Pie)上,会追加一个不可预测的随机字符串。下面的命令序列是我在内面的设备上工作的:

1)确定应用程序的包名。“com.example.someapp”。如果存在以下情况,请跳过此步骤

.

.

.
adb shell pm list packages

查看包名列表,并尝试在有问题的应用程序和包名之间找到匹配项。这通常很简单,但请注意,包的名称可以与应用程序的名称完全无关。如果您无法从包名列表中识别该应用程序,请尝试使用浏览器在谷歌Play中找到该应用程序。谷歌Play中应用程序的URL包含包名。

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

adb shell pm path com.example.someapp

输出类似于
# EYZ0 < br > 或< br > 包:/数据/应用/ com.example.someapp-nfFSVxn_CTafgra3Fr_rXQ = = / base.apk < / em >

3)使用步骤2中的完整路径名称,将APK文件从Android设备拉到开发箱中。

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

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

  1. ES File Explorer File Manager
  2. ASTRO Cloud &文件管理器 3 . # EYZ0李< / >

希望它能帮助你。

不需要root:

这段代码将获得第三方包的路径和名称,以便您可以轻松识别您的APK

adb shell pm list packages -f -3

输出将是

包:/ / app / XX.XX.XX.apk = YY.YY.YY数据

现在使用下面的代码拉出这个包:

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

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

如果你知道(或者你可以“猜”)到.apk(它似乎是格式/data/app/com.example.someapp-{1,2,..}.apk到)的路径,那么你也可以从/data/app复制它。这个功能甚至在我的非根安卓手机上也能运行。

只需使用终端模拟器应用程序(如这一个)并运行:

# 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文件时更加轻松。

你可以这样做:

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

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

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

完成@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

这是一个丑陋的bash,但工作:)

< p >编辑: 它不再适用于AndroidM:所有文件都命名为“base.apk”在另一个目录下。

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

这将帮助那些正在寻找非技术性的答案的人

这是简单的黑客

从谷歌播放商店下载应用程序App Share/Send Pro。选择要发送的应用程序和方法发送应用程序。

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

在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\""
}
  • # EYZ1: # EYZ0
  • 请注意:识别包:adb shell pm list packages

还有另一个bash脚本(即可以用于大多数基于unix的系统)。基于佩德罗·罗德里格斯给出了答案,但是使用起来稍微容易一些。

对佩德罗版本的改进:

  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\""

试试这个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的脚本。我只是将所有apks重命名为它们的包名,以解决elcuco的脚本的问题,即相同的base.apk文件被覆盖在Android 6.0“棉花糖”及以上。

注意,这个命令只备份第三方应用,因为我不认为备份内置应用有什么意义。但如果你也想备份系统应用程序,只需省略-3选项。

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)

想要非常非常舒服的一分钟解决方案吗?

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

点击“应用程序”,选择一个,然后点击“备份”。它将在你的文件系统中的app_backup文件夹;)

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

适用于所有Android版本的一行代码:

adb shell 'cat `pm path com.example.name | cut -d':' -f2`' > app.apk
  1. 打开你想从你的手机上提取apk的应用程序。
  2. 获取当前打开的应用程序:

    adb shell dumpsys activity activities | grep mFocusedActivity
    
  3. 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.拉apk

    adb pull /sdcard/base.apk

编辑

如果第2步不起作用,使用以下方法:

adb shell dumpsys window windows | grep mCurrentFocus

没有根和ADB工具所需的方法。 从播放商店安装MyAppSharer应用程序

我得到了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)
我真的很喜欢这些答案。 大多数用于导出和重命名的脚本都是用Bash编写的。 我做了一个小Perl脚本,它可以做同样的事情(它应该在windows和linux的Perl中都可以工作,只在Ubuntu上测试)

这使用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;
}
  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.

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

一)确保你的运行(模拟器/真实设备)。使用该命令检查

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

从上面的链接复制包(你喜欢下载的)。在我们的案例中,我选择这个(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

最后,从你的(模拟器/真实设备)下载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

示例:试图将CertInstaller.apk文件拉到本地机器(Mac)

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

在本地目录下确认

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