目录
一、概念与核心作用
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); // 安装APK public 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("https://")); 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() { @Override public 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: 解析注册 PackageParser.Package pkg =