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;
}