目标
1. 记录PMS相关所有概念;
这个活儿做好了后续分析时, 才能在心里先有个数, 有个整体的轮廓;
备注: 为了方便起见, 下文中AndroidManifest统一用AM作为简称;
PMS涉及到的目录以及对象
涉及到的目录 | 大概作用 |
---|---|
/data/system | 存储每个Apk的相关信息 |
com.android.server.pm.Settings | Android包的全局管理者, 协助PMS保存所有的安装包信息 |
PackageParser | 负责在Apk文件安装的时候, 解析AndroidManifest |
PackageInfo | 跨进程传递的包数据, 包解析时生成 |
PMS三大过程 | 1.包扫描; 2.包安装; 3.包查询 |
一、/data/system
开机时, 加载/data/system/目录下的信息, 从而实现加载到内存中. 在安装Apk时, 把这个Apk的信息
写入到/data/system/中, 就可以实现在Apk安装并删除原路径Apk文件后, 还可以运行APP;
1.1 关于packages-back与packages-stoped.xml文件
1. packages.xml: 记录了系统中所有安装的应用信息, 包括基本信息、签名和权限;
2. packages-back.xml: packages.xml备份的文件;
3. packages-stoped.xml: 记录系统中被强制停止运行的应用信息, 系统在强制停止某个应用时, 会
将应用的信息记录在该文件中;
4. packages-stoped-backup.xml: packages-stoped.xml文件的备份;
二、com.android.server.pm.Settings
Settings是Android的包的全局管理者, 用于协助PMS保存所有的安装包信息, 同时用于存储系统执行
过程中的一些设置.
三、PackageParser包解析器
在Android中, Settings提供可持续化的包信息管理, PackageSetting是一个存储单元, 表示一个pkg
信息. 我们在解析Apk安装包的时候, 会用到PackageParser, 在PackageParser里面有一个字段是
PackageParser.Package. 这个PackageParser.Package对应的是packages.xml里面的<package>标签.
PackageParser.Package可以理解为pkg信息在内存中的一个实时信息, 关机后消失, 重启后重新生成,
所以PackageParser.Package中的信息一直保证最新;
PackageParser的结构:
1. PackageParser: 包解析器
1. PackageParser.Package: 解析得到的包信息;
2. PP.Component: 组件的基类, 其子类对应到AndroidManifest.xml中定义的不同组件;
3. PP.Activity: 对应AndroidManifest.xml中<Activity/>和<Receiver/>标签;
4. PP.Service: 对应AM.xml中<Service/>标签;
5. PP.Provider: 对应AM.xml中定义<Provider/>标签;
6. PP.Instrumentation: 对应AM.xml中<Instrumentation/>标签;
7. PP.Permission: 对应AM.xml中<permission/>标签;
8. PP.Permission: 对应AM.xml中<permission-group/>标签;
2. PackageLite: 轻量的包信息;
3. ApkLite: 轻量级的Apk信息;
4. IntentInfo: 组件定义的<intent-filter/>信息, 保存了每个<intent-filter/>节点信息, 是基类,
它的子类是ActivityIntentInfo、ServiceIntentInfo和ProviderIntentInfo;
1. ActivityIntentInfo: 保存<activity/>和<receiver/>节点下的<intent-filter/>节点;
2. ServiceIntentInfo: 保存<service/>节点下的<intent-filter/>节点;
3. ProviderIntentInfo: 保存<provider/>节点下的<intent-filter/>节点;
四、关于PackageParser.Package与PackageSettings的关系
1. PackageParser.Package对应一个Apk完整的原始数据;
2. PackageSettings包含一个PackageParser对象实例, 说明它也对应一个apk包的数据, 不同的是,
它还包括apk相关配置数据, 比如apk内部哪些component是被disable等;
3. Settings包含了PackageSettings对象列表, 也就是说它包含了系统所有apk数据;
4. PackageParser负责Apk数据解析;
5. PMS全局的包管理者;
五、PackageInto跨进程传递的包数据, 包解析时生成
1. PackageItemInfo: 一个应用包内所有组件项和通用信息的基类. 提供最基本的属性集, 如: lable、
icon、meta-data等;
1. ApplicationInfo: 代表一个特定应用的基本信息, 对应AM里面的<application>;
2. Permission: 代表一个特定的权限, 对应AM里面的<permission/>;
3. PermissionGroupInfo: 一个特定的权限组, 对应AM里面的<permission-group/>;
4. ComponentInfo: 代表一个应用内组件通用信息的基类.
1. ActivityInfo: 对应AM.xml里面<activity/>和<receiver/>标签;
2. ServiceInfo: 对应AM.xml里面<service/>标签;
3. ProviderInfo: 对应AM.xml里面的注册的<provider/>标签;
2. Intent: 根据特定的条件找到匹配的组件
3. IntentFilter: Intent过滤器
1. ResolverInfo:
2. IntentResolver: Intent解析器, 其子类用于不同组件的Intent解析, 保存了所有<activity/>
和<receiver/>节点信息.
1. ActivityIntentResolver: 保存所有<activity/>和<receiver/>节点信息.
2. ServiceIntentResolver: 保存了所有<service/>节点信息;
3. ProviderIntentResolver: 保存了所有<provider/>节点信息;
六、PMS的三大过程
1. 包扫描的过程组:
Android将一个APK文件的静态信息转化为可以管理的数据结构;
2. 包安装的过程组;
包管理接纳一个新成员的体现;
3. 包查询的过程组;
Intent的定义和解析是包查询的核心, 通过包查询服务可以获取到一个包信息;
6.1 包扫描的过程
1. 创建PMS对象;
2. 将PMS向ServiceManager注册, 加入SSM, 方便后续其他进程或者app通过ServiceManager
获取PackageManagerService;
3. 读取配置文件: 包括读取保存在packages.xml中记录的系统关机前记录所有安装的app信息, 将其保存
在PMS中mSettings中的mPackages中;
4. 扫描系统Package, 包括dex优化操作;
5. 保存扫描信息: 包括保存信息到packages.xml中;
6. 扫描非系统应用;
7. 更新数据: 包括更新PMS.mSettings.mPackages中的数据;
6.2 包安装过程
Apk的安装过程主要分为以下几步:
1. 拷贝Apk文件到指定目录: /data/app/<package-name>
2. 解压缩apk, 拷贝文件, 创建应用的数据目录;
3. 解析apk的AndroidManifest.xml文件;
4. 向Launcher应用申请添加创建快捷方式;
6.3 包查询过程
1. Intent:
Intent最后一个响应者是一个Android组件, Android组件都可以定义IntentFilter, 前面说了包解
析器的时候, 说到了每一个Component类中都有一个IntentInfo对象的数组, 而IntentInfo则是IntentFilter
的子类, 既然一个Android组件可以定义多个IntentFilter, 那么Intent想要匹配到最终的组件, 则需
要通过组件所定义的所有IntentFilter;
2. IntentFilter:
多个IntentFilter之间是或的关系, 哪怕其他所有IntentFilter都匹配失败, 只要有一个IntentFilter通过,
最终Intent还是找到可以响应的组件;
IntentFilter过滤规则包含以下三个方面:
(1) Action: 每个IntentFilter可以定义零个或多个<action标签>, 如果Intent想要通过这个IntentFilter,
则Intent所辖的Action需要匹配其中至少一个;
(2) Category: 每一个IntentFilter可以定义零个或者多个<category>标签, 如果Intent想要通过这个
IntentFilter, 则Intent所辖的Category必须是IntentFilter所定义的Category的子集,
才能通过IntentFilter;
(3) Data: 每一个IntentFilter可以定义零个或多个<data>;
6.3.1 Intent解析
PMS有四大组件的解析器, 分别是ActivityIntentResolver、ServiceIntentResolver、ProviderIntentResolver,
系统每收到一个Intent的解析请求时, 就会使用对应的解析器, 他们都是IntentResolver的子类;
IntentResolver的只能就是解析Intent, 它包含了所有IntentFilter, 同时有一个重要的成员函数queryIntent(),
接受Intent作为参数, 返回查询结构, 一个ResolverInfo对象的数据, 因为可能有多个组件来响应一个Intent,
所以返回结果是一个数组.
网友评论