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

Fin*_*der 453 android adb apk

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

Yoj*_*mbo 1467

这些建议都不适用于我,因为Android会在程序包名称后附加序列号以生成最终的APK文件名.在更新版本的Android(Oreo和Pie)中,会附加一个不可预测的随机字符串.以下命令序列是在非root设备上对我有用的:

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

adb shell pm list packages
Run Code Online (Sandbox Code Playgroud)

查看软件包名称列表,尝试查找相关应用程序与软件包名称之间的匹配项.这通常很简单,但请注意,包名称可能与应用名称完全无关.如果您无法从包名列表中识别该应用,请尝试使用浏览器在Google Play中查找该应用.Google Play中应用的网址包含套餐名称.

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

adb shell pm path com.example.someapp
Run Code Online (Sandbox Code Playgroud)

输出看起来像
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
Run Code Online (Sandbox Code Playgroud)

  • 这是最好的答案,不需要破坏设备!非常感谢 (57认同)
  • 这适用于我的所有Android设备,应该是接受的答案. (13认同)
  • 对我不起作用.我收到以下错误:`adb:error:remote object'/data/app/path.of.the.app-2/base.apk'不存在.如果我使用文件浏览器浏览这些文件夹,则文件夹为空. (7认同)
  • `点列表packages`支持'-f`标志,其中列出了apk文件为您的位置,比如`包:/data/app/com.google.android.apps.maps-1.apk=com.google .android.apps.maps`.内置的pm帮助没用,但pm也可以过滤类型的包,请参阅https://developer.android.com/studio/command-line/adb.html#pm了解更多信息.编辑:刚刚注意到下面的答案说明了这一点,但这个答案并没有像这个那样受欢迎. (6认同)
  • 我遇到了与@Bevor类似的问题,拉动时我得到了apk"不存在"的错误.我使用`adb shell`然后``cp PathToApk/sdcard /`然后从sdcard复制来修复它. (6认同)
  • 我遇到了与@Bevor类似的问题,这通过使用下载文件夹作为中间解决了它:/sf/answers/3020998921/ (3认同)
  • 我使用上面的方法来创建一个bash脚本,使其成为一个单行:https://gist.github.com/anonymous/9109984 (2认同)
  • 我能够使用终端模拟器应用程序和fx文件管理器,这工作:)我也能够使用grep搜索包列表:`pm list packages | grep NAME` (2认同)
  • 谢谢,这是完美的答案,应该是公认的答案. (2认同)
  • 如果有人想要一行:`adb pull $(adb shell pm path $(adb shell pm list packages | grep -i ${APP_NAME_SEARCH_TERM} | head -n 1 | cut -d ":" -f 2) | cut -d“:”-f 2)` (2认同)
  • @colin - 感谢首先在内部 cp .apk 的建议。这是唯一对我有用的解决方案。 (2认同)
  • 这允许仅下载基本 apk,我无法从设备 `adb shell dumpsys package com.google.android.gms | 下载最新的 apk findstr versionName versionName=22.09.20 (220300-434869283) // 所需 versionName=21.48.13 (220304-413462841) // 基` (2认同)

小智 117

不需要root:

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

adb shell pm list packages -f -3
Run Code Online (Sandbox Code Playgroud)

输出将是

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

现在使用以下代码拉出该包:

adb pull /data/app/XX.XX.XX.apk
Run Code Online (Sandbox Code Playgroud)

如果你执行cmd以上C:>\,那么你会在那里找到那个包.

  • 精确答案:) (2认同)

Mau*_*ijk 97

使用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
Run Code Online (Sandbox Code Playgroud)

如果您收到"adb:error:failed of stat remote object",则表示您没有所需的权限.我在一个没有根据的Moto Z2上运行它,并且能够下载除了youtube之外我没有卸载的所有APK(见下文).

adb shell pm uninstall --user 0 com.android.cellbroadcastreceiver   <--- kills presidential alert app!
Run Code Online (Sandbox Code Playgroud)

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

  • @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` (16认同)
  • 有关说明,请参阅 Yojimbo 的回答。 (2认同)

Pau*_*ida 53

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

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

adb shell pm list packages
Run Code Online (Sandbox Code Playgroud)

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

adb backup -apk com.twitter.android
Run Code Online (Sandbox Code Playgroud)

这里一个重要的事情是不设置加密备份的密码

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

dd if=backup.ab bs=24 skip=1 | openssl zlib -d > backup.tar
Run Code Online (Sandbox Code Playgroud)

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

希望它适合你们

  • 从http://blog.shvetsov.com/2013/02/access-android-app-data-without-root.html,如果你的openssl没有zlib,这可能有效:dd if = backup.ab bs = 1跳= 24 | python -c"import zlib,sys; sys.stdout.write(zlib.decompress(sys.stdin.read()))"| tar -xvf - (6认同)

RVR*_*RVR 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)
Run Code Online (Sandbox Code Playgroud)

  • 使用 linux 或 mac 而不是 findstr 的人使用 grep (4认同)

Vit*_*lov 10

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

adb shell 'cat `pm path com.example.name | cut -d':' -f2`' > app.apk
Run Code Online (Sandbox Code Playgroud)


Far*_*Haq 10

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

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

adb devices
Run Code Online (Sandbox Code Playgroud)

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

adb shell pm list packages
adb shell pm list packages -f -3
Run Code Online (Sandbox Code Playgroud)

输出(可用软件包列表)

package:/data/app/com.example.mytestapplication-sOzKi5USzfbYLPNDmaaK6g==/base.apk=com.example.mytestapplication
package:/data/app/com.example.myapplication-nd1I4FGnTZnQ9PyRbPDHhw==/base.apk=com.example.myapplication
Run Code Online (Sandbox Code Playgroud)

C)从上面的链接复制软件包(您要下载)。在我们的案例中,我选择了这个(com.example.myapplication)包

Syntax : adb shell pm path [your_package_name]
Command: adb shell pm path com.example.myapplication
Run Code Online (Sandbox Code Playgroud)

输出量

package:/data/app/com.example.myapplication-nd1I4FGnTZnQ9PyRbPDHhw==/base.apk
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

adb pull /system/app/CertInstaller/CertInstaller.apk /Users/$(whoami)/Documents/APK/download_apk/
Run Code Online (Sandbox Code Playgroud)

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

ls -la /Users/$(whoami)/Documents/
Run Code Online (Sandbox Code Playgroud)


elc*_*uco 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
Run Code Online (Sandbox Code Playgroud)

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

编辑:它不再适用于AndroidM:所有文件在另一个目录下命名为"base.apk".应该"微不足道"来修复.


Ped*_*ues 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\""
}
Run Code Online (Sandbox Code Playgroud)
  • 示例:android_pull_apk com.android.contacts
  • 注意:要识别包裹:adb shell pm list packages


adi*_*pta 6

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

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

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


Ous*_*ush 6

  1. 在手机上打开您想要从中提取 apk 的应用程序。
  2. 获取当前打开的应用程序:

    adb shell dumpsys activity activities | grep mFocusedActivity
    
    Run Code Online (Sandbox Code Playgroud)
  3. 获取包名的路径

    adb shell pm path <packagename.apk>
    
    Run Code Online (Sandbox Code Playgroud)

4.将你得到的路径复制到sdcard目录

    adb shell cp /data/app/<packagename.apk> /sdcard
Run Code Online (Sandbox Code Playgroud)

5.拉取apk

    adb pull /sdcard/base.apk
Run Code Online (Sandbox Code Playgroud)

编辑

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

adb shell dumpsys window windows | grep mCurrentFocus
Run Code Online (Sandbox Code Playgroud)


use*_*184 6

2023 年 6 月,使用:

adb shell pm list packages --user 0
Run Code Online (Sandbox Code Playgroud)

列出包名称,然后:

adb shell pm path your.package.name
adb pull /data/app/your/path/to/package/foo.apk
Run Code Online (Sandbox Code Playgroud)

获取包裹。


m01*_*m01 5

如果您知道(或者如果您可以"猜测")路径.apk(它似乎是格式/data/app/com.example.someapp-{1,2,..}.apk,那么您也可以从中复制它/data/app.这甚至可以在我的非根,Android手机上运行.

只需使用终端仿真器应用程序(例如这个)并运行:

# 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/
Run Code Online (Sandbox Code Playgroud)

然后,您可以将其从SD卡移动到您想要的任何位置(或将其附加到电子邮件等).最后一点可能在技术上是可选的,但是当你尝试对.apk文件做一些事情时,它会让你的生活变得更轻松.


Sam*_*amG 5

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

  • 接受的答案(包括来自@Isa A评论的'adb shell`命令)在Android 7.1.1上运行正常,而不是root. (3认同)

HEX*_*ube 5

尝试使用此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
Run Code Online (Sandbox Code Playgroud)

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

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