我正在寻找一种方法来解压安装的Android应用程序的APK文件,而无需root权限。
第一感觉是没有root权限的情况下,这是不可能的,因为非系统APP的所有APK文件都位于/data/app中,并且访问此文件夹需要root权限。但是,我发现Google Play中有很多应用程序,即使在non-rooted设备上也可以访问APK文件。
有人能告诉我这是否可能的吗?在没有root的情况下,难道没有备份应用程序APK的备份文件夹吗?
最佳解决方法
没有根权限, 访问/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
了
在Lollipop下,apk路径将是/data/app/your-package-name-1/base.apk
次佳解决方法
Android会在程序包名称后附加一个序列号以产生最终的APK文件名(这可能会因Android OS的版本而异)。以下命令序列可在没有root权限的设备上工作:
-
获取所需软件包的APK文件的完整路径名称。
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
第三种解决方法
Google Play商店中有一个名为”Apk extracter”的应用程序。通过这个应用程序,你可以得到安装应用程序的.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);
}