AndroidPMS流程
系统启动之后就会注册各种系统服务,如 WindowManagerService、ActivityManagerService、PackageManagerService ,今天我们使⽤到的是PackageManagerService ,简称 PMS 。
⾸先PMS 的构造函数中就开始解析⼯作了
加载 FramWork 资源
加载核⼼库
扫描指定⽬录下的 apk ⽂件进⾏解析并将解析到的信息进⾏存储
PMS 启动之后,会扫描系统中已安装的 APK ⽬录,包括系统 APP 的安装⽬录 /sysytem/app, 第三⽅应⽤的⽬录 /data/app ,PMS 会解析 apk 包下的 l ⽂件得到 App 的相关信息,⽽每个 l ⼜包含了 Activity,Service 等组件的注册信息,当 PMS 扫描并解析完这些信息之后就建⽴好了整个 apk 的信息树。
PMS 解析 apk 信息的过程
scanDirLI 函数使⽤ for 循环遍历指定⽬录下的所有⽂件,解析其中 apk 类型的⽂件,忽略其他⽂件。解析⽅法为 scanPackageLI
scanPackageLI ⾸先构造⼀个 PackageParser 也就是⼀个 apk 包解析器,调⽤其 parsePackage ⽅法,其中会判断路径⽂件的类型,如果是⽂件夹类型会解析⽂件夹中的 apk ⽂件,如果是 apk ⽂件,直接解析调⽤ parseMonolithicPackage ⽅法解析得到 Package 对象
最后将 Package 中解析到的 activities 等列表中的数据添加到 PMS 中的对应列表中
PackageParser 的 parseMonolithicPackage ⽅法,解析 l ⽂件得到 Package 对象
构建 AssetManager
根据 AssetManager 构建 Resources 资源
调⽤ AssetManager 对象的 openXmlResourceParser 获取 l 解析器 XmlResourceParser 对象
由 parseBaseApk ⽅法根据解析器、Resources 资源等得到 Package 对象
将 Package 返回
parseBaseApk ⽅法,主要任务是真正的解析 AndroidManifest ,采⽤ Pull 解析的⽅式,主要有两个节点, Application 和 user-permission
,Application 节点时会调⽤ parseBaseApplication ⽅法
parseBaseApplication⽅法,解析 Application 标签中的信息,返回 Package 对象
解析获取应⽤名、应⽤图⽚以及 Application 标签中设置的其他属性
迭代 Application 元素的所有⼦元素,Activity,Service、Provider、Receiver 等标签,通过 parseActivity 等⽅法返回相应的实例
将解析到 Activity,Service、Provider、Receiver 实例对象添加到 Parkage 对象的 activities 等列表中
返回 Parkage 对象
scanPackageLI ⽅法的最后调⽤ scanPackageDirtyLI ⽅法
制作android软件流程将 Package 中解析到的 activities 等列表中的数据添加到 PMS 中的对应列表中,PMS 中的这些列表都是静态的,在类初始化时就会实例化。
上⾯的解析过程就讲应⽤相关的信息做了解析和保存,以便在我们使⽤时直接获取。还有我们最常⽤的启动 Activity、Service 等系统组件时PMS 负责根据 Intent 来匹配具体启动那个组件,下⾯就已启动 Activity 为例,看⼀下 PMS 对 Intent 的匹配过程。
匹配过程
startActivity ⽅法最终会调⽤ startActivityForResult
startActivityForResult 中直接调⽤ Instrumentation 的 execStartActivity ⽅法
通过 Default ⽅法得到 AMS ,调⽤ AMS 的 startActivity ⽅法
AMS 的 startActivity ⽅法中有⼀步会调⽤ PMS 的 resolveIntent ⽅法,该⽅法调⽤了 PMS ⾃⾝的 queryIntentActivites ⽅法,返回⼀个ActivityInfo 对象列表,记录了符合 Intent 的 ActivityInfo,每个 ActivityInfo 对应⼀个 Activity
queryIntentActivites ⽅法中先获取 Intent 的 ComponentName ,不为空则根据 ComponentName 直接获取 ActivityInfo,精确跳转情况,也就是显⽰的启动
ComponentName 为空,说明是隐式 Intent ,查看 Intent 是否指定了要跳转到的⽬标组件的包名,如
果指定了包名则通过包名进⾏匹配。如果没有指定包名则通过 Action 、Category 等信息模糊匹配 PMS 中存储的 Activity 列表中的内容。将匹配到的 ActivityInfo 列表返回
如果精确跳转情况,则直接启动,如果是模糊匹配则弹出选择窗⼝。
跳转的过程是由 AMS 完成的
总结
系统启动时 PMS 启动,PMS 解析已安装的应⽤信息
通过 Intent 启动时,根据 Intent 中的信息在 PMS 中查对应组件,启动对应组件
APP 信息表的构建以及在启动系统组件时 Intent 的匹配就是我们在应⽤开发中使⽤ PMS 较多的地⽅,了解 PMS 的⼯作过程也更有利于我们了解 Android 系统架构
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论