1.接着前面讲的ActivityManager框架,继续说一下系统另一个重要的框架,PackagerManager
同样先看一下静态类结构图:

大部分情况我们是在Activity中使用getPackageManager方法获取一个ApplicationPackageManager的对象,ApplicationPackageManager实际上是包装了一个IPackageManager.Stub.Proxy的对象
由IPackageManager.Stub.Proxy代理执行PackageManager相关操作,IPackageManager.Stub.Proxy实际代理的是PackageManagerService,
2.看了前面说的,可能你有点晕,我们再来重新理一下:
首先是IPackageManager是通过IPackageManager.aidl文件生成,同时生成了存根类IPackageManager.Stub,代理类:IPackageManager.Stub.Proxy
这个是packageManager进程通信的基本框架,我前面blog有说,不多加说明了
然后PackageManagerService,它继承了IPackageManager.Stub,它作为PackageManager动作的实际执行者,在system_process中存在
再是我们用户应用程序中的ApplicationPackageManager,先看它如何被获取的:
ContextImpl.java中有一个方法:
public PackageManager getPackageManager() {
if (mPackageManager != null) {
return mPackageManager;
}

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;
}
ApplicationPackageManager实际上是包装了一个IPackageManager对象(IPackageManager.Stub.Proxy),当我们调用queryIntentActivities时,实际通过代理对象去执行:
public List<ResolveInfo> queryIntentActivities(Intent intent,
int flags) {
try {
return mPM.queryIntentActivities(//mPM是IPackageManager.Stub.Proxy对象
intent,
intent.resolveTypeIfNeeded(mContext.getContentResolver()),
flags);
} catch (RemoteException e) {
throw new RuntimeException("Package manager has died", e);
}
}
进过进程通信,在PackageManagerService执行对应操作:
3.PackageManagerService的构建与获取
--PackageManagerService的构建:在system_process进程加载时,PackageManagerService被构建,在SystemServer.ServerThread.run中有如下一段代码,它就是加载 PackageManagerService的:
Slog.i(TAG, "Package Manager");
pm = PackageManagerService.main(context,
factoryTest != SystemServer.FACTORY_TEST_OFF);//启动PackageManagerService
///PackageManagerService///
public static final IPackageManager main(Context context, boolean factoryTest) {
PackageManagerService m = new PackageManagerService(context, factoryTest);
ServiceManager.addService("package", m);
return m;
}
--PackageManagerService获取:
先看前面在ContextImpl.java->getPackagerManager中:
IPackageManager pm = ActivityThread.getPackageManager();
/ActivityThread
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;
}
从ServiceManager中获取的服务pakager,该服务在.PackageManagerService的构建时被注册到ServiceManager中的,ServiceManager机制暂时没有深入了解,后面再发blog专门说一下ServiceManager

就到此为止,11点了,希望大家看过后多留几个脚印,也算是我一晚上辛苦的慰劳,也欢迎大家随时拍砖。

Android FrameWork——PackageManager框架相关推荐

  1. Android 之PackageManager框架

    http://blog.csdn.net/stonecao/article/details/6591454 1.接着前面讲的ActivityManager框架,继续说一下系统另一个重要的框架,Pack ...

  2. Android FrameWork——ActivityManager框架

    1.ActivityManager是android框架的一个重要部分,它负责一新ActivityThread进程创建,Activity生命周期的维护,本blog就是着手对ActivityManager ...

  3. 鹅厂流出两份Android Framework技术宝典火了,完整版 PDF 限时开放下载

    前言 最近互联网大厂的"裁员潮"愈演愈烈-- 如何破局?我想最重要的一点:不断提升个人价值. Android Framework的重要性 Android Framework 开发虽 ...

  4. android framework,GitHub - zhaozepeng/Android_framework: android framework 用来快速开发的android框架...

    android_framework an android framework in order for rapid development ##1.开发环境## 环境为android studio + ...

  5. Android Framework 窗口子系统 (08)窗口动画之动画系统框架

    该系列文章总纲链接:专题分纲目录 Android Framework 窗口子系统 本章关键点总结 & 说明: 导图是不断迭代的,这里主要关注➕ 左上角 Android 窗口动画系统部分(因为导 ...

  6. Android Framework框架分析

    转自:微点阅读  https://www.weidianyuedu.com/content/2617738210126.html Android framework analysis (partI z ...

  7. Android——Framework之Packamanager深析

    Android--Framework之Packamanager深析 今天我们来介绍下  最下面的流程总结 ,同为Framework层的Packagemanager类(基于Android2.3.3源码分 ...

  8. Android Framework 记录

    记录 1.下载源码,目录如下: 2.Android系统的层次如下: 3.项目目录简单分析如下: 4.telphony目录 文件 描述 CellIdentityCdma //描述电信通信标识 CellI ...

  9. Android Framework 简介

    Android Framework 简介 简介 之前的研究太偏向应用层功能实现了,很多原理不了解没有详记,结果被很多公司技术人员鄙视了,为了减少自己的短板,重新复习了一遍C++.java.Androi ...

最新文章

  1. 大数据之父_大新闻!Python 之父重新出山,加入微软开发部
  2. linux查看终端进程,Linux查看进程
  3. H.264专利费不受FRAND限制 Android设备商受影响
  4. Catalan数总结
  5. 简单的进度条拖动效果及拖拽改变层大小
  6. 在Mac上安装Linux的行为是否应该被鄙视?
  7. 区块链和比特币的 6 个神话:揭穿了这项技术的有效性
  8. AI需要你帮忙 | 把两栖爬行动物框出来,提高AI识别准确率
  9. php表格无限扩展,php 无限级缓存的类的扩展
  10. 设计一个服务器资源管理系统,基于虚拟化技术的服务器资源管理系统的设计与实现.pdf...
  11. hdu 5101 n集合选2个不同集合数使和大于k
  12. Win7开机动画图片下载大全 修改攻略
  13. python贝叶斯估计库_tsbngen一个python库,可从任意动态贝叶斯网络生成时间序列数据...
  14. linux 网络通信框架,Linux下 C++ HPSocket通信框架的简单使用
  15. GeoServer在CentOS上部署的地图注记乱码问题
  16. Python笔记03:python中用import导入包的机制原理是什么?
  17. Latex表格标题左对齐,并且table加粗
  18. 大数据在高校的应用场景_大数据在高校中的应用研究
  19. 公司寄件管理平台必要性分析
  20. [转]Facebook 如何存储150亿张、1.5PB的照片

热门文章

  1. openssl搭建私有CA
  2. QlikView线图高亮选择尺寸
  3. Swoole(PHP高级Web开发框架)
  4. 关于Floyd-Warshall算法由前趋矩阵计算出的最短路径反映出了算法的执行过程特性的证明...
  5. HTML5 audio
  6. 学习:配置hibernate
  7. 4.ID主键生成策略
  8. 全球约39亿人未接入互联网 韩国家庭宽带普及率最高
  9. 【NOIP】OpenJudge - 15:银行利息
  10. Lvs+Keepalived高可用负载均衡配置