目录
一、概念与核心作用
二、技术架构与模块组成
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);
// 安装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("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() {
@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 = parsePackage(args); // 解析APK
mSettings.insertPackageSettingLPr(pkg); // 更新设置
// Phase 4: 优化处理
performDexOpt(pkg); // Dex编译优化
mArtManagerService.notifyPackagesReplaced(...); // ART运行时更新
// Phase 5: 广播通知
sendPackageBroadcast("android.intent.action.PACKAGE_ADDED"); // 系统广播
}
1.4 底层支持层实现
installd 守护进程
// 路径:frameworks/native/cmds/installd/commands.cpp
const struct cmdinfo cmds[] = {
{ "ping", 0, do_ping }, // 心跳检测
{ "install", 5, do_install }, // 安装命令
{ "dexopt", 10, do_dexopt }, // Dex优化
{ "rmdex", 2, do_rmdex }, // 删除Dex
{ "movefiles", 0, do_movefiles }, // 文件迁移
{ "rmpackages", 1, do_rm_packages }, // 删除包
{ "create_user_data", 4, do_create_user_data }, // 创建用户数据
};
典型操作流程
# installd 执行日志示例
I/installd: Starting to process command:
installd install com.example.app 10123 /data/app/vmdl123.tmp 0
D/installd: Creating directory /data/app/com.example.app-1
D/installd: Copying APK to /data/app/com.example.app-1/base.apk
I/installd: Running dexopt on /data/app/.../base.apk
D/dex2oat : Compiling package com.example.app with speed-profile
Dex优化技术演进
| Android版本 | 优化技术 | 特点 |
|---|---|---|
| 4.4之前 | Dalvik的dexopt | 生成ODEX文件 |
| 5.0-8.1 | ART的AOT编译 | 安装时全量编译 |
| 9.0+ | Profile-Guided优化 | 结合使用统计进行热点优化 |
| 10.0+ | Cloud Profile | 从Google服务器获取优化配置 |
| 12.0+ | Background Dexopt | 空闲时自动优化 |
2. 核心模块技术要点与工作流程
2.1 PackageParser
核心职责:解析 APK 文件,提取应用元数据(包名、组件、权限等),生成内存中的 Package 对象。
工作流程:
APK 扫描:遍历 /system/app、/data/app 等目录。
解析 Manifest:
读取 AndroidManifest.xml,解析为 ActivityInfo、ServiceInfo 等对象。
处理 <uses-permission>、<application> 等标签。
资源处理:加载 resources.arsc,解析资源 ID 和类型。
生成 Package:构建包含所有元数据的 Package 对象。
示例:解析微信 APK
PackageParser parser = new PackageParser();
File apkFile = new File("/data/app/com.tencent.mm/base.apk");
Package pkg = parser.parsePackage(apkFile, 0);
// 输出包名:com.tencent.mm
// 包含 15 个 Activity、3 个 Service、5 个 BroadcastReceiver
2.2 Settings
核心职责:持久化存储包管理状态(安装位置、权限、用户配置等)。
工作流程:
启动加载:读取 /data/system/packages.xml 恢复包状态。
运行时更新:在安装/卸载时更新内存中的 PackageSetting。
持久化保存:将变更写入 XML 文件。
数据结构示例:
<!-- packages.xml 片段 -->
<package name="com.tencent.mm"
codePath="/data/app/com.tencent.mm-1"
userId="10123">
<sigs count="1">
<cert index="3" /> <!-- 签名证书索引 -->
</sigs>
<perms>
<item name="android.permission.CAMERA" granted="true"/>
</perms>
</package>
2.3 PermissionManager
核心职责:管理系统权限的授予状态与策略。
工作流程(以授予相机权限为例):
权限声明检查:验证应用是否在 Manifest 中声明权限。
危险权限弹窗(Android 6.0+):向用户请求授权。
状态更新:
更新内存中的 UidPermissionState
写入 runtime-permissions.xml
SELinux 更新:调整应用的进程上下文。
代码示例:
// 授予权限
mPermissionManager.grantRuntimePermission("com.tencent.mm",
Manifest.permission.CAMERA, UserHandle.USER_SYSTEM);
// 检查权限状态
int result = mPermissionManager.checkPermission(
"android.permission.CAMERA",
"com.tencent.mm",
UserHandle.USER_SYSTEM);
2.4 Installer
核心职责:通过 Binder 与 installd 守护进程通信,执行底层文件操作。
关键操作流程:
创建应用目录:
// installd 命令
create_app_data /data/user/0/com.tencent.mm 10123 0
APK 复制:将临时 APK 移动到 /data/app 目录。
Dex 优化:调用 dex2oat 生成 OAT 文件。
清理旧数据:卸载时删除 /data/data/com.tencent.mm。
2.5 ComponentManager
核心职责:管理四大组件(Activity/Service 等)的注册与查询。
组件注册流程:
解析组件:从 Package 对象提取 <activity> 等标签。
构建索引:
mActivities 按 Intent Filter 分类存储
mProviders 按 Authority 建立映射
跨进程同步:通知 ActivityManagerService 更新组件状态。
示例:注册一个 Activity
// 从 Package 解析出的 ActivityInfo
ActivityInfo activityInfo = new ActivityInfo();
activityInfo.name = "com.tencent.mm.ui.WelcomeActivity";
activityInfo.exported = true;
activityInfo.intentFilters.add(new IntentFilter(Intent.ACTION_MAIN));
// 注册到 PMS
mComponentManager.addActivity(activityInfo, "default");
2.6 UserManagerService
核心职责:管理多用户环境下的应用配置。
关键流程(创建新用户):
分配用户 ID:如从 0(主用户)到 10(新用户)。
克隆配置:
复制 /data/system/users/0 到 /data/system/users/10
修改文件权限为 user:all
隔离数据:创建 /data/user/10/com.tencent.mm 目录。
技术实现:
// 创建用户数据目录
mInstaller.createUserData("com.tencent.mm", UserHandle.USER_SYSTEM, 0);
// 克隆权限配置
mSettings.cloneUserState(UserHandle.USER_SYSTEM, newUserId);
三、启动与初始化流程
1. 系统启动时序
SystemServer.main()
└→ startBootstrapServices()
└→ mPackageManagerService = PackageManagerService.main()
├→ 构造PMS实例
├→ 扫描系统预置应用(/system、/vendor等)
├→ 扫描用户安装应用(/data/app)
├→ 解析共享库
└→ 初始化权限管理
2. 关键初始化方法
// frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java
public static PackageManagerService main(...) {
PackageManagerService m = new PackageManagerService(...);
m.enableSystemUserPackages();
m.updatePackagesIfNeeded();
return m;
}
private void scanDirTracedLI(File scanDir, ...) {
// 执行深度文件扫描
ParallelPackageParser parser = new ParallelPackageParser();
for (File file : files) {
parser.parsePackage(file); // 并发解析APK
}
}
四、关键技术要点
1. APK解析优化
并行解析:Android 8.0引入ParallelPackageParser实现多线程解析
缓存机制:使用package.xml(settings.xml)持久化存储元数据
增量更新:通过PackageManager delta API实现增量安装
2. 权限管理
运行时权限(Android 6.0+)
权限树与权限组管理
SELinux策略集成
3. 安装优化技术
流式安装(Session API)
拆分APK支持(APK Split)
容器化安装(Isolated UID)
五、核心源码解析
1. 关键类路径
frameworks/base/services/core/java/com/android/server/pm/
├── PackageManagerService.java # PMS主类
├── PackageParser.java # APK解析器
├── Settings.java # 包状态存储
└── Installer.java # 与installd通信
frameworks/base/core/java/android/content/pm/
└── PackageManager.java # 公开API接口
2. 安装流程核心代码
// PackageManagerService.java
void installPackageLI(InstallArgs args, PackageInstalledInfo res) {
// 1. 验证签名
verifySignatures(...);
// 2. 解析APK
PackageParser.Package pkg = parsePackage(...);
// 3. 检查版本冲突
if (isDowngrade(pkg)) throw PackageManagerException(...);
// 4. 执行安装
synchronized (mInstallLock) {
installPackageTracedLI(pkg, args, res);
}
// 5. 优化Dex文件
mPackageDexOptimizer.performDexOpt(...);
}
六、开发调试指南
1. 常用ADB命令
# 查看已安装包列表
adb shell pm list packages -f
# 强制重新解析所有包
adb shell am force-stop com.android.packagemanager
adb shell pm clear com.android.packagemanager
# 获取包详细信息
adb shell dumpsys package [pkg_name]
2. 日志过滤技巧
adb logcat | grep -E 'PackageManager|PackageParser'
3. 调试技巧
启用安装日志:
adb shell setprop log.tag.PackageManager VERBOSE
使用StrictMode检测安装耗时
分析/data/system/packages.xml文件
七、典型问题排查
1. 安装失败常见原因
签名冲突(existing package conflicted)
版本降级(downgrade detected)
存储空间不足(insufficient storage)
清单文件解析错误(parse error)
2. 权限问题调试
// 检查权限授予状态
adb shell dumpsys package permissions
// 重置权限
adb shell pm reset-permissions



















暂无评论内容