我正在尝试提取没有root权限的已安装Android应用的APK文件 .
我认为这是不可能的,因为非系统应用程序的所有APK文件都位于/ data / app中,访问此文件夹需要root权限 . 然后我发现Google Play商店中有很多应用即使在非root设备上也可以访问APK文件 .
有人能告诉我这是怎么回事吗?是否有备份应用程序备份没有root的APK文件?
或者您可以从Google Play获取'Bluetooth File Transfer'并将主文件夹设置为 /system/ . 然后你甚至可以去 / .
/system/
/
没有root权限就可以访问/ data / app;该目录的权限是rwxrwx - x . 对目录的执行权限意味着您可以访问它,但是缺少读取权限意味着您无法获取其内容的列表 - 因此,为了访问它,您必须知道将要访问的文件的名称 . Android的包管理器将告诉您给定包的存储apk的名称 .
要从命令行执行此操作,请使用 adb shell pm list packages 获取已安装软件包的列表并找到所需的软件包 .
adb shell pm list packages
使用包名称,我们可以使用 adb shell pm path your-package-name 获取APK的实际文件名和位置 .
adb shell pm path your-package-name
并且知道完整目录,我们最终可以使用 adb pull full/directory/of/the.apk 来获取adb
adb pull full/directory/of/the.apk
感谢@tarn指出在Lollipop下,apk路径将是 /data/app/your-package-name-1/base.apk
/data/app/your-package-name-1/base.apk
Android会在程序包名称中附加一个序列号,以生成最终的APK文件名(这可能会因Android OS的版本而异) . 以下命令序列适用于非root设备:
adb shell pm path com.example.someapp
这将输出显示为: package:/data/app/com.example.someapp-2.apk .
package:/data/app/com.example.someapp-2.apk
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); }
当您安装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驱动程序
在中间窗格中选择选项卡"File Explorer"并转到系统>应用程序
现在您可以选择一个或多个文件,然后单击顶部的"Pull a file from the device"图标(选项卡右侧)
选择目标文件夹 - tada!
检查已安装apk的列表(以下命令还列出了安装它的路径和包名称) . adb shell pm list packages -f
使用 adb pull /package_path/package name /path_in_pc (可以从命令1上面获得的包路径和包名)
在Nougat(7.0)Android版本上运行 adb shell pm list packages 以列出设备上安装的软件包 . 然后运行 adb shell pm path your-package-name 以显示apk的路径 . 使用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下载到您的机器 .
adb shell cp /data/app/com.test-1/base.apk /storage/emulated/0/Download
adb pull /storage/emulated/0/Download/base.apk
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
我找到了一种在非root设备中获取APK包名称的方法 . 它不是那么优雅,但总是有效 .
Step 1 :在您的设备上,打开目标APK
Step 2 :在PC cmd窗口中,键入以下命令:
adb shell dumpsys activity a > dump.txt
因为此命令的输出很多,建议重定向到文件 .
Step 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文件的完整路径!
打开ES资源管理器 - >按左上角的菜单按钮(三个水平条纹) - >在库部分选择APP .
因此,您将获得所有用户应用程序的列表 . 找到你的应用程序,并长时间推选它 . 然后在右下角按“更多”并选择“发送” . 然后你可以使用不同的选项,例如您可以选择“ES保存到”以将.apk文件保存到您的主目录或其他任何位置 .
10 回答
或者您可以从Google Play获取'Bluetooth File Transfer'并将主文件夹设置为
/system/
. 然后你甚至可以去/
.没有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感谢@tarn指出在Lollipop下,apk路径将是
/data/app/your-package-name-1/base.apk
Android会在程序包名称中附加一个序列号,以生成最终的APK文件名(这可能会因Android OS的版本而异) . 以下命令序列适用于非root设备:
这将输出显示为:
package:/data/app/com.example.someapp-2.apk
.您无需ROOT权限即可获取已安装应用程序的列表 .
你可以用android PackageManager来做 .
以下是一个小代码段 .
当您安装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驱动程序
在中间窗格中选择选项卡"File Explorer"并转到系统>应用程序
现在您可以选择一个或多个文件,然后单击顶部的"Pull a file from the device"图标(选项卡右侧)
选择目标文件夹 - tada!
检查已安装apk的列表(以下命令还列出了安装它的路径和包名称) . adb shell pm list packages -f
使用 adb pull /package_path/package name /path_in_pc (可以从命令1上面获得的包路径和包名)
在Nougat(7.0)Android版本上运行
adb shell pm list packages
以列出设备上安装的软件包 . 然后运行adb shell pm path your-package-name
以显示apk的路径 . 使用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下载到您的机器 .List PackageManager.getInstalledApplications() 将为您提供已安装应用程序的列表,ApplicationInfo.sourceDir是.apk文件的路径 .
我找到了一种在非root设备中获取APK包名称的方法 . 它不是那么优雅,但总是有效 .
Step 1 :在您的设备上,打开目标APK
Step 2 :在PC cmd窗口中,键入以下命令:
因为此命令的输出很多,建议重定向到文件 .
Step 3 :使用任何编辑器打开此dump.txt文件 .
适用于Android 4.4的设备:
文件的开头看起来像这样:
包名称位于第3行,本例中为 com.tencent.mm .
对于Android 4.4及更高版本:
dumpsys的输出有所改变 . 尝试搜索"Stack #1",包名称将在它下方非常接近 .
另外,搜索“baseDir”,你会发现apk文件的完整路径!
打开ES资源管理器 - >按左上角的菜单按钮(三个水平条纹) - >在库部分选择APP .
因此,您将获得所有用户应用程序的列表 . 找到你的应用程序,并长时间推选它 . 然后在右下角按“更多”并选择“发送” . 然后你可以使用不同的选项,例如您可以选择“ES保存到”以将.apk文件保存到您的主目录或其他任何位置 .