获取安装的应用程序的APK

我正在寻找一种方法来解压安装的Android应用程序的APK文件,而无需root权限。

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

有人能告诉我这是可能的吗? 没有备份应用程序的备份APK文件没有根?

访问/数据/应用程序是可能的,没有根权限; 该目录上的权限是rwxrwx – x。 对目录的执行权限意味着你可以访问它,但是缺less读取权限意味着你不能获得它的内容列表 – 所以为了访问它,你必须知道你将要访问的文件的名称。 Android的包pipe理器会告诉你给定包的存储apk的名字。

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

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

而且知道完整的目录,我们可以使用adb pull full/directory/of/the.apk来拉取adb

感谢@tarn指出,在棒棒糖下,apkpath将是/data/app/your-package-name-1/base.apk

Android会在程序包名称后附加一个序列号以产生最终的APK文件名(这可能会因Android OS的版本而异)。 以下命令序列在非根设备上工作

  1. 获取所需软件包的APK文件的完整path名称。

     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 

您不需要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); } 

Google Play商店中有一个名为“Apk extracter”的应用程序。 通过这个应用程序,你可以得到安装应用程序的.apk文件。 获取并享受!

  1. 检查已安装的apk的列表(以下命令还列出了它的安装path和软件包名称)。 adb shell pm列表包-f
  2. 使用adb pull / package_path /软件包名称/ path_in_pc (可以从命令1得到的软件包path和软件包名称)

当您安装了用于Android开发的Eclipse时:

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

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

或者,您可以从Google Play获得“Bluetooth文件传输”,并将主文件夹设置为/system/ 。 那么你甚至可以去/

列表PackageManager.getInstalledApplications()会给你一个已安装的应用程序的列表,而ApplicationInfo.sourceDir是.apk文件的path。

 // 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 

我有一个解决scheme,最近我尝试了。 但是我发现当你使用zapya共享应用程序时,它会在设备的zapya目录的apps文件夹中存储相同文件的.apk扩展名,在那里你可以获得安装在你的设备上的应用程序的apk文件

打开ES浏览器 – >按左上angular的菜单button(三横条纹) – >在库部分select应用程序。

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

我find了一种在非根设备中获取APK包名的方法。 它不是那么优雅,但始终工作。

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

步骤2 :在PC cmd窗口中input以下命令:

  adb shell dumpsys activity a > dump.txt 

因为这个命令的输出很多,build议redirect到一个文件。

第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输出已经改变了一点。 尝试search“堆栈#1”,包名称将非常接近它。

此外,search“baseDir”,你会发现apk文件的完整path!