赞
踩
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;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。