0
点赞
收藏
分享

微信扫一扫

PMS 启动过程概览

正义的杰克船长 03-14 11:45 阅读 2

1、系统启动时初始化:

在Android系统的启动过程中,SystemServer进程会负责创建并启动一系列系统服务。对于PMS,它是在Zygote进程孵化出SystemServer后,由SystemServer内部通过ServiceManager进行注册和服务初始化的。

// 系统服务初始化过程中的某个阶段
public class SystemServer {
  ...
  public void startBootstrapServices() {
    // 创建并启动PackageManagerService实例
    IPackageManager pm = new PackageManagerService();
    ServiceManager.addService(Context.PACKAGE_SERVICE, pm.asBinder());
  }
    ...
}

2、PMS 初始化关键步骤:

  • PackageManagerService构造函数会进行一些基本的初始化工作,包括初始化内部的数据结构、加载系统预置包信息等。
  • 之后,PMS会进一步与其它重要组件如ActivityManagerService交互,以同步应用状态和其他系统配置数据。
  • 它还会启动相关的后台线程来处理安装、卸载、更新等异步任务。

3、包扫描及数据库建立:

PMS会在启动期间或首次需要时扫描系统分区以及其他包含APK文件的目录,解析它们的manifest文件,并在SQLite数据库中存储相关信息。

// 在PackageManagerService内部类或方法中
public void scanPackages() {
  // 遍历系统分区和其他指定目录下的所有APK文件
  for (File apk : getApkFiles()) {
    PackageParser packageParser = new PackageParser(apk);
    Package pkgInfo = packageParser.parsePackage();

    // 验证签名、权限等信息
    if (validatePackage(pkgInfo)) {
      // 将解析后的包信息写入数据库
      mPackageManagerDatabase.insertPackage(pkgInfo);
    }
  }
}

4、服务接口暴露:

PMS作为Binder服务,对外提供了IPackageManager接口,其他服务或应用程序可以通过该接口与其交互,执行查询、安装、卸载等操作。

示例:查询已安装应用的版本号

// 应用程序调用示例
IPackageManager pm = ActivityManagerNative.getDefault().getPackageManager();
PackageInfo pkgInfo;
try {
    pkgInfo = pm.getPackageInfo("com.example.app", 0);
} catch (RemoteException e) {
    // 处理异常
}

if (pkgInfo != null) {
    String versionName = pkgInfo.versionName;
    int versionCode = pkgInfo.versionCode;
}

举报

相关推荐

0 条评论