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: 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/902759.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TensorFlow深度学习实战(14)——循环神经网络详解

TensorFlow深度学习实战(14)——循环神经网络详解 0. 前言1. 基本循环神经网络单元1.1 循环神经网络工作原理1.2 时间反向传播1.3 梯度消失和梯度爆炸问题2. RNN 单元变体2.1 长短期记忆2.2 门控循环单元2.3 Peephole LSTM3. RNN 变体3.1 双向 RNN3.2 状态 RNN4. RNN 拓扑结构…

PySide6 GUI 学习笔记——常用类及控件使用方法(常用类矩阵QRectF)

文章目录 类描述构造方法主要方法1. 基础属性2. 边界操作3. 几何运算4. 坐标调整5. 转换方法6. 状态判断 类特点总结1. 浮点精度&#xff1a;2. 坐标系统&#xff1a;3. 有效性判断&#xff1a;4. 几何运算&#xff1a;5. 类型转换&#xff1a;6. 特殊处理&#xff1a; 典型应用…

Electron主进程渲染进程间通信的方式

在 Electron 中&#xff0c;主进程和渲染进程之间的通信主要通过 IPC&#xff08;进程间通信&#xff09;机制实现。以下是几种常见的通信方式&#xff1a; 1. 渲染进程向主进程发送消息&#xff08;单向&#xff09; 渲染进程可以通过 ipcRenderer.send 向主进程发送消息&am…

【C++基础知识】C++类型特征组合:`disjunction_v` 和 `conjunction_v` 深度解析

这两个模板是C17引入的类型特征组合工具&#xff0c;用于构建更复杂的类型判断逻辑。下面我将从技术实现到实际应用进行全面剖析&#xff1a; 一、基本概念与C引入版本 1. std::disjunction_v (逻辑OR) 引入版本&#xff1a;C17功能&#xff1a;对多个类型特征进行逻辑或运算…

私有知识库 Coco AI 实战(二):摄入 MongoDB 数据

在之前的文章中&#xff0c;我们介绍过如何使用《 Logstash 迁移 MongoDB 数据到 Easyseach》&#xff0c;既然 Coco AI 后台数据存储也使用 Easysearch&#xff0c;我们能否直接把 MongoDB 的数据迁移到 Coco AI 的 Easysearch&#xff0c;使用 Coco AI 对数据进行检索呢&…

sql server 与navicat测试后,连接qt

先用Navicat测试和sql的连通性&#xff0c;Navicat和sql连通之后&#xff0c;qt也能和sql连通了。 Navicat和Sqlserver Management 能连上&#xff0c;项目无法连接本地 Navicat 连接SQLServer 数据库 QT国内镜像网站 Navicat连接SqlServer的问题点 Sql Server的基本配置以及使…

2025年3月电子学会青少年机器人技术(六级)等级考试试卷-理论综合

青少年机器人技术等级考试理论综合试卷&#xff08;六级&#xff09; 分数&#xff1a;100 题数&#xff1a;30 一、单选题(共20题&#xff0c;共80分) 1. 2025年初&#xff0c;中国科技初创公司深度求索在大模型领域迅速崛起&#xff0c;其开源的大模型成为全球AI领域的焦…

spark local模式搭建运行示例

Apache Spark 是一个强大的分布式计算框架&#xff0c;但在本地模式下&#xff0c;它也可以作为一个单机程序运行&#xff0c;非常适合开发和测试阶段。以下是一个简单的示例&#xff0c;展示如何在本地模式下搭建和运行 Spark 程序。 一、环境准备 安装 Java Spark 需要 Java…

【人工智能】解锁 AI 潜能:DeepSeek 大模型迁移学习与特定领域微调的实践

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 随着大型语言模型(LLMs)的快速发展,迁移学习与特定领域微调成为提升模型性能的关键技术。本文深入探讨了 DeepSeek 大模型在迁移学习中的…

视频智能分析平台EasyCVR无线监控:全流程安装指南与功能应用解析

在当今数字化安防时代&#xff0c;无线监控系统的安装与调试对于保障各类场所的安全至关重要。本文将结合EasyCVR视频监控的强大功能&#xff0c;为您详细阐述监控系统安装过程中的关键步骤和注意事项&#xff0c;帮助您打造一个高效、可靠的监控解决方案。 一、调试物资准备与…

【k8s系列7-更新中】kubeadm搭建Kubernetes高可用集群-三主两从

主机准备 结合前面的章节,这里需要5台机器,可以先创建一台虚拟机作为基础虚拟机。优先把5台机器的公共部分优先在一台机器上配置好 1、配置好静态IP地址 2、主机名宇IP地址解析 [root@localhost ~]# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost…

【Java后端】MyBatis 与 MyBatis-Plus 如何防止 SQL 注入?从原理到实战

在日常开发中&#xff0c;SQL 注入是一种常见但危害巨大的安全漏洞。如果你正在使用 MyBatis 或 MyBatis-Plus 进行数据库操作&#xff0c;这篇文章将带你系统了解&#xff1a;这两个框架是如何防止 SQL 注入的&#xff0c;我们又该如何写出安全的代码。 什么是 SQL 注入&#…

数据分析案例:医疗健康数据分析

目录 数据分析案例:医疗健康数据分析1. 项目背景2. 数据加载与预处理2.1 加载数据2.2 数据清洗3. 探索性数据分析(EDA)3.1 再入院率概览3.2 按年龄分组的再入院率3.3 住院时长与再入院4. 特征工程与可视化5. 模型构建与评估5.1 数据划分5.2 训练逻辑回归5.3 模型评估6. 业务…

3台CentOS虚拟机部署 StarRocks 1 FE+ 3 BE集群

背景&#xff1a;公司最近业务数据量上去了&#xff0c;需要做一个漏斗分析功能&#xff0c;实时性要求较高&#xff0c;mysql已经已经不在适用&#xff0c;做了个大数据技术栈选型调研后&#xff0c;决定使用StarRocks StarRocks官网&#xff1a;StarRocks | A High-Performa…

软件设计师/系统架构师---计算机网络

概要 什么是计算机网络&#xff1f; 计算机网络是指将多台计算机和其他设备通过通信线路互联&#xff0c;以便共享资源和信息的系统。计算机网络可以有不同的规模&#xff0c;从家庭网络到全球互联网。它们可以通过有线&#xff08;如以太网&#xff09;或无线&#xff08;如W…

1.5软考系统架构设计师:架构师的角色与能力要求 - 超简记忆要点、知识体系全解、考点深度解析、真题训练附答案及解析

超简记忆要点 角色职责 需求规划→架构设计→质量保障 能力要求 技术&#xff08;架构模式/性能优化&#xff09; 业务&#xff08;模型抽象→技术方案&#xff09; 管理&#xff08;团队协作/风险控制&#xff09; 知识体系 基础&#xff1a;CAP/设计模式/网络协议案例&am…

基于STM32的汽车主门电动窗开关系统设计方案

芯片和功能模块选型 主控芯片 STM32F103C8T6:基于 ARM Cortex - M3 内核,有丰富的 GPIO 接口用于连接各类外设,具备 ADC 模块可用于电流检测,还有 CAN 控制器方便实现 CAN 总线通信。它资源丰富、成本低,适合学生进行 DIY 项目开发。按键模块 轻触按键:用于控制车窗的自…

第十三届蓝桥杯 2022 C/C++组 修剪灌木

目录 题目&#xff1a; 题目描述&#xff1a; 题目链接&#xff1a; 思路&#xff1a; 核心思路&#xff1a; 思路详解&#xff1a; 代码&#xff1a; 代码详解&#xff1a; 题目&#xff1a; 题目描述&#xff1a; 题目链接&#xff1a; P8781 [蓝桥杯 2022 省 B] 修…

6.学习笔记-SpringMVC-拦截器(P71-P74)

1.拦截器简介 拦截器的底层思想是AOP思想 2.拦截器入门案例 &#xff08;一&#xff09;制作拦截器的功能类 一般情况下&#xff0c;拦截器都是给表现层用的&#xff0c;所以创建在controller下。 &#xff08;二&#xff09;配置拦截器的执行位置 在projectinterceptor.…

GAIA-2:用于自动驾驶的可控多视图生成世界模型

25年3月来自英国创业公司 Wayze 的论文“GAIA-2: A Controllable Multi-View Generative World Model for Autonomous Driving”。&#xff08;注&#xff1a;23年9月其发布GAIA-1&#xff09; 生成模型为模拟复杂环境提供一种可扩展且灵活的范例&#xff0c;但目前的方法不足…