一入门简介
Android系统建构分为四层由上到下依次是应用层,应用框架层,依赖库层,内核层,framework处于第二层,它为应用层的开发者提供基本功能,帮助开发快速构建应用程序。
FrameWork框架采用c/s架构,主要组成部分包括了服务端,客服端和驱动(SurfaceFlingger、Binder) 服务端其中ActivityManagerService(简写AMS),WindowMangerService(简写WMS),PackageManagerService(简写PMS)经常被提及,客服端经常重要的类包含了ActivityThread、Activity、PhoneWindow、Window、DecorView、ViewRoot、WindowManager等等…
FrameWork线程,系统只有相关操作的线程,其中一个线程就是UI主线程,启动应用入口时,就是让其处于UI线程上。
FrameWork启动,涉及到知识也十分庞大
对Android系统运行的机制,学习FrameWrok是必经之路,当前很多技术都是建立在对FrameWork层的了解,才开发出来的,例如热修复,插件化,等等…
二 Framework组成
服务端
AMS
Activity管理服务,主要是调度、启动、内存管理等。
WMS
窗口管理服务,主要是窗口、添加、启动、删除,以及分配窗口大小调节窗口叠放顺序,隐藏/显示等。
PMS
管理所有的package信息,包括安装、卸载、更新以及解析AndroidManifest.xml以组织相应的数据结构,这些数据结构将会被PMS、ActivityMangerService等等service和application使用到
…
提示 : 服务端还远不止这些,Android中差不多还有80几个服务。
客服端
Activity
应用程序执行的一个单位与用户直接接触的类,应用程序可包含多个,称为四大组件之一。
ActivityThread
应用程序main入口类,处于主线程上,有且只有一个该类。是跟服务端沟通的桥梁。
PhoneWindow
它继承Window类,所以提供了通用窗口操作接口,内部拥有DecorView对象处理着窗口上的界面例如状态栏、标题栏、内容页面。
ViewRootImpl
是view和WindowManger沟通的协议,让它们建立联系。
WindowManager
顾名思义窗口管理类,客户端申请创建窗口,交于WindowManager然后通过跨进程通信向AMS申请。
…
提示: 客服端还有许多的类,不单单只有上述这几个。
驱动
Binder
负责跨进程通信
SufaceFlingger(简称SF)
负责界面刷新的
三 线程
那么FrameWork是运行在哪些线程上的呢,Android系统处理UI的叫UI线程,处理耗时任务的叫子线程,那么还有处理任务也是有对应的线程,例如binder线程。
四 启动过程
android基于linux开发,所以在linux中它也就是一个应用程序,首先开启1号进程init,然后读取init.rc配置文件,配置文件中可知,启动zygote进程,然后zygote进程会再fork(孵化)SysteamServer进程启动第一个Dalvik虚拟机程序叫做Zygote(卵),其他的程序都是由Zygote孵化而来。
FrameWork启动的本质就是建立一套系统所需的环境,其中牵扯到zygote进程启动,serviceManager进程
surfaceFlinger进程,SysteamServer进程,以及ASM,PMS,WMS等服务启动。
眼见为实,利用几个命令,首先我们查看下是否如上所说。
查看所有进程命令
adb shell ps -A
打开开发者模式,打开USB联调,连上手机,打开CMD输入adb shell ps -A命令,我们顶部,进程id等于1,进程是init进程。
接着查看zygote进程,Ctrl+F查看,这里会搜索到多个zygote相关的进程,不过我们要定位到zygote64这个进程名称上,进程id=xxx,父进程id=1,那么得知zygote是由init进程启动而来。
继续查看systemServer进程,Ctrl+F查看,在这里你搜索的关键字应该是system_server,为什么是这个呢?还是反推得到的,我们知道systeamServer是由zygote进程启动的,那么之前查看到的zygote pid,所以就要找父进程是xxx的进程,所以查到只有system_server符合。
再接再厉,再看下systemServer进程开启的服务,我们知道服务其实就是systemServer下的线程,我们利用命令查看进程下服务即可,看是否存在AMS,PMS,WMS线程服务,当前要记住进程号是后面查看线程命令需要的。
查看进程下的线程
adb shell ps -T -p 进程号
输入adb shell ps -T -p xxx, 查看systemServer进程下的线程。
所以从上面来看,如果要做一些定制化的能力,我们是可以自己创建一个服务的,所以学习FrameWork是非常有必要的。
zygote的启动
用来孵化其他进程,为什么要用它来孵化,主要是因会预先装载共享类和共享资源,zygote孵化的进程可直接继承,这无疑加快其他进程启动速度。通过socket孵化的第一个进程叫做SysteamServiver
1 读取init.rc文件,启动zygote进程(开启电源、麦克风、网络等功能)
2 预加载类资源preload-classes
3 预加载资源preload-resources(drawable和color)
4 zygote通过sokect通信fork第一个进程SysteamServer服务
4.2 SysteamService的启动
启动系统服务线程,大概有80几个服务,常见的如AMS,WMS,PMS,它们都以线程的方式运行在SystreamService进程当中。
服务名称作用
PowerManagerService电源管理服务
ActivityManagerService最核心的服务之一,管 理 Activity
PackageManagerService程序包管理服务
AccountManagerService账户管理服务,是指联系人账户,而不是Linux系统的账户
BatteryService电池管理服务
WindowManagerServiceFramework最核心的服务之一,负责窗口管理
AlarmManagerService定时器管理服务,提供定时提醒服务
BluetoothService蓝牙服务
InputMethodManagerService输入法管理服务