繁体   English   中英

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

[英]How do I get the APK of an installed app without root access?

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

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

有人能告诉我这怎么可能吗? 没有备份应用程序可以在没有 root 的情况下备份 APK 文件吗?

无需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。 APK 文件存储到您运行控制台的目录中。

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

Android 将序列号附加到包名称以生成最终的 APK 文件名(这可能会因 Android OS 的版本而异)。 以下命令序列适用于非 root 设备

  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

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

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

您可以使用 android PackageManager 来完成。

下面是一个小代码片段。

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);
}

在 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 拉到您的机器上。

  1. 检查已安装 apk 的列表(以下命令还列出了它的安装路径和包名称)。 adb shell pm list packages -f
  2. 使用adb pull /package_path/package name /path_in_pc (包路径和包名可以从上面的命令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)

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

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

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

打开 ES explorer -> 按下左上角的 Menu 按钮(三个水平条纹) -> 在 Libraries 部分中选择 APPs。

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

我找到了一种在非 root 设备中获取 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 

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

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

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

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

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-DroidPlay 商店中获得。

在 Ghost Commander 应用程序中,转到应用程序,然后只需按列表中的一个应用程序并选择复制 .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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM