在 Android 系统中,PackageManagerService(简称 PMS)是负责管理应用程序的核心服务。无论是应用安装、卸载,还是权限分配,PMS 都扮演着至关重要的角色。
本篇文章将带你深入探讨 PMS 的幕后机制,特别是 APK 安装与解析的详细流程。
步骤 | 完成任务 | 影响范围 |
---|---|---|
启动 PMS 服务 | 注册 PMS 到 ServiceManager,成为系统管理的核心服务。 | 提供应用管理能力,供系统其他组件调用。 |
初始化组件 | 构建数据结构、组件解析器,启动后台线程。 | 提供运行时支持,准备后续任务。 |
加载持久化数据 | 恢复设备重启前的已安装应用信息。 | 确保已安装应用在系统重启后仍被识别和管理。 |
扫描并解析 APK | 扫描系统和用户目录,解析 APK 元数据,并注册到内存。 | 让系统能够识别和管理设备上的所有 APK。 |
初始化权限系统 | 加载默认权限配置文件,为系统应用分配权限。 | 保障系统安全,防止权限滥用。 |
提供对外接口 | 通过 API 提供安装、卸载、查询等功能,供系统和开发者调用。 | 提供应用安装和运行管理能力。 |
源码路径:
frameworks/base/services/java/com/android/server/SystemServer.java
PMS 是 Android 启动服务的关键部分,在 startOtherServices() 方法中初始化:
private void startOtherServices() {
PackageManagerService pms = PackageManagerService.main(mSystemContext);
ServiceManager.addService("package", pms);
}
代码路径: frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java
public static PackageManagerService main(Context context) {
Installer installer = new Installer();
return new PackageManagerService(context, installer, ...);
}
代码路径: frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java
public PackageManagerService(Context context, Installer installer, ...) {
mContext = context;
mInstaller = installer;
// 初始化数据结构
mPackages = new ArrayMap<>();
mComponentResolver = new ComponentResolver();
// 创建并启动后台线程
mBackgroundThread = BackgroundThread.get();
mHandler = new PackageHandler(mBackgroundThread.getLooper());
// 初始化权限管理服务
mPermissionManager = new PermissionManagerService(context, ...);
// 恢复持久化存储的数据
mSettings = new Settings(...);
mSettings.readPackageRestrictionsLPr();
// 启动扫描逻辑
scanPackages();
}
初始化内容:
代码路径: frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java
private void scanPackages() {
scanDirLI(new File("/system/app"), ...); // 扫描系统目录
scanDirLI(new File("/data/app"), ...); // 扫描用户目录
}
private void scanDirLI(File dir, ...) {
File[] files = dir.listFiles();
for (File file : files) {
if (file.isFile() && file.getName().endsWith(".apk")) {
try {
// 解析 APK
PackageParser.Package pkg = parsePackage(file);
// 注册包信息
scanPackageLI(pkg, ...);
} catch (PackageParserException e) {
Slog.e(TAG, "Failed to parse package: " + file, e);
}
}
}
}
解析逻辑:
代码路径: frameworks/base/services/core/java/com/android/server/pm/PermissionManagerService.java
public void initializeDefaultPermissions() {
// 加载默认权限配置
loadDefaultPermissions();
for (String permission : defaultPermissions) {
grantPermission(permission);
}
}
主要工作:
代码路径: frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java
注册到 ServiceManager 后,PMS 提供以下对外服务:
1、获取已安装应用列表:
public List<PackageInfo> getInstalledPackages() {
...}
2、安装应用:
public void installPackage(String packageName, ...) {
...}
3、卸载应用:
public void deletePackage(String packageName, ...) {
...}