PMS介绍

    一眨眼,一年又过去了。不知道小伙伴是否对旧的一年进行过总结:这一年我收获了什么?我想了想,发现去年还真没有什么很大的突破。自从开通这个个人公众号以来,才发现一个人很好的运行这个公众号还是挺难的。由于工作较忙,闲暇时间也要做些其他事情,导致了不能做到每天更新。不管怎样,我都会尽量去维护好的。

    好了,今天我们将介绍PMS基础知识。了解PMS的基础知识是每一个做性能优化小伙伴们的必备知识。

    一、PMS启动

    在Android手机开机时,ServerThread类会初化每个系统服务,并注册到ServiceManager类中,每个系统服务类都是单例。PMS类的实例也是这时候被创建的。步骤为:ServerThread中调用PmS.Main(),而Main方法调用PmS的构造方法创建PmS的实例,并注册到ServiceManager中,这样在使用PmS时可以通过ContextImpl.getPackageManager()获取。

    PmS启动过程最主要的部分就是PmS的构造方法。

《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安装过程

《PMS介绍》

安装过程:

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的简单总结。不同的手机厂商会根据自身的实际做深入定制及优化。

    原文作者:zhouzhengting1
    原文地址: https://blog.csdn.net/zhouzhengting1/article/details/50654363
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞