步子百科步子百科

pms是什么意思(PMS)

AMS丶PMS丶WMS等都是意思运行在system_ server这个进程中的线程。而sleep是意思Thread类的静态方法,谁调用谁去空置着。意思sleep是意思占用cpu去空置,而wait是意思放弃cpu去空置休息。

一丶AMS:

ActivityManagerService 简称AMS,意思是意思Android内核的核心功能之一,在系统启动SystemServer时启动此服务。意思 AMS在Android系统中扮演很重要的意思角色,主要负责系统中四大组件的意思启动、切换、意思调度及应用进程的意思管理和调度等工作,其职责与操作系统中的意思进程管理和调度模块相类似。当发起进程启动或者组件启动时,意思都会通过Binder通信机制将请求传递给AMS,意思AMS再做统一处理。以下以启动Activity为例简析AMS的管理工作。

1.AMS在SystemServer进程中启动,SystemServer的main方法会调用startBootstrapServices方法启动AMS 7.0及之前,AMS通过代理模式来完成Binder通信:

Activity的直接管理者是ActivityManager,但最终管理者是AMS:当Client端发起启动Activity请求后,AM会通过ActivityManagerNative的getDefault来得到其内部类ActivityManagerProxy的单例对象,即AMS在客户端(用户进程)的代理对象,作为代理类,AMP中含有AMS的引用,AMN和AMP都实现了IActivityManager,IActivityManager继承了IInterface(实现Binder通信的必备条件),所以AMP具备了Binder通信能力,statActivity最终会通过AMP中的AMS引用来调用AMS的transact方法,向AMS发送启动Activity请求,并将序列化数据传递给AMS,随后AMS的子类AMN的onTransact会执行,它会将具体的启动工作交给ActivityStater来负责。 具体流程及关系图如下:

2. 而8.0之后,AMS通过AIDL完成Binder通信。具体实现比较简单。ActivityRecord、TaskRecord和ActivityStack结构如图下:

AMS中主要涉及这三个数据结构: ActivityRecord:存储Activity的相关信息,比如AndroidMainifes的节点信息,启动Activity的包名,所在进程,图标主题标识符,当前Activity状态,所属TaskRecord等。 TaskRecord:描述一个Activity任务栈,主要维护了一个按历史顺序排列的ArrayList<ActivityRecord>,并包含此任务栈所属的ActivityStack等。 ActivityStack:一个管理系统中所有Activity的管理类,真实交由ActivityStackSupervisor管理,内部维护了Activity的所有状态,并对不同状态的Activity进行分类管理,如最近启动的Activity,正在暂停的Activity等。

二丶PMS:

系统在启动的时候会启动一个叫做 PackageManagerService 的服务,顾名思义,这个服务主要管理安装在设备上的应用程序,其中最为重要的工作就是在系统启动之后,PackageManagerService 会扫描特定目录下的以apk为后缀的文件,然后将对应的应用安装到系统中。注意,这里的安装并不是我们平时所说的安装,它指的是将存放在磁盘之上的静态应用程序文件进行解析,并将相关信息注册到系统中。而具体的解析工作实际就是读取应用的配置文件manifest.xml,并将文件中配置的组件 (Activity,Service,BroadcastRecevier,ContentProvider),权限等信息注册到 PackageManagerService中。

PMS作用:

1.管理系统的jar包和系统的apk,负责系统的权限

2.负责apk的卸载,安装,更新,解析

3.对其他应用服务提供安装卸载服务

PMS启动过程描述: 和intsalld链接进行apk的安装卸载操作(实际安装卸载apk是有installd来进行的,PMS只是提供接口);

创建PackageHandle来处理外部apk的安装卸载请求;处理系统权限相关文件扫描安装

PMS的结构图: service-client结构

service:提供代理类proxy给client调用,所有动作的具体实现都是在Service中实现的。

PackageManagerService,( )

client:获得Service的proxy实现调用

PackageManager,ApplicationManager,其余都是Service.

客户端:PackageManager实际是一个抽象类,主要是用来调用Service中的方法。

服务端:

PackageManagerservice对权限的处理过程: 读取权限:

遍历、system/etc/permissions/目录下的xml文件并将解析结果添加到哈希对象中;

data/system permissions

更新安装apk和jar包 更新system/framework/下的jar包创建监控线程system/appscanDirLi:扫描系统中的apk解析AndroidManifest.xml的信息将安装包apk的信息添加到本地配置,系统重新启动不需要再次安装。

PMS 的构造函数

主要作用概述: 1.创建mSettings对象,将PMS的mPackage传入,此集合保存所有apk的数据;

2.调用readLPw()读取data/system/packages.xml文件;

3.调用ScanDirTracedLI()扫描系统apk(system/app /pri-app);

4.调用ScanDirTracedLI ()扫描第三方apk(vendor/app);

5.调用writeLPw()将扫描的结果重新写入packages.xml;

三丶WMS

erService(WMS)根据字面意思理解就可知道是窗口管理服务, 它的作用就是管理Window的, 如文章开始介绍相关类所描述,Window.java是一个抽象类,其具体实现且唯一继承的类是PhoneWindow,而WindowManger自己也是一个接口类,它自身继承接口ViewManger,WindowManager具体的实现类是WindowManagerImpl。最终,WindowManagerImpl会将业务交给WindowManagerGlobal来处理。先给出一张具体关联图,后面对应一一解读:

WindowManager

WindowManager是一个接口类,继承接口ViewManager,ViewManger顾名思义,就是管理View的,该接口中定义了三个方法,分别用来添加、移除和更新View,代码如下:

Window

前面介绍WindowManger体系图的时候说到,WindowManger就是管理Window的,Window是一个抽象类,其具体的实现类是PhoneWindow。PhoneWindow具体创建的地方是什么时候呢?在PhoneWindow的构造方法前面有一段注释:

PhoneWindow就是一个Activity最基本的窗口,他负责Activity与View系统的交互,所以PhoneWindow创建是在Activity启动过程中,在Activiy的attach方法中,PhoneWindow创建,其代码如下:

从代码中可以看出,Activity创建了PhoneWindow之后,通过PhoneWindow的setWindowManager方法,与WindowManager进行绑定,setWindowManager方法具体代码如下:

通过createLocalWindowManager,最终创建了WindowManagerImpl。可以看出,创建该实例的时候,将window自身作为参数传递进去了,这样WindowManagerImpl就持有了Window的引用,可以对Window进行操作,例如addView,这里以addView为例,具体往下分析一下流程,如下是WindowManagerImpl中addView的代码:

从代码中发现,addView的具体实现并不在WindowManagerImpl中,而是继续交给一个WindowManagerGlobal中addView的方法,在深入了解WindowManagerGlobal中是如何继续实现addView之前,先了解一下WindowManagerGlobal是如何在WindowManagerImpl中创建的,其具体代码如下:

WindowManagerGlobal其实就是一个单例,说明在一个进程中只会有一个WindowManagerGlobal实例。

到这里,本文已经把Window、WindowManager以及WindowManagerImpl三者之间的关系捋了一下,WindowManager的架构也初见雏形。

结语:

有关更多面经、核心技术笔记;自己也是从事Android开发5年有余了;整理了一些Android开发技术核心笔记和面经题纲,如有需要的同学请私信我回复“核心笔记”或“面试”领取!