我试图提取安装Android应用的APK文件,而无需root权限。
我认为这是不可能的,因为对于非系统应用的所有APK文件位于/数据/应用程序,并访问该文件夹需要root权限。 后来我发现,有在谷歌Play商店的应用程序众多,似乎有机会获得APK文件甚至在非root权限的设备。
谁能告诉我这怎么可能? 是不是有备份软件的备份没有根的APK文件?
我试图提取安装Android应用的APK文件,而无需root权限。
我认为这是不可能的,因为对于非系统应用的所有APK文件位于/数据/应用程序,并访问该文件夹需要root权限。 后来我发现,有在谷歌Play商店的应用程序众多,似乎有机会获得APK文件甚至在非root权限的设备。
谁能告诉我这怎么可能? 是不是有备份软件的备份没有根的APK文件?
访问/数据/应用程序是可能的,而不根许可; 在该目录上的权限是rwxrwx - X。 执行权限上的目录意味着你可以访问它,但是缺乏读取权限的意味着你不能获得其内容的列表 - 因此,为了访问它,你必须知道你将要访问的文件的名称。 Android的包管理器会告诉你存储的APK的名称给定包。
要通过命令行执行此操作,使用adb shell pm list packages
获得安装的软件包列表,找到所需的包。
随着包名,我们可以用得到APK的实际文件名和位置adb shell pm path your-package-name
。
并且知道完整的目录,我们终于可以用拉ADB adb pull full/directory/of/the.apk
感谢@tarn用于指出棒棒糖下的APK路径将是/data/app/your-package-name-1/base.apk
Android的附加一个序列号给包名来产生最终的APK文件名(这是可能的,这与Android操作系统的版本而异)。 下面的命令序列工作的无根设备上:
获取所需的包的APK文件的全路径名。
adb shell pm path com.example.someapp
这使输出为: package:/data/app/com.example.someapp-2.apk
。
从Android设备的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);
}
当安装了Android的研究与开发你的Eclipse:
在牛轧糖(7.0)的Android版本上运行adb shell pm list packages
列出安装在设备上的包。 然后运行adb shell pm path your-package-name
,以显示APK的路径。 之后利用亚行复制软件包下载总数adb shell cp /data/app/com.test-1/base.apk /storage/emulated/0/Download
。 然后通过运行从拉下载APK到你的机器adb pull /storage/emulated/0/Download/base.apk
。
清单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
我找到了一种方法在非根设备获得的APK软件包名称。 它不是那么优雅,但工程所有的时间。
第1步 :您的设备上,打开目标APK
第2步 :在PC cmd窗口,输入此命令:
adb shell dumpsys activity a > dump.txt
因为这个命令的输出众多,重定向到文件建议。
第3步 :打开任何编辑这个文件dump.txt。
用于设备befor 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产量变化不大。 尝试搜索“堆栈#1”,包的名称将是非常接近它下面。
此外,搜索“基本目录”,你会发现apk文件的完整路径!
我得到了一个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)
打开ES浏览器 - >在左上角按菜单按钮(三个横条纹) - 在图书馆节>选择应用程序。
因此,你得到所有用户的应用程序列表。 发现自己的应用,并与它长推选择它。 然后按在右低的角落“更多”,然后选择“发送”。 然后你可以使用不同的选项,例如,你可以选择“ES保存到”以.apk文件文件保存到你的主目录或其他地方。
或者,你可以从谷歌 “蓝牙文件传输” 播放 ,并设置主文件夹/system/
。 然后,你甚至可以去/
。