获取安装的应用程序的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的版本而异)。 以下命令序列在非根设备上工作 :
-
获取所需软件包的APK文件的完整path名称。
adb shell pm path com.example.someapp
这给出了输出:
package:/data/app/com.example.someapp-2.apk
。 -
将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文件。 获取并享受!
- 检查已安装的apk的列表(以下命令还列出了它的安装path和软件包名称)。 adb shell pm列表包-f
- 使用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!