我试图提取一个安装的Android应用程序的APK文件没有根权限。
我认为这是不可能的,因为所有非系统应用程序的APK文件都位于/data/app中,访问这个文件夹需要root权限。然后我发现谷歌Play商店中有许多应用程序似乎可以在非根设备上访问APK文件。
谁能告诉我这是怎么回事?难道没有备份程序可以备份APK文件吗?
我试图提取一个安装的Android应用程序的APK文件没有根权限。
我认为这是不可能的,因为所有非系统应用程序的APK文件都位于/data/app中,访问这个文件夹需要root权限。然后我发现谷歌Play商店中有许多应用程序似乎可以在非根设备上访问APK文件。
谁能告诉我这是怎么回事?难道没有备份程序可以备份APK文件吗?
当前回答
我找到了一种在非根设备中获取APK包名的方法。 虽然不是很优雅,但是一直都很好用。
第一步:在您的设备上,打开目标APK
第二步:在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
包名在第三行,本例中为com.tencent.mm。
Android 4.4及以上版本: dumpsys的输出发生了一些变化。 尝试搜索“Stack #1”,包名会在它下面很近的地方。
另外,搜索“baseDir”,你会找到apk文件的完整路径!
其他回答
在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拉到你的机器。
通过免费和开源的Ghost Commander应用程序可以获得已安装应用程序的APK文件,该应用程序可在F-Droid和Play Store上使用。
在幽灵指挥官应用程序中,进入应用程序,然后简单地长按列表中的应用程序并选择复制。.apk文件将在其他文件面板中可用;你可以把它放在任何你想要的地方。
请注意,由于Ghost Commander是一个双面板的文件管理器,你首先必须使用另一个面板并在那里打开一个文件夹(这是我们想要复制apk文件的地方)。然后,转到另一个面板,选择应用程序。
(如果你没有看到“应用程序”,首先点击箭头,选择主页。)
链接:
https://f-droid.org/packages/com.ghostsq.commander/ https://sourceforge.net/projects/ghostcommander/ https://play.google.com/store/apps/details?id=com.ghostsq.commander
访问/data/app不需要root权限;该目录的权限为rwxrwx—x。对一个目录的执行权限意味着你可以访问它,但是缺乏读权限意味着你不能获得它的内容列表——所以为了访问它,你必须知道你要访问的文件的名称。Android的包管理器会告诉你一个给定包的apk的名称。
要从命令行执行此操作,请使用adb shell pm list packages来获取已安装包的列表并找到所需的包。
有了包名,我们可以使用adb shell pm path your-package-name获取APK的实际文件名和位置。
知道了完整的目录,我们最终可以使用adb拉/the.apk的完整/directory/来拉adb。APK文件存储在运行控制台的目录中。
感谢@tarn指出,在Lollipop下,apk路径将是/data/app/your-package-name-1/base.apk
Android将一个序列号附加到包名以产生最终的APK文件名(这可能与Android OS版本不同)。在非root设备上执行以下命令:
获取所需包的APK文件的完整路径名。 Adb shell PM路径com.example.someapp 这将输出为:package:/data/app/com.example.someapp-2.apk。 将APK文件从Android设备拉到开发框中。 Adb pull /data/app/com.example.someapp-2.apk
成功拉出APK后,APK的位置将在你pc/笔记本电脑上的../sdk/platform-tools/base.apk。
我得到了一个不存在的错误
以下是我如何做到的:
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)