PMS介绍
来源:互联网 发布:mac视频播放器换音频 编辑:程序博客网 时间:2024/04/29 07:53
一眨眼,一年又过去了。不知道小伙伴是否对旧的一年进行过总结:这一年我收获了什么?我想了想,发现去年还真没有什么很大的突破。自从开通这个个人公众号以来,才发现一个人很好的运行这个公众号还是挺难的。由于工作较忙,闲暇时间也要做些其他事情,导致了不能做到每天更新。不管怎样,我都会尽量去维护好的。
好了,今天我们将介绍PMS基础知识。了解PMS的基础知识是每一个做性能优化小伙伴们的必备知识。
一、PMS启动
在Android手机开机时,ServerThread类会初化每个系统服务,并注册到ServiceManager类中,每个系统服务类都是单例。PMS类的实例也是这时候被创建的。步骤为:ServerThread中调用PmS.Main(),而Main方法调用PmS的构造方法创建PmS的实例,并注册到ServiceManager中,这样在使用PmS时可以通过ContextImpl.getPackageManager()获取。
PmS启动过程最主要的部分就是PmS的构造方法。
PMS初始化序列图:
这里介绍一下上面两张图中的类:
1、installer类
建立Java层的Installer类和C层的Installd的LocalSocket连接,将各个参数拼接成一个字符串通过socket发送出去,并读取响应值。使remove、install、dexopt等功能最终由C的Installd实现。
2、PackageHandler类消息循环
(1)该类为内部类,继承Handler,用于处理外部apk安装请求异步安装。
(2)监听INIT_COPY、 MCS_BOUND、 MCS_UNBIND、 POST_INSTALL等消息。
3、解析XML文件
(1)读取system/etc/permission目录下的每一个XML文件,包括描述系统硬件功能(feature)的xml文件和platform.xml文件。platfrom.xml文件包含三种标签。
permission标签:给指定的groupId分配指定的权限。
assign-permission标签:给指定的userId分配指定的权限。
library标签:定义除FrameWork之外的共享库。
(2)调用readLP方法解析packages.xml的信息存放到内存中,该文件记录了所有应用程序的包管理相关信息,主要标签如下。
Permission标签:系统中所有的权限。
package标签:各个包的信息,可以包括的子标签有Perm(该应用的权限)、sigs(该应用程序的签名)等。
shared-user标签:共享用户对应的签名和权限,和package标签类似。
4、优化apk及jar
(1)通过System.getProperty(“java.boot.class.path”)获取系统参数赋给bootClassPath。
(2)分割bootClassPath,将每一项添加到alreadyDexOpted集合中。
(3)对mSharedLibraries,使用isDexOptNeeded方法判断是否需要优化,如果需要则调用Installer. dexopt()优化并添加到alreadyDexOpted。
(4)对/System/framework目录的文件,如果后缀是apk或jar而且不包含在alreadyDexOpted中则优化。
5、监控apk安装目录
(1)监控/system/framework、/system/app、/data/app、/data/app-private四个目录的add和remove事件。 add事件调用scanPackageLI()处理,remove事件调用removePackageLI()处理。
(2)用AppDirObserver类实现,该类继承FileObserver抽象类,实现了onEvent方法处理监控对象发生变化的事件, FileObserver对文件夹的监控是调用JNI实现的。
6、解析apk
对/system/framework、/system/app、/data/app、/data/app-private四个目录调用scanDirLI()进行扫描。扫描得到的apk再调用scanPackageLI()进行扫描,主要是解析每个apk的AndroidMenifest.xml文件,解析完成后调用writePL方法将解析到的信息保存到packages.xml和packages.list中。
二、APK安装过程
安装过程:
1、PMS类的installPackage()方法,发送INIT_COPY进行异步安装。
2、mHandler(PackageHandler类)处理INIT_COPY消息,将该消息的HandlerParams属性增加到mPendingInstalls中,mHandler判断MSC服务是否已绑定,如果已绑定则发送MCS_BOUND消息,如果未绑定,则调用connectToService方法绑定MCS服务,并在绑定完成的回调方法中发送MCS_BOUND消息。
3、mHandler处理MCS_BOUND消息,遍历mPendingInstalls,对每个HandlerParams调用startCopy(),如果失败再连续尝试三次。
4、startCopy调用handleStartCopy()。
5、handleStartCopy()调用InstallArgs.copyApk(),InstallArgs是抽象类,如果是安装在sd卡上则用AsecInstallArgs的实例,安装在内部则用FileInstallArgs的实例。
6、copyApk()调用createCopyFile()创建临时文件,将源文件复制到临时文件,更改临时文件名字,并删除源文件。
7、FileObserver监控到目录下新增的apk文件,调用scanPackageLI()扫描包信息。
上面就是我对PMS的简单总结。不同的手机厂商会根据自身的实际做深入定制及优化。
- PMS介绍
- pms
- AMS PMS WMS等简单介绍
- pms系统
- 酒店PMS
- PMS备忘
- PMS恢复
- PMS 笔记
- PMS 分析
- PMS Hook
- PMS 简析
- Wind量化接口与组合管理(PMS)对接方法介绍
- PMS项目需求分析
- Micros FIDELIO PMS
- Pms 简单学习
- PMS 启动流程
- 初探Android PMS服务
- Android PMS运行规则
- 第一行代码-5.2 接收系统广播
- 组合数取模
- usaco 1.3.2 barn1
- 1042. Shuffling Machine (20)
- wpf在获得在不同dpi下的x,y对应的x,y坐标
- PMS介绍
- OSG-3.0.1在VS2008下的编译、配置与安装
- android:Activity数据传递之对象(parcelable)
- Kettle转换(Trans)执行流程分析
- ListView嵌套两个EditText相关显示问题
- usaco 1.3.3 crypt1
- 国内 IT 相关网站
- 多接口网桥——以太网交换机
- 第一篇文章