我正在尝试提取已安装的Android应用的APK文件,但没有root权限。
我认为这是不可能的,因为非系统应用的所有APK文件都位于/ data / app中,访问此文件夹需要root权限。然后我发现Google Play商店中有很多应用即使在非root设备上也可以访问APK文件。
有人能告诉我这是怎么回事吗?是否有备份应用程序在没有root的情况下备份APK文件?
答案 0 :(得分:347)
无需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
感谢@tarn指出在Lollipop下,apk路径将为/data/app/your-package-name-1/base.apk
答案 1 :(得分:49)
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
答案 2 :(得分:18)
您无需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);
}
答案 3 :(得分:7)
答案 4 :(得分:6)
安装Eclipse for Android开发时:
答案 5 :(得分:6)
在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从apk下载到您的计算机。
答案 6 :(得分:2)
我有一个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)
答案 7 :(得分:0)
列表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
答案 8 :(得分:0)
我找到了一种在非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的输出有所改变。
尝试搜索&#34;堆栈#1&#34;,包名称将非常接近它。
另外,搜索&#34; baseDir&#34;,你会找到apk文件的完整路径!
答案 9 :(得分:-1)
打开ES资源管理器 - &gt;按下左上角的菜单按钮(三个水平条纹) - &gt;在Libraries部分选择APPs。
因此,您可以获得所有用户应用的列表。找到你的应用程序并长按它来选择它。然后在右下角按“更多”并选择“发送”。然后你可以使用不同的选项,例如您可以选择“ES保存到”以将.apk文件保存到您的主目录或其他任何位置。
答案 10 :(得分:-2)
或者您可以从 Google Play 获取“蓝牙文件传输”,并将主文件夹设置为/system/
。然后你甚至可以去/
。