【问题标题】:Does Android keep the .apk files? if so where?Android 是否保留 .apk 文件?如果是的话在哪里?
【发布时间】:2011-01-31 06:23:24
【问题描述】:

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

Android 是否有一个标准的位置来保存此类文件?

【问题讨论】:

    标签: android packages apk installation


    【解决方案1】:

    您可以使用包管理器 (pm) 而不是 adb 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
    

    【讨论】:

    • 每个应用程序都有一个名称与包名称相同的文件夹,但最后是'-1'或'-2',知道为什么吗?
    • 指定目标文件路径或名称,adb pull /data/app/com.example.app-filename.apk path/to/desired/destination
    【解决方案2】:

    预装的应用程序位于/system/app 文件夹中。用户安装的应用程序位于/data/app。我猜你不能访问,除非你有一个根电话。 我这里没有root手机,但试试这个代码:

    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 魔法和 emu 中的 apk。

    【讨论】:

    • 这在摩托罗拉 Droid 和 Nexus One 上都像一个魅力,都是无根的。
    • 好吧,你从来没有说过你想要他们做什么:)
    • 我希望能够阅读它们并与它们一起做事。幸运的是它们是可读的。
    • 好在这些文件不仅是“可列出的”,而且是可读的,所以它们符合我的目的。
    • 我在别处读到 /data/app 中的 APK 仅对应于从 Play 商店下载的应用。这是正确的还是包含用户安装的任何东西?
    【解决方案3】:

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

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

    你不需要root你的手机,使用adb,或者写任何东西。

    【讨论】:

    • 投了反对票,因为这并不能真正回答问题。如果 OP 想使用 ADB 怎么办,以便它可以在授权调试但忘记密码或屏幕损坏的设备上使用。
    • 获取无根设备的apk文件的更简单方法。
    • 谢谢。 Upvoted 因为它以某种方式回答了这个问题:“它将它们保存在 /data 中,但前提是你执行过程 X”
    【解决方案4】:

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

    如果您只是在 shell 中四处寻找,当前非前向锁定的应用程序位于 /data/app/.apk。 shell 用户可以读取特定的.apk,但它不能列出目录。在未来的版本中,命名约定将略有改变,所以不要指望它保持不变,但是如果你从包管理器中获得 .apk 的路径,那么你可以在 shell 中使用它。

    【讨论】:

    • 什么是“前向锁定应用”?
    • 这是一种旧的复制保护机制,它安装了 .apk,其权限仅允许该应用程序读取它。
    【解决方案5】:

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

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

    您可以通过编写一个查询 PackageManager 的程序来获取所有已安装应用的完整列表。短代码sn-p如下:

    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
    }
    

    您还可以找到提供此类信息的应用程序。他们有很多。 Try this one (AppSender).

    【讨论】:

      【解决方案6】:

      从市场安装

      安装后是否保留apk是市场的行为。安装后谷歌播放不保留apk。其他第三方市场可能有不同的行为。

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

      当我们从调试工具安装apk时,直接调用adb install或者从eclipse/android studio,apk会被转移(adb push)到一个公共的可读写目录,通常是/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. 股票应用

        这些通常由制造商提供,包括用于系统运行的核心应用和谷歌服务,您可以在目录/system/app/system/priv-app下找到它们。

      2. 用户安装的应用程序

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

      3. SD卡上的应用

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

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

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

      【讨论】:

        【解决方案7】:

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

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

        我不知道这会提供一个详尽的列表,所以它可能有助于先运行应用程序。

        【讨论】:

          【解决方案8】:

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

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

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

          【讨论】:

            【解决方案9】:

            在 /data/app 但出于复制保护,我认为您无法访问它。

            【讨论】:

            • 那么一个允许通过蓝牙共享 APK 的应用究竟是如何工作的呢?他们是怎么做到的?
            【解决方案10】:

            如果您已获得 Root 权限,请下载应用 Root Explorer。根用户的最佳文件管理器。 无论如何,System/app 拥有手机自带的所有默认 apk,data/apk 拥有你已安装应用的所有 apk。只需长按您想要的 apk(在 Root Explorer 中),进入您的 /sdcard 文件夹并粘贴即可。

            【讨论】:

              【解决方案11】:

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

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

              【讨论】:

                【解决方案12】:
                • 数据/应用
                • 系统/应用程序
                • 系统/priv-app
                • mnt/asec(安装在 sdcard 中时)

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

                adb pull /mnt/asec

                【讨论】:

                  【解决方案13】:

                  .apk 文件可以位于 /data/app/ 目录下。使用 ES 文件资源管理器,我们可以访问这些 .APK 文件。

                  【讨论】:

                    【解决方案14】:

                    如果你使用 eclipse goto DDMS 然后文件资源管理器在那里你会看到 System/Apps 文件夹和 apk 在那里

                    【讨论】:

                      【解决方案15】:

                      当我在模拟器上安装我的应用程序时,它在

                      中显示了我的 .apk 文件

                      数据/应用 然后我用 ls data/app //查看是否存在或 不是

                      安装应用程序后,只需使用 ls 命令 vie shell 并检查所需目录,但这取决于您尝试安装的应用程序类型。我用这个方法Install 如果有任何问题,请指出。

                      【讨论】:

                      • 我也在尝试定位 apk,但我发现您无法找到所有 apk,因此我建议使用生根方法。我无法获得所有已安装的 apk。因此,最好将您的手机植根并使用 Titanium Backup 获取所有 apk,并更好地控制您的手机。
                      【解决方案16】:

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

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

                      【讨论】:

                        【解决方案17】:

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

                        【讨论】:

                          【解决方案18】:

                          与所选答案中所写的相反,您不需要 root,并且可以获得已安装应用程序的 APK,这就是我在我的应用程序上所做的 (here)。示例:

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

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

                          【讨论】:

                            【解决方案19】:

                            我来这篇文章是因为我想重新安装一些我非常喜欢的应用程序。 如果这是您的情况,只需转到 Google Play,然后查找“我的应用程序”、“全部”选项卡,您就会找到一种方法来重新安装您喜欢的某些应用程序。我遇到了一个问题,通过搜索一个应用程序找不到,但它在我的应用程序中,所以我可以在我的新手机中重新安装;)

                            【讨论】:

                              猜你喜欢
                              • 1970-01-01
                              • 1970-01-01
                              • 1970-01-01
                              • 2014-12-06
                              • 2013-07-16
                              • 2016-11-27
                              • 1970-01-01
                              • 1970-01-01
                              • 1970-01-01
                              相关资源
                              最近更新 更多