Android PackageManagerService(PMS)框架深度解析
目录
一、概念与核心作用
二、技术架构与模块组成
1. 分层架构
1.1 应用层架构细节
1.2 Binder接口层实现
1.3 PMS核心服务层
1.4 底层支持层实现
2. 核心模块技术要点与工作流程
2.1 PackageParser
2.2 Settings
2.3 PermissionManager
2.4 Installer
2.5 ComponentManager
2.6 UserManagerService
三、启动与初始化流程
1. 系统启动时序
2. 关键初始化方法
四、关键技术要点
1. APK解析优化
2. 权限管理
3. 安装优化技术
五、核心源码解析
1. 关键类路径
2. 安装流程核心代码
六、开发调试指南
1. 常用ADB命令
2. 日志过滤技巧
3. 调试技巧
七、典型问题排查
1. 安装失败常见原因
2. 权限问题调试
一、概念与核心作用
PackageManagerService(PMS)是Android系统的核心服务之一,负责全系统的应用包管理。它作为APK生命周期管理者,主要承担以下核心职责:
-
应用安装/卸载/更新管理
-
应用元数据解析与存储
-
权限系统管理
-
组件(Activity/Service等)注册管理
-
应用签名验证
-
多用户应用配置管理
二、技术架构与模块组成
1. 分层架构
+---------------------------+
| 应用层 (Java API) | # 开发者直接接触的API
| - PackageManager |
| - ApplicationPackageManager |
+---------------------------+↓ Binder IPC
+---------------------------+
| Binder接口层 (AIDL) | # 跨进程通信桥梁
| - IPackageManager.aidl |
| - IPackageInstaller.aidl |
+---------------------------+↓ Service调用
+---------------------------+
| PMS核心服务层 (SystemServer) | # 核心业务逻辑实现
| - PackageManagerService |
| - PackageInstallerService |
| - DexManagerService |
+---------------------------+↓ JNI/Native调用
+---------------------------+
| 底层支持层 (Native/C++) | # 系统级底层操作
| - installd 守护进程 |
| - dex2oat (ART编译器) |
| - SELinux策略引擎 |
+---------------------------+
1.1 应用层架构细节
- 核心类与功能
// 路径:frameworks/base/core/java/android/content/pm/PackageManager.java public abstract class PackageManager {// 获取应用信息public abstract ApplicationInfo getApplicationInfo(String packageName, int flags);// 查询Activity组件public abstract List<ResolveInfo> queryIntentActivities(Intent intent, int flags);// 安装APKpublic abstract void installPackage(Uri apkUri, IPackageInstallObserver observer, int flags); }
- 典型使用场景示例
// 检查相机权限状态 if (getPackageManager().checkPermission(Manifest.permission.CAMERA, "com.wechat") == PERMISSION_GRANTED) {// 启动相机功能 }// 查询所有浏览器应用 Intent intent = new Intent(Intent.ACTION_VIEW); intent.addCategory(Intent.CATEGORY_BROWSABLE); intent.setData(Uri.parse("http://")); List<ResolveInfo> browsers = pm.queryIntentActivities(intent, 0);
1.2 Binder接口层实现
- AIDL接口定义
// 路径:frameworks/base/core/java/android/content/pm/IPackageManager.aidl interface IPackageManager {PackageInfo getPackageInfo(String packageName, int flags, int userId);int installPackage(String originPath, int installFlags, String installerPackageName, in ParcelFileDescriptor fd);void deletePackage(String packageName, int flags, int userId);// 共包含120+个方法 }
- Binder调用流程
// Client端调用示例 IPackageManager pm = ActivityThread.getPackageManager(); pm.installPackage("file:///sdcard/app.apk", INSTALL_FULL_APP, "com.android.packageinstaller", null);// Server端处理(PMS内部) private final IPackageManager.Stub mBinder = new IPackageManager.Stub() {@Overridepublic int installPackage(String originPath, int flags, String installerPackageName, ParcelFileDescriptor fd) {// 执行实际安装逻辑return PMS.this.installPackage(...);} };
1.3 PMS核心服务层
- 服务类结构
// 路径:frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java public class PackageManagerService extends IPackageManager.Stub {// 核心成员变量final Settings mSettings; // 配置存储final Installer mInstaller; // 与installd交互final PermissionManagerService mPermissionManager; // 权限管理final Computer mComputer; // 组件查询引擎// 关键数据结构final ArrayMap<String, PackageParser.Package> mPackages = new ArrayMap<>();final WatchedArrayMap<String, SharedLibraryEntry> mSharedLibraries = new WatchedArrayMap<>(); }
- 核心处理流程(以APK安装为例)
void installPackageTracedLI(InstallArgs args, PackageInstalledInfo res) {// Phase 1: 预检verifySignaturesLPr(args); // 签名验证checkDowngrade(args); // 版本降级检查// Phase 2: 安装准备mInstaller.createAppData(...); // 创建数据目录copyApk(args.codeFile); // 复制APK到/data/app// Phase 3: