当前位置:   article > 正文

关于PackageManagerService源码分析_packagemanagerservice 源码分析

packagemanagerservice 源码分析

1、背景

今天要分析的内容相信大家肯定都不会陌生,也许你平时没有直接去调用其方法,但是Android系统却无时无刻不在使用它,它就是我们今天要重点分析的Android核心服务PackageManagerService。

平时也许你感觉不到它的存在,或许这就是所有服务的共性吧,但是它却在系统中举足轻重。比如平时我们在重启手机时,它都会在系统后台默默的将所有已安装的应用进行扫描操作,另外就是当我们在安装应用时它也会进行安装操作。

在这里我也不说那么多的题外话了,我们直接进入今天的主题,由于PackageManagerService的源码较多(其工作是很劳累的),所以我准备分几个阶段来进行解读。

2、整体架构

大家要知道,像这种系统级别的核心服务Android是不会允许我们直接调用其方法的,Android肯定会想方设法的将其封装并提供一个对外的接口供开发者使用,所以今天我们就从开发者的角度来一步步的深入了解。

好啦进入我们今天的正题,大家都知道Context是一个抽象类,其定义的所有方法的真正的实现者是ContextImpl类,如果大家不是很明白的可以参考一下我的另外一篇文章Android中的Context源码分析,我们进入该类的getPackageManager方法

  1. class ContextImpl extends Context {
  2. private PackageManager mPackageManager;
  3. //当不为null时直接返回
  4. public PackageManager getPackageManager() {
  5. if (mPackageManager != null) {
  6. return mPackageManager;
  7. }
  8. //这里先调用ActivityThread的getPackageManager获得IPackageManager对象
  9. IPackageManager pm = ActivityThread.getPackageManager();
  10. if (pm != null) {
  11. // Doesn't matter if we make more than one instance.
  12. //创建ApplicationPackageManager对象
  13. return (mPackageManager = new ApplicationPackageManager(this, pm));
  14. }
  15. return null;

我们先来看一下ActivityThread.getPackageManager方法,该方法是获得IPackageManager对象。

  1. public final class ActivityThread {
  2. static IPackageManager sPackageManager;
  3. public static IPackageManager getPackageManager() {
  4. if (sPackageManager != null) {
  5. return sPackageManager;
  6. }
  7. //获得PackageManagerService的Binder对象
  8. IBinder b = ServiceManager.getService("package");
  9. //传入IPackageManager.Stub.asInterface方法中获得IPackageManager对象
  10. sPackageManager = IPackageManager.Stub.asInterface(b);
  11. //最终返回一个IPackageManager对象
  12. return sPackageManager;
  13. }
  14. }
文章出自 https://blog.csdn.net/dongxianfei/article/details/52717981
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/199077
推荐阅读
相关标签
  

闽ICP备14008679号