56

我试图了解如何在 Android 上安装 apk 的过程,特别是通过 adb install (我正在测试的地方)安装 Android SDK 模拟器。

在搜索中,除了“apk 被简单地复制到 /data/app 并在您运行它时安装。这对我来说并不令人满意,因为它没有解释 apk 的图标如何出现在菜单上。问题。

来自 Windows 背景,运行 .exe 或安装程序来安装程序会修改注册表、文件、服务等。我需要了解在 Android 上安装 apk 时是否会发生这种情况或类似情况。

因此,如果有人可以向我解释在 Android 上安装 apk 时具体会发生什么,我将不胜感激。

在旁注中,我还想知道 Dalvik VM " zygote" 是否参与安装,或者它是否发生在较低的 linux 内核级别?

我的最终目标是使用 strace 来记录 apk 的安装过程,以记录系统修改、文件创建、网络活动和其他感兴趣的事件。

4

4 回答 4

38

Android应用程序主要有两类。

  1. 系统应用程序:系统初始化时安装
  2. 用户应用程序:从 Play 商店安装,使用 ADB 或将 .apk 文件复制到 SD 卡中。

以下是分步安装过程。

  1. 解析AndroidManifest.xml,提取信息并存储到/data/system/packages.xml和/data/system/packages.list
  2. .apk 文件被复制到特定目录,并为此应用创建数据存储目录

XML 解析、资源分析和 .apk 文件复制由

包管理服务.java

但是,目录创建是由

安装d.c

PackageManageService.java 通过位于 /dev/socket/installed 的本地套接字与 installd.c 通信

.apk 文件被复制的包对于系统应用和用户应用是不同的。对于系统应用程序是

/系统/应用程序/

至于复制到 .apk 文件中的用户应用程序 .apk 文件被复制到

/数据/应用

从 .apk 文件中提取的 .dex 文件被复制到 /data/dalvik-cache/。

包管理器创建数据目录 /data/data// 来存储数据库、共享首选项、本机库和缓存数据

于 2015-08-18T08:46:12.997 回答
12

我认为,您想知道的一切都在 Android 开发者网站http://developer.android.com/tools/building/index.html中,为了了解应用程序本身的包装,这里的图片更好(不是APK安装过程,但它可以帮助您了解apk结构和安装)。您还可以通过 Google 搜索 aapt 工具和 .dex 以了解更多信息,因为 classes.dex 是您的应用程序的子结构 - 包含已编译的 java 和类。一个 dex 文件包含多个类,而 java 类文件只包含一个类。dex 文件是使用 DX 工具转换的 java 字节码,DX 工具是 Android SDK 的组成部分。因此,它允许每个应用程序作为自己的进程运行,并使用自己的 Dalvik 虚拟机实例。 APK

于 2012-09-16T01:23:44.787 回答
0

“详细APK安装流程是什么?以下流程在Package Manager Service中执行。

  • 等待
  • 将包添加到安装过程的队列中
  • 确定包安装的合适位置
  • 确定安装安装/更新新
  • 将apk文件复制到给定目录
  • 确定应用的UID
  • 请求已安装的守护进程
  • 创建应用目录并设置权限
  • 提取dex代码到缓存目录
  • 反映和packages.list/system/data/packages.xml的最新状态
  • 广播到系统的名字伴随着安装的效果是 -complete package Intent.ACTION_PACKAGE_ADDED: If new (Intent.ACTION_PACKAGE_REPLACED): case of an update”

更多信息链接https://dzone.com/articles/depth-android-package-manager

于 2021-08-25T08:28:06.160 回答
-1

这是在两个级别上完成的 1.) PackageInstaller(UI) 使用 PackageManagerService(System service) 将命令发送到第二部分(Installd) 2.) Installd 是一个实际安装 apk 的守护进程。Installd 和 PackageManagerService 使用套接字通信进行通信。使用的插座是自己安装的。您可以参考 init.rc 在 init 创建套接字。

于 2016-06-23T11:35:25.807 回答