PMS介绍
2016-02-12 11:15
531 查看
一眨眼,一年又过去了。不知道小伙伴是否对旧的一年进行过总结:这一年我收获了什么?我想了想,发现去年还真没有什么很大的突破。自从开通这个个人公众号以来,才发现一个人很好的运行这个公众号还是挺难的。由于工作较忙,闲暇时间也要做些其他事情,导致了不能做到每天更新。不管怎样,我都会尽量去维护好的。
好了,今天我们将介绍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的基础知识是每一个做性能优化小伙伴们的必备知识。
一、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的简单总结。不同的手机厂商会根据自身的实际做深入定制及优化。
相关文章推荐
- RPM方式安装Mysql
- 删除 mysql (rpm)
- npm ERR! errno ECONNRESET
- jbpm和activiti
- MPMoviePlayerController
- npm proxy报错处理
- 最近使用studio 发现drawle-hdpi 都没有了换成了mipmap-hdpi,这两个目录有什么区别呢,哪个比较好呢???
- htaPyfilpmiS.71
- lk中通过操作pmic的寄存器来实现手机重启3次进入关机状态
- rpm安装的mysql 如何卸载干净
- 8939 在Sbl里的pmic中使用延迟函数
- IPMI的基本用法
- npm 淘宝镜像
- 【bug】No package npm available.
- EPM修改admin用户
- EPM问题汇总之----Planning打印乱码
- EPM问题汇总之规则运行时间过长总是提示
- EPM问题汇总之Essbase启动数据库报错无法加载数据库
- EPM问题汇总之2.1安装问题汇总----1
- EPM日志路径