关于PackageManagerService源码分析

标签: android
0人阅读 评论(0) 收藏 举报
分类:

1、背景

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

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

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

2、整体架构

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

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

class ContextImpl extends Context {

    private PackageManager mPackageManager;

    //当不为null时直接返回
    public PackageManager getPackageManager() {
        if (mPackageManager != null) {
            return mPackageManager;
        }

        //这里先调用ActivityThread的getPackageManager获得IPackageManager对象
        IPackageManager pm = ActivityThread.getPackageManager();
        if (pm != null) {
            // Doesn't matter if we make more than one instance.

            //创建ApplicationPackageManager对象
            return (mPackageManager = new ApplicationPackageManager(this, pm));
        }

        return null;
  

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

public final class ActivityThread {

    static IPackageManager sPackageManager;

    public static IPackageManager getPackageManager() {
        if (sPackageManager != null) {
            return sPackageManager;
        }

        //获得PackageManagerService的Binder对象
        IBinder b = ServiceManager.getService("package");
        //传入IPackageManager.Stub.asInterface方法中获得IPackageManager对象
        sPackageManager = IPackageManager.Stub.asInterface(b);
        //最终返回一个IPackageManager对象
        return sPackageManager;
    }
}
文章出自 https://blog.csdn.net/dongxianfei/article/details/52717981
查看评论

PackageManagerService源码分析之入门(一)

1、背景今天要分析的内容相信大家肯定都不会陌生,也许你平时没有直接去调用其方法,但是Android系统却无时无刻不在使用它,它就是我们今天要重点分析的Android核心服务PackageManager...
  • dongxianfei
  • dongxianfei
  • 2016-10-01 17:05:04
  • 784

PackageManagerService源码分析之第一阶段(二)

1、背景在前面一篇文章中,我们介绍了和PackageManagerService相关的一些类和关系,如果大家不是很明白的可以先去看一下这篇文章PackageManagerService源码分析之入门(...
  • dongxianfei
  • dongxianfei
  • 2016-10-01 17:05:34
  • 698

PackageManagerService启动流程源码解析

概述PackageManagerService,是Android系统中核心服务之一,管理着所有跟package相关的工作,常见的比如安装、卸载应用。 PKMS服务也是通过binder进行通信,IPac...
  • u012124438
  • u012124438
  • 2017-02-05 21:29:22
  • 2721

Android PackageManagerService流程详细分析(一)之启动

Android系统在启动的过程中,会启动一个应用程序管理服务PackageManagerService,这个服务负责扫描系统中特定的目录,找到里面的应用程序文件,即以Apk为后缀的文件,然后对这些文件...
  • rjdeng
  • rjdeng
  • 2015-10-27 17:42:43
  • 981

Xposed笔记(一)Xposed初识

Xposed初识笔记 参考:http://blog.csdn.net/wxyyxc1992/article/details/17320911 Xposed简介 Xposed是GitHUB上rovo...
  • qq_22717679
  • qq_22717679
  • 2015-01-30 14:09:40
  • 674

Android M PackageManagerService解析

在Android系统中,和用户关系最密切的service应该是PackageManager了。 一般来说,用户想要在Android Phone上进行自己感兴趣的活动,都少不了apk的支持。 不论是打电...
  • ChaoY1116
  • ChaoY1116
  • 2016-02-25 16:43:24
  • 1877

PackageManagerService(Android5.1)深入分析(一)构造函数

PackageManagerService比较长,我们挑主要的内容讲: 一、SystemServer创建PackageManagerService 先来看下其在SystemServer的创建: ...
  • kc58236582
  • kc58236582
  • 2016-01-12 10:47:55
  • 2716

为Android中PackageManagerService添加方法

PackageManagerService相关类结构 分析 从上图可以看出若想为PackageManagerService添加方法需要进行以下改动 1,在IPackageManager.aidl文...
  • zqz19891031
  • zqz19891031
  • 2015-01-30 13:31:07
  • 2368

PackageManagerService的启动过程分析

这篇文章主要分析了Android系统中一个比较重要的Service在启动过程,将PackageManagerService的启动过程分为了两部分,1、扫描xml 2、扫描apk,并用uml和简单代码描...
  • yuanzeyao2008
  • yuanzeyao2008
  • 2014-12-28 18:13:07
  • 8093

PackageManagerService(Android5.1)深入分析(四)安装应用

一、安装的Activity 在Android,通过发送Intent可以启动应用的安装过程,如下所示: Uri uri = Uri.fromFile(new File(filename)); Inten...
  • kc58236582
  • kc58236582
  • 2016-01-15 09:18:11
  • 5595
    个人资料
    等级:
    访问量: 116
    积分: 16
    排名: 193万+
    文章存档