Android是否保留.apk文件?如果是这样,在哪里?


185

android从Marketplace安装应用程序后,它是否保留.apk文件?

Android是否会保留此类文件的标准位置?

Answers:


123

预安装的应用程序位于/system/app文件夹中。用户安装的应用程序位于中/data/app。我想除非您拥有一部扎根的手机,否则您将无法访问。我这里没有手机,但是请尝试以下代码:

public class Testing extends Activity {
    private static final String TAG = "TEST";
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        File appsDir = new File("/data/app");

        String[] files = appsDir.list();

        for (int i = 0 ; i < files.length ; i++ ) {
            Log.d(TAG, "File: "+files[i]);

        }
    }

它确实列出了我扎根的htc魔术和e中的apk。


在Motorola Droid和Nexus One上,这就像“魅力”一样,都是非扎根的。
古巴特龙(Gubatron)2010年

好的,您从没说过想要什么:)
Macarse

我希望能够阅读它们并与他们一起做事。幸运的是,它们是可读的。
古巴特罗(Gubatron)2010年

3
好消息是,不仅文件是“可列出的”,而且还可读,因此符合我的目的。
古巴特罗(Gubatron)2010年

我在其他地方读过,/ data / app中的APK仅对应于从Play商店下载的应用。这是正确的还是包括用户安装的所有内容?
基督教徒

132

您可以使用包管理器(pmadb shell列出包:

adb shell pm list packages | sort

并显示.apk文件的位置:

adb shell pm path com.king.candycrushsaga
package:/data/app/com.king.candycrushsaga-1/base.apk

adb pull下载apk。

adb pull data/app/com.king.candycrushsaga-1/base.apk

2
每个应用程序都有一个文件夹,其名称与软件包名称相同,但末尾为“ -1”或“ -2”,知道为什么吗?
shadygoneinsane

要指定目标文件的路径或名称,adb pull /data/app/com.example.app-filename.apk path/to/desired/destination
manikanta

95

如果您只想获取以前安装的某个东西的APK文件,请执行以下操作:

  1. 从Google Play获取AirDroid
  2. 从PC Web浏览器使用AirDroid访问手机
  3. 转到应用并选择已安装的应用
  4. 点击“下载”按钮,从您的手机下载该应用的APK版本

您无需扎根手机,使用adb或编写任何东西。


2
投反对票,因为这并不能真正回答问题。如果OP希望使用ADB,以便可以在授权调试但忘记密码或屏幕破​​裂的设备上使用,该怎么办。
Hack5

为无根设备获取apk文件的简便方法。
法赫米·哈马迪

谢谢 Upvoted使它以某种方式回答了这个问题:“它将它们保留在/ data中,但仅当您执行过程X时才如此”
ntg

26

没有标准位置,但是您可以使用PackageManager查找有关软件包的信息,并从中获取ApplicationInfo类,其中包含有关特定软件包的各种信息:其.apk的路径,其数据目录的路径,该路径到仅资源的.apk(用于向前锁定的应用程序)等。请注意,根据您与其他应用程序的关系,您可能会或可能不具有读取这些目录的权限;但是,所有应用程序都可以读取资源.apk(这也是非前向锁定应用程序的真实.apk)。

如果您只是在外壳中闲逛,则当前非前向锁定的应用程序位于/data/app/.apk中。Shell用户可以读取特定的.apk,尽管它无法列出目录。在将来的版本中,命名约定将稍有更改,因此不要指望它保持不变,但是,如果您从包管理器中获得.apk的路径,则可以在外壳中使用它。


2
什么是“前向锁定应用”?
东尼·陈

1
这是一种旧的复制保护机制,其安装.apk的权限仅允许该应用程序读取它。
hackbod 2012年

18

预安装的应用程序通常位于/ system / app中,而用户安装的应用程序位于/ data / app中。

您可以使用“ adb pull”,但是您需要知道APK文件的完整路径。在模拟器上,您可以使用“ adb shell” +“ ls”获得目录列表。但是在Android设备上,由于安全原因,您将无法在“ / data”文件夹中执行此操作。那么,您如何找出APK文件的完整路径?

通过编写查询PackageManager的程序,可以获得安装的所有应用程序的完整列表。以下是简短的代码段:

PackageManager  pm = getPackageManager();
List<PackageInfo> pkginfo_list = pm.getInstalledPackages(PackageManager.GET_ACTIVITIES);
List<ApplicationInfo> appinfo_list = pm.getInstalledApplications(0);
for (int x=0; x < pkginfo_list.size(); x++){             
  PackageInfo pkginfo = pkginfo_list.get(x);
  pkg_path[x] = appinfo_list.get(x).publicSourceDir;  //store package path in array
}

您还可以找到提供此类信息的应用。有很多。 试试这个(AppSender)。


9

如果您正在寻找特定应用程序的路径,那么一个快速而肮脏的解决方案就是grep bugreport:

$ adb bugreport | grep 'dir=/data/app' 

我不知道这将提供详尽的列表,因此它可能有助于先运行该应用程序。


9

从市场安装

安装后是否保留apk是市场行为。安装后,Google Play不会保留APK。其他第三方市场可能会有不同的行为。

从开发/调试工具安装(adb,eclipse,android studio)

当我们从调试工具安装apk时,直接adb install从eclipse / android studio 调用或从eclipse / android studio安装apk adb push,通常会将apk传输()到公共可读写目录/data/local/tmp/。之后,该工具将使用pm命令进行安装,/data/local/tmp/安装成功后,它将删除临时apk 。

我们可以从调试输出中获取这些信息,如下所示。

$ adb install bin/TestApplication.apk 
3155 KB/s (843375 bytes in 0.260s)
    pkg: /data/local/tmp/TestApplication.apk
Success

系统如何保持APK

当然,系统必须将所有apk存储在某个地方。系统根据不同类型的apk来保留apk的三个位置:

  1. 用于股票应用

    这些通常是按制造商在设备中发货的,包括用于系统运行的核心应用程序和Google服务,您可以在目录/system/app和下找到它们/system/priv-app

  2. 用户安装的应用

    大多数apk都属于此类。这些apk通常由用户或adb install-s选择地从市场安装。您可以在/data/app有根设备的目录下找到它们。

  3. sdcard上的应用

    如果apk android:installLocation="auto"在清单中及其清单中启用了sdcard的安装位置,则可以将该应用从系统的“应用管理器”菜单移至sdcard。这些APK通常位于sdcard的安全文件夹中/mnt/sdcard/asec

    将命令强制安装到sdcard的另一种方法是使用命令adb install -s apk-to-install.apk

请注意,用于预安装应用的.apk文件不再位于单个文件中。有一个文件夹,其中包含目录中每个预安装的应用程序/system/app/system/priv-app最新android版本的文件。


8

您可以使用ADB拉应用程序。我相信它们位于/ data / App /中。

adb pull (location on device) (where to save)

请注意,您必须扎根手机才能提取受版权保护的应用。


5

在/ data / app中,但是出于复制保护的目的,我认为您不能访问它。


2
那么,允许通过蓝牙共享APK的应用到底如何工作?他们是如何做到的呢?
小孩

5

如果您是root用户,请下载应用程序Root Explorer。拥有root用户的最佳文件管理器。无论如何,系统/应用程序具有手机随附的所有默认apk,而数据/ apk具有您已安装的所有应用程序的apk。只需长按所需的apk(在Root Explorer中),进入/ sdcard文件夹并粘贴即可。


4

使用它列出/ data / app /下的所有.apks

adb bugreport | grep 'package name="' | grep 'codePath="/data' | cut -d'"' -f4

4
  • 数据/应用
  • 系统/应用
  • 系统/私人应用
  • mnt / asec(在sdcard中安装时)

您可以从任何一个中提取.apks:

亚行拉/ mnt / asec


3

.apk文件可以位于/ data / app /目录下。使用ES File Explorer,我们可以访问这些.APK文件。



0

当我在模拟器上安装我的应用程序时,它显示了我的.apk文件

data / app然后我用ls data / app //查看它是否存在

安装应用程序后,只需使用ls命令vie shell并检查所需的目录,但这取决于您要安装的应用程序类型。 如果有任何问题,我使用此方法来安装 Point。


我也在尝试查找apk,但是我发现您无法找到所有apk,因此我建议使用生根方法。我无法获取所有已安装的apk。因此,最好将手机植根并使用Titanium Backup获取所有apk,并更好地控制手机。
贾瓦德·阿姆贾德

0

apk在植根设备上获取找不到的另一种方法是使用rom工具箱

使用应用程序管理器进行备份,然后转到storage/emulated/appmanager并检查系统应用程序备份用户应用程序备份


0

要找到apk,请从Play商店下载并安装Bluetooth App Sender。安装完成后,打开Bluetooth App Sender。它将显示(.apk)设备中安装的所有应用程序,然后您可以通过蓝牙轻松地将应用程序传输到PC。


0

与所选答案上写的内容相反,您不需要root用户,并且可以获取已安装应用程序的APK,这就是我在应用程序上所做的操作(此处)。例:

List<PackageInfo> packages=getPackageManager().getInstalledPackages(0);

然后,对于列表中的每个项目,您都可以访问packageInfo.applicationInfo.sourceDir,这是已安装应用程序APK的完整路径。


-1

好吧,我来这篇帖子是因为我想重新安装一些我非常喜欢的应用程序。如果是这种情况,只需转到Google Play,然后找到“我的应用”,“全部”标签,您将找到一种重新安装您喜欢的应用的方法。我遇到了一个问题,我无法通过搜索一个应用程序找到它,但是它存在于我的应用程序中,因此我可以在新的手机中重新安装它;)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.