如何在没有root访问权限的情况下获取已安装应用的APK?

时间:2012-06-13 10:29:37

标签: android root apk

我正在尝试提取已安装的Android应用的APK文件,但没有root权限。

我认为这是不可能的,因为非系统应用的所有APK文件都位于/ data / app中,访问此文件夹需要root权限。然后我发现Google Play商店中有很多应用即使在非root设备上也可以访问APK文件。

有人能告诉我这是怎么回事吗?是否有备份应用程序在没有root的情况下备份APK文件?

11 个答案:

答案 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

来获取adb

感谢@tarn指出在Lollipop下,apk路径将为/data/app/your-package-name-1/base.apk

答案 1 :(得分:49)

Android会将一个序列号附加到包名称以生成最终的APK文件名(这可能会因Android OS的版本而异)。以下命令序列适用于非root设备

  1. 获取所需包的APK文件的完整路径名。

    adb shell pm path com.example.someapp
    

    这将输出为:package:/data/app/com.example.someapp-2.apk

  2. 将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)

  1. 检查已安装apk的列表(以下命令还列出了安装它的路径和包名称)。 adb shell pm list packages -f
  2. 使用 adb pull / package_path / package name / path_in_pc (可以从命令1上面获得包路径和包名。)

答案 4 :(得分:6)

安装Eclipse for Android开发时:

  • 将您的设备用作调试设备。在手机上:设置&gt; 应用程序&gt;开发并启用USB调试,请参阅 http://developer.android.com/tools/device.html
  • 在Eclipse中,打开DDMS窗口:Window&gt; Open Perspective&gt;其他...&gt; DDMS,请参阅http://developer.android.com/tools/debugging/ddms.html
  • 如果您无法看到您的设备,请尝试(重新)安装USB驱动程序 设备
  • 在中间窗格中选择选项卡“文件资源管理器”,然后转到系统&gt;应用
  • 现在您可以选择一个或多个文件,然后单击“拉取文件” 从设备“顶部的图标(右侧的标签)
  • 选择目标文件夹 - tada!

答案 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/。然后你甚至可以去/