PackageManagerService 解析3

500 阅读3分钟

PackageManagerService(简称PMS)是运行在Android系统中的一个核心服务,负责应用的安装、升级、卸载等许多与应用生命周期管理相关的功能。其工作过程相对复杂,这里将尽可能结合源码概述应用安装的流程:

  1. 安装请求的发起: 应用安装通常是通过系统提供的Intent机制进行。开发者或用户使用Intent(通常是ACTION_VIEWACTION_INSTALL_PACKAGE)并设置应用的Uri来启动安装进程。例如,可以通过如下代码开始安装一个应用:

    Intent intent = new Intent(Intent.ACTION_VIEW);
    Uri apkUri = Uri.fromFile(new File(filePath));
    intent.setDataAndType(apkUri, "application/vnd.android.package-archive");
    startActivity(intent);
    
  2. PackageInstaller的作用: 当上述代码执行后,系统的PackageInstaller应用会响应该Intent,接下来PackageInstaller会与PackageManagerService沟通,要求其完成实际的安装过程。

  3. PackageManagerService的安装流程: 接下来的工作主要由PMS完成。以下是PMS安装应用的简化流程及对应的源码路径说明(基于Android Open Source Project 9.0 Pie,视版本情况可能有差异):

    a. 解析APK文件 首先需要解析APK文件的AndroidManifest.xml来读取应用的元数据。PMS使用PackageParser类来解析APK。

    // frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java
    // (PackageParser的具体实现可以找到相应的parsePackage方法)
    PackageParser.Package pkg = PackageParser.parsePackage(apkFile, 0);
    

    b. 安装前准备 PackageManagerService会进行一些安装前的检查,例如空间是否足够,是否存在冲突的同名应用等。

    c. 复制APK至应用目录 如果检查无误,PackageManagerService会将APK文件从下载或暂存目录复制到安全的系统应用安装目录下,一般是/data/app目录。

    d. 创建应用数据和缓存目录 系统创建专属于应用的数据目录/data/data/<package_name>和缓存目录。

    e. 提取和编译代码 系统会提取APK中的dex代码,并可能利用ART或Dalvik运行时进行Ahead-Of-Time (AOT) 编译,优化应用的运行效率。

    f. 注册组件 PackageManagerService会将应用的组件(Activities, Services, Providers, Receivers等)信息注册到系统中。

    g. 完成安装并广播 改变应用的状态为已安装,然后广播Intent.ACTION_PACKAGE_ADDED,在系统的各个部分通知安装完成。

    h. 更新系统数据库 更新系统内部使用的数据库,记录新安装应用的信息。

上述步骤是一个非常高级的安装流程,而在实际源码中,这一过程还涉及了复杂的权限检查、签名验证、用户空间管理、SELinux策略设置等安全性相关的步骤。想要详细了解PMS的具体实现,需要深入研究PackageManagerService类以及它使用的其他相关类和Android系统服务的源码。

请注意,获取、阅读和理解PackageManagerService的源码需要相当的Android系统知识背景,需要熟悉Android的构建系统、系统框架层的代码结构以及Java编程语言。你可以在Android开源项目官方网站上找到相关的源码和更多的信息。