开始
PackageInstaller 调用 InstallAppProgress 活动来接收来自用户的指令。 InstallAppProgress 将要求PackageManager Service 通过 installd 安装包。源代码在<Android Source>/packages/apps/PackageInstaller。
当我们安装APK文件时,包管理器解析包(APK)文件并显示确认,当用户按下OK按钮时,包管理器调用名为installPackage的方法,带有这四个参数,即uri,@ 987654332@,观察者,installPackageName。包管理器启动一个名为“包”的服务,现在所有模糊的事情都发生在这个服务中。您可以在 PackageInstaller 源代码中查看 PackageInstallerActivity.java 和 InstallAppProgress.java。在 system_service 进程中运行的包管理器服务和作为本机进程运行的安装守护进程 (installd) 都在系统启动时启动。
APK 文件在 Android 中的存储位置?
- 预安装(即相机、日历、浏览器等)
APK 存储在 /system/app/ 中
- 用户安装(ApiDemo、Any.do 等)APK 存储在
/data/app/
- 包管理器创建数据目录
/data/data/<package name>/ 来存储数据库、共享首选项、本机库和缓存数据
您可能会看到apk 文件和*.odex 文件对于相同的APK,ODEX 文件是完全不同的讨论和目的。
详细的APK安装过程是什么?
以下进程在Package Manager Service中执行。
- 等待中
- 将包添加到安装过程的队列中
- 确定包安装的适当位置
- 确定安装安装/更新新的
- apk 文件的副本到给定目录
- 确定应用的 UID
- 请求安装的守护进程
- 创建应用目录并设置权限
- dex代码提取到缓存目录
- 反映和packages.list
/system/data/packages.xml最新状态
- 广播到系统名称连同安装完成包的效果
Intent.ACTION_PACKAGE_ADDED:如新(Intent.ACTION_PACKAGE_REPLACED):如是更新。
包管理器如何存储数据?
包管理器将应用程序信息存储在三个文件中,位于/data/system。以下示例是从Android 4 ICS 模拟器图像中提取的。
packages.xml:此文件包含权限列表和包/应用程序。
这个xml文件存储了两件事1.权限2.包(应用程序),权限存储在<permissions>标签下。每个权限都有三个属性,分别是名称、包和保护。 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 和 link 2。