Android PackageManagerService启动流程分析

PMS是Android的核心服务之一,负责apk的一系列工作,主要功能有:
1.管理设备上安装的所有应用程序,在系统启动时扫描和加载应用程序;
2.根据请求的Intent匹配到对应的Activity、Provider、Service,提供包含包名和Component的信息对象;
3.调用需要权限的系统函数时,检查程序是否具备相应权限从而保证系统安全;
4.提供应用程序安装和卸载的接口;
PMS的调用流程为:
1.SystemServer.startBootStrapServices()方法启动核心服务,在这个方法中完成PMS的启动;
2.调用PMS的main()方法,在main()方法中创建PMS对象,并向ServiceManager注册Binder对象;
3.调用ContextImpl.getPackageManger()上下文对象获取前面创建并注册到的Binder对象,然后创建
ApplicationPackageManager实例;
4.程序在获取PMS对象时会调用ActinvityThread.getPackageManager(),从ServiceManager获取Binder,并获取Binder代理对象的PMS实例。

        以下图片更有助与我们理解PMS的调用过程:


        ApplicationPackageManager为PackageManager的实现类,ApplicationPackageManager中的方法会通过IPackageManager与PMS进行进程间通信,与AMS一样,PackageManager功能最终都是由PMS来实现的,这么做的目的是为了避免系统服务PMS被外部直接调用。
        IPackageManager是通过由IPackageManager.aidl文件生成,同时生成了存根类IPackageManager.Stub,这个类的代理类是IPackageManager.Stub.Prox,而我们的PMS是继承于IPackageManager.stub的,在system_process中存在。现在应该就能明白了,ApplicationPackageManager实际上是一个包装了IPackageManager.Stub.Prox的对象,在里面的具体表现为mPm对象。
        当其他的Activity通过上下文对象ContextImpl.getPackageManager()获取ApplicationPackageManager对象时,实际上是调用Thread.getPackageManager()从ServiceManager中获取的服务pakager,该服务在PackageManagerService的构建时被注册到ServiceManager中的。在ContextImpl.java中的getPackageManager() 方法的最后,将PMS服务注入给ApplicationPackageManager对象,这样一来,我们就可以拿着ApplicationPackageManager对象调用PMS里面实现的的功能了。 

//ContextImpl.java中的getPackageManager() :
    public PackageManager getPackageManager() {
        if (mPackageManager != null) {
            return mPackageManager;
        }
//调用ActivityThread的getPackageManager()
        IPackageManager pm = ActivityThread.getPackageManager();
        if (pm != null) {
            // Doesn't matter if we make more than one instance.
            return (mPackageManager = new ApplicationPackageManager(this, pm));
        }
        return null;
    }
//ActivityThread.getPackageManager()
public static IPackageManager getPackageManager() {
        if (sPackageManager != null) {
            //Slog.v("PackageManager", "returning cur default = " + sPackageManager);
            return sPackageManager;
        }
        IBinder b = ServiceManager.getService("package");
        //Slog.v("PackageManager", "default service binder = " + b);
        sPackageManager = IPackageManager.Stub.asInterface(b);
        //Slog.v("PackageManager", "default service = " + sPackageManager);
        return sPackageManager;
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值