"How are" Android 应用程序(Facebook 等)安装到 android phone?

"How are" Android applications (Facebook etc.) installed to an android phone?

我知道如何将应用程序安装到 Android 设备,例如从 Play-Store 或通过 .apk文件。但是我想了解安装的实际过程。

例如在 Windows:

到目前为止,我对 Android 应用程序安装过程的了解是:

但除此之外,我对 Android 安装过程的了解非常有限,例如:

希望有人能填空,谢谢。

开始

PackageInstaller 调用 InstallAppProgress activity 以接收来自用户的指令。 InstallAppProgress 将要求 PackageManager 服务通过 installd 安装包。源代码位于 <Android Source>/packages/apps/PackageInstaller.

当我们安装 APK 文件时,包管理器解析包(APK)文件并显示确认,当用户按下确定按钮时,包管理器使用这些调用名为 installPackage 的方法四个参数分别是uriinstallFlags、observer、installPackageName。包管理器启动了一项名为 "package" 的服务,现在所有模糊的事情都发生在该服务中。您可以在 PackageInstaller 源代码中查看 PackageInstallerActivity.javaInstallAppProgress.java。 system_service 进程中的程序包管理器服务 运行 和作为本机进程运行的安装守护进程 (installd) 都在系统启动时启动。

其中 APK 文件存储在 Android ?

  1. 预安装(即相机、日历、浏览器等)APK 存储在 /system/app/
  2. 用户安装(ApiDemo、Any.do 等)APK 存储在 /data/app/
  3. Package Manager 创建数据目录/data/data/<package name>/ 来存储数据库、共享首选项、本机库和缓存数据

您可能会看到 apk 文件和 *.odex 文件相同 APKODEX 文件是完全不同的讨论和目的。

APK安装过程详细是什么?

以下进程在 Package Manager Service.

中执行
  • 等待
  • 将包添加到安装过程的队列中
  • 确定包安装的合适位置
  • 确定安装安装/更新新
  • 将 apk 文件复制到给定目录
  • 确定应用程序的UID
  • 请求安装守护进程
  • 创建应用程序目录并设置权限
  • 提取dex代码到缓存目录
  • 反映和packages.list/system/data/packages.xml最新状态
  • 连同名称广播到系统安装完成包的效果 Intent.ACTION_PACKAGE_ADDED:如新(Intent.ACTION_PACKAGE_REPLACED):更新的情况下。

包管理器如何存储数据?

Package Manager 将应用程序信息存储在三个文件中,位于 /data/system。以下示例是从 Android 4 ICS 模拟器图像中提取的。

packages.xml:此文件包含权限列表和 Packages/Applications。 这个 xml 文件存储两件事 1. 权限 2. 包(应用程序),权限存储在 <permissions> 标签下。每个 Permission 具有三个属性,即 name、package 和 protection。 name 属性有我们在 AndroidManifest.xml 中使用的权限名称,package 属性表示权限属于包,在大多数情况下 "android" 是值,因为 <permission> 标签包含默认权限和 protection 表示安全级别.

packages.list:这是一个简单的文本文件,包含包名称、用户 ID、标志和数据目录,我找不到任何完美的描述,但我假设它packages.list 文件可以更快地查找已安装的软件包,因为它只保留重要信息。

com.android.launcher 10013 0 /data/data/com.android.launcher
com.android.quicksearchbox 10033 0 /data/data/com.android.quicksearchbox
com.android.contacts 10001 0 /data/data/com.android.contacts
com.android.inputmethod.latin 10006 0 /data/data/com.android.inputmethod.latin

packages-stoped.xml: 此文件包含已停止状态的软件包列表,Stope 声明应用程序无法接收任何广播。

在哪里可以找到包管理器和包安装程序的源代码?

包管理器

frameworks/base/services/java/com/android/server/pm/Settings.java
frameworks/base/services/java/com/android/server/pm/PackageManagerService.java
frameworks/base/services/java/com/android/server/pm/IPackageManager.aidl
frameworks/base/services/java/com/android/server/pm/PackageSignatures.java
frameworks/base/services/java/com/android/server/pm/PreferredActivity.java
frameworks/services/java/com/android/server/PreferredComponent.java
frameworks/core/java/android/content/IntentFilter.java
frameworks/base/core/java/android/content/pm/PackageParser.java
frameworks/base/services/java/com/android/server/pm/Installer.java
frameworks/base/core/java/com/android/internal/app/IMediaContainerService.aidl
frameworks/base/packages/DefaultContainerService/src/com/android/defcontainer/DefaultContainerService.java

软件包安装程序

packages/apps/PackageInstaller/src/com/android/packageinstaller/PackageInstallerActivity.java
packages/apps/PackageInstaller/src/com/android/packageinstaller/PackageUtil.java
packages/apps/PackageInstaller/src/com/android/packageinstaller/InstallAppProgress.java.

参考链接link 1 and link 2.