如何在没有 root 访问权限的情况下获取已安装应用程序的 APK?

Posted

技术标签:

【中文标题】如何在没有 root 访问权限的情况下获取已安装应用程序的 APK?【英文标题】:How do I get the APK of an installed app without root access? 【发布时间】:2012-06-16 07:09:45 【问题描述】:

我正在尝试在没有 root 权限的情况下提取已安装 android 应用的 APK 文件。

我认为这是不可能的,因为所有非系统应用的 APK 文件都位于 /data/app 中,访问该文件夹需要 root 权限。然后我发现 Google Play 商店中有许多应用程序似乎可以访问 APK 文件,即使在非 root 设备上也是如此。

谁能告诉我这怎么可能?没有root备份APK文件的备份应用吗?

【问题讨论】:

我认为这个问题已经得到解答。请看***.com/a/12197924/1016544 ***.com/questions/7632156/… How do I get an apk file from an Android device?的可能重复 where can i find the .apk file on my device, when i download any app and install?的可能重复 我对此的解读是@pinas 在询问如何以编程方式对此进行编码 - 引用执行此操作的应用程序就好像在说“这些应用程序执行此操作,但如何执行?”。因此,我认为这里的“搁置”原因是错误的。 【参考方案1】:

无需root权限即可访问/data/app;该目录的权限是 rwxrwx--x。对目录具有执行权限意味着您可以访问它,但是缺少读取权限意味着您无法获得其内容的列表——因此,为了访问它,您必须知道您将要访问的文件的名称。 Android 的包管理器会告诉你给定包的存储 apk 的名称。

要从命令行执行此操作,请使用adb shell pm list packages 获取已安装包的列表并找到所需的包。

通过包名,我们可以使用adb shell pm path your-package-name获取APK的实际文件名和位置。

知道完整目录后,我们终于可以使用adb pull full/directory/of/the.apk拉取adb

感谢@tarn 指出在 Lollipop 下,apk 路径将是 /data/app/your-package-name-1/base.apk

【讨论】:

要从命令行执行此操作,请使用adb shell pm list packages 获取已安装包的列表,选择所需的包,将-1.apk 附加到它,然后从/data/app 中提取它。示例:如果包名是org.mozilla.firefox,则使用adb pull /data/app/org.mozilla.firefox-1.apk 要获取 APK 的实际文件名,请使用 adb shell pm path your-package-name。请参阅此问题以获取更详细的答案***.com/questions/4032960/… 对于棒棒糖,apk 路径将是 /data/app/your-package-name-1/base.apk @0xcaff 自提供此答案以来的 5 年里,Android 发生了很大变化;也许这条道路就是这些变化之一。您应该能够手动登录并找到该文件,以便找到适合您的操作系统版本的任何路径。 有效!在 Windows 上,我使用具有相同命令的 PowerShell,在“adb pull full/directory/of/the.apk”之后,我可以在我的默认文件夹 C:\Users\myName\the.apk 中找到 the.apk【参考方案2】:

当您安装了 Eclipse for Android 开发时:

将您的设备用作调试设备。在您的手机上:设置 > 应用程序 > 开发和启用 USB 调试,请参阅 http://developer.android.com/tools/device.html 在 Eclipse 中,打开 DDMS 窗口:窗口 > 打开透视图 > 其他... > DDMS,见http://developer.android.com/tools/debugging/ddms.html 如果您看不到您的设备,请尝试(重新)为您的设备安装 USB 驱动程序 设备 在中间窗格中选择选项卡“文件资源管理器”并转到系统 > 应用程序 现在您可以选择一个或多个文件,然后单击“拉文件 从设备顶部的图标(选项卡右侧) 选择目标文件夹 - tada!

【讨论】:

/system/app 中只有系统应用(即预装应用)。【参考方案3】:

或者您可以从 Google Play 获取“蓝牙文件传输”并将主文件夹设置为 /system/ 。然后你甚至可以去/

【讨论】:

【参考方案4】:

您无需 ROOT 权限即可获取已安装应用程序列表。

你可以用 android PackageManager 做到这一点。

下面是一个小代码sn-p。

final PackageManager pm = getPackageManager();
//get a list of installed apps.
List<ApplicationInfo> packages =  pm.getInstalledApplications(PackageManager.GET_META_DATA);

for (ApplicationInfo packageInfo : packages) 
    Log.d(TAG, "Installed package :" + packageInfo.packageName);
    Log.d(TAG, "Apk file path:" + packageInfo.sourceDir);

【讨论】:

【参考方案5】:

Android 会在包名称后附加一个序列号以生成最终的 APK 文件名(这可能会因 Android 操作系统的版本而异)。以下命令序列适用于非 root 设备

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

    adb shell pm path com.example.someapp
    

    这给出的输出为:package:/data/app/com.example.someapp-2.apk

    从安卓设备拉取APK文件到开发箱。

    adb pull /data/app/com.example.someapp-2.apk
    

拉取成功后APK的位置会在你的pc/laptop上的../sdk/platform-tools/base.apk。

【讨论】:

可以确认此解决方案适用于非 root 设备,但在第一个命令之前确实需要了解包名称!使用“adb shell pm list packages”获取手机上所有包的列表,以防您不确定所需应用的包名称 apk 进入 puller 本地机器上的哪个文件夹?编辑:nvm,无论您在执行 adb pull 时所在的目录... @IgorGanapolsky 尝试使用 adb pull /data/app/com.example.someapp-2/base.apk @zelanix 在执行 adb pull 之后,我可以在其中 c .apk 文件。谢谢 我在 Android Studio 的项目构建视图中找到了 apk 位置。【参考方案6】:
    检查已安装apk 的列表(以下命令还列出了它的安装路径和包名称)。 adb shell pm list packages -f 使用adb pull /package_path/package name /path_in_pc (包路径和包名可以从上面的命令1中得到。)

【讨论】:

【参考方案7】:

List PackageManager.getInstalledApplications() 将为您提供已安装应用程序的列表,ApplicationInfo.sourceDir 是 .apk 文件的路径。

// in oncreate
   PackageManager pm = getPackageManager(); 
   for (ApplicationInfo app : pm.getInstalledApplications(0)) 
 Log.d("PackageList", "package: " + app.packageName + ", sourceDir: " + app.sourceDir);
 

//output is something like
D/PackageList(5010): package: com.example.xmlparse, sourceDir: /data/app   /com.example.xmlparse-2.apk
D/PackageList(5010): package: com.examples.android.calendar, sourceDir: /data/app/com.examples.android.calendar-2.apk
D/PackageList(5010): package: com.facebook.katana, sourceDir: /data/app/com.facebook.katana-1.apk
D/PackageList(5010): package: com.facebook.samples.profilepicture, sourceDir: /data/app/com.facebook.samples.profilepicture-1.apk
D/PackageList(5010): package: com.facebook.samples.sessionlogin, sourceDir: /data/app/com.facebook.samples.sessionlogin-1.apk
D/PackageList(5010): package: com.fitworld, sourceDir: /data/app/com.fitworld-2.apk
D/PackageList(5010): package: com.flipkart.android, sourceDir: /data/app/com.flipkart.android-1.apk
D/PackageList(5010): package: com.fmm.dm, sourceDir: /system/app/FmmDM.apk
D/PackageList(5010): package: com.fmm.ds, sourceDir: /system/app/FmmDS.apk

【讨论】:

【参考方案8】:

我找到了一种在非根设备中获取 APK 包名称的方法。 它不是那么优雅,但一直有效。

第 1 步:在您的设备上,打开目标 APK

第 2 步:在 PC cmd 窗口中,输入以下命令:

 adb shell dumpsys activity a > dump.txt

因为这个命令的输出很多,建议重定向到一个文件。

第 3 步:使用任意编辑器打开此 dump.txt 文件。

适用于 Android 4.4 之前的设备: 文件的开头看起来像这样:

ACTIVITY MANAGER ACTIVITIES (dumpsys activity activities)  
  Main stack:  
  * TaskRecord41aa9ed0 #4 A com.tencent.mm U 0  
    numActivities=1 rootWasReset=true userId=0  
    affinity=com.tencent.mm  
    intent=act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10600000 cmp=com.tencent.mm/.ui.LauncherUI  
    realActivity=com.tencent.mm/.ui.LauncherUI  
    askedCompatMode=false  
    lastThumbnail=null lastDescription=null  
    lastActiveTime=19915965 (inactive for 10s)  
    * Hist #9: ActivityRecord41ba1a30 u0 com.tencent.mm/.ui.LauncherUI  
        packageName=com.tencent.mm processName=com.tencent.mm 

包名在第三行,本例为com.tencent.mm

适用于 Android 4.4 及更高版本: dumpsys 输出发生了一些变化。 尝试搜索“Stack #1”,包名将在其下方非常接近。

另外,搜索“baseDir”,你会找到apk文件的完整路径!

【讨论】:

【参考方案9】:

在 Nougat(7.0) Android 版本上运行 adb shell pm list packages 以列出设备上安装的软件包。 然后运行adb shell pm path your-package-name 显示apk 的路径。 使用 adb 将包复制到 Downloads adb shell cp /data/app/com.test-1/base.apk /storage/emulated/0/Download 后。 然后通过运行adb pull /storage/emulated/0/Download/base.apk 将 apk 从 Downloads 拉到您的机器上。

【讨论】:

对我来说效果很好,而其他方法在非 root 设备上失败。我可以将应用程序用作 MyAppSharer,但我更喜欢这种可编写脚本的方法。【参考方案10】:

打开 ES 资源管理器 -> 按左上角的菜单按钮(三个水平条纹) -> 在库部分选择 APP。

因此,您将获得所有用户应用程序的列表。找到您的应用程序并长按选择它。然后按右下角的“更多”并选择“发送”。然后你可以使用不同的选项,例如您可以选择“ES Save To”以将 .apk 文件保存到您的主目录或其他任何位置。

【讨论】:

【参考方案11】:

我收到了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)

【讨论】:

解决 SELinux 问题的好方法,谢谢!

以上是关于如何在没有 root 访问权限的情况下获取已安装应用程序的 APK?的主要内容,如果未能解决你的问题,请参考以下文章

在没有root访问权限的情况下安装zsh? [关闭]

如何在没有 root 的情况下从 Ubuntu 18.04.3 中完全删除节点?

如何在没有 root 权限的情况下安装 Perl 模块?

如何在没有 root 访问权限的情况下在服务器上杀死其他人的 Python 进程?

如何在没有 root 用户的情况下在 Linux (CentOS) 中安装软件包并进行自动依赖处理?

如何在没有 root 权限的情况下在图像文件上安装 grub?