我如何获得一个安装的应用程序的APK没有根访问权?

我试图提取一个安装的Android应用程序的APK文件没有根权限。

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

谁能告诉我这是怎么回事?难道没有备份程序可以备份APK文件吗?

264189 次浏览

访问/data/app不需要root权限;该目录的权限为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。APK文件存储在运行控制台的目录中。

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

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

  • 使用您的设备作为调试设备。在手机上:设置> 应用程序>开发并启用USB调试,参见 李http://developer.android.com/tools/device.html < / >
  • 在Eclipse中打开DDMS-window: Window >打开透视图>其他…> DDMS,参见http://developer.android.com/tools/debugging/ddms.html
  • 如果您无法看到您的设备,请尝试(重新)为您的设备安装USB-Driver 李设备< / >
  • 在中间窗格选择选项卡“文件资源管理器”,并进入系统>应用程序
  • 现在你可以选择一个或多个文件,然后点击“拉一个文件” 从顶部的“设备”图标(右边的选项卡)
  • 选择目标文件夹- tada!

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

Android将一个序列号附加到包名以产生最终的APK文件名(这可能与Android OS版本不同)。下面的命令序列适用于内面的设备:

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

    adb shell pm path com.example.someapp
    

    这将给出如下输出:package:/data/app/com.example.someapp-2.apk.

  2. 将APK文件从Android设备拉到开发箱。

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

The location of APK after successful pulling will be at ../sdk/platform-tools/base.apk on your pc/laptop.

  1. 检查已安装apk的列表(下面的命令还列出安装的路径和包名)。 Adb shell PM列表包-f
  2. 使用adb pull /package_path/package name /path_in_pc (包的路径和包的名称可以从上面的命令1中获取)
我找到了一种在非根设备中获得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:
* TaskRecord{41aa9ed0 #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: ActivityRecord{41ba1a30 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文件的完整路径!

在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从下载中拉到你的机器中

打开ES资源管理器->按左上角的菜单按钮(三条横条)->在库部分选择应用程序。

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

我得到一个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)

一行命令,按包分开下载到路径

SEARCH_APP="minecraft" && PKGS=$(adb shell pm list packages | grep ${SEARCH_APP}) && for PKG in ${PKGS}; do PKG=${PKG#*:} && mkdir -p ${SEARCH_APP}/${PKG} && PKG_FILES=$(adb shell pm path ${PKG}) && for PKG_FILE in ${PKG_FILES}; do PKG_FILE=${PKG_FILE#*:} && adb pull $PKG_FILE ${SEARCH_APP}/${PKG}; done; done

通过免费和开源的Ghost Commander应用程序可以获得已安装应用程序的APK文件,该应用程序在F-Droid玩店上都可用。

在幽灵指挥官应用程序中,进入“应用程序”,然后简单地从列表中long-tap一个应用程序,并选择复制。.apk文件将在其他文件面板中可用;你可以把它放在任何你想要的地方。

注意,因为Ghost Commander是一个双面板的文件管理器,你第一个必须使用另一个面板并在那里打开一个文件夹(这是我们想要复制apk文件的地方)。然后,转到另一个面板,选择应用程序。

(如果你没有看到“应用程序”,首先点击箭头,选择主页。)

链接:

  1. https://f-droid.org/packages/com.ghostsq.commander/
  2. https://sourceforge.net/projects/ghostcommander/
  3. https://play.google.com/store/apps/details?id=com.ghostsq.commander