理解Android Framework
一、FrameWork整体运行框架说明:
1.Activity的创建会创建PhoneWindow,PhoneWindow会创建DocerView,DocerView会创建View和ViewGroup。
2.应用程序在Activity中添加和删除窗口,是通过调用WindowManager类的addView和RemoveView函数达成,具体实现是通过桥接模式实现的WindowManagerImpl来实现。进而转向调用ViewRoot类的setView和removeViewLocked,然后通过IPC机制调用到WMS中的addWindow和removeWindow来完成。
3.当AMS通知ActivityThread销毁某个Activity时,ActivityThread会直接调用WindowManager的removeView方法删除窗口,实现在WindowManagerImpl类。
4.AMS调用WMS,一般情况是告诉WMS一些消息,比如某个新的Activity要启动了,从而WMS会保存一个该Activity记录的引用,有时也会直接调用WMS的接口,比如切换窗口时,启动切换窗口是直接调用WMS的setAppStartingWindow。
5.WMS内部是全权接管了输入消息的处理和屏幕的绘制,输入消息的处理是借助于InputManager类完成,InputManger类会生成两个线程InuptReaderThread和InputDispatcherThread,InuptReaderThread循环地从EventHub读取输入消息,对于非大数据是通过channel方式(InputChannel会生成serverChannel和ClientChannel)派发消息,对应大数据则是通过共享缓存ShareMemory分发消息;InputDispatcherThread会从Channel或者ShareMemory获取消息并派发,派发是通过InputPublisher,应用层客户端通过InputConsumer不断从Channel或者ShareMemory获取派发的消息,进而交由ViewRoot处理。其中InputPublisher,InputPublisher和InputConsumer是由InputMoniter生成。
所以InuptReaderThread和EventHub是生产者,InputDispatcherThread是消费者,InputMoniter是消费渠道,ViewRoot是消费者和生产者的桥梁,WMS和AMS是家庭夫妻双管家。
二、FrameWork启动流程
Android启动过程包含从Linux内核加载到Home应用程序启动的整个过程。整体流程如下:
Android是基于Linux内核的系统平台。启动时,首先通过bootloader(系统加载器),加载Linux内核。在Linux加载启动时,与普通的Linux启动过程相同,先初始化内核,然后调用init进程。
Init进程启动zygote:解析配置文件:init.rc(系统配置文件)及initXXX.rc(与硬件平台相关的文件)的内容执行一系列的命令,包括创建mount目录,安装文件系统,设置属性,启动属性服务器,启动Socket服务端口-》加载preload-classes和preload-resources(Framework大部分类及资源)-》fork启动新的进程Zygote(其实是由fork和execv共同创建)。
Zygnote孵化第一个进程SystemServer,SystemServer启动各种系统服务线程。SystemServer进程在Android的运行环境中扮演了"神经中枢"的作用,APK应用中能够直接交互的大部分系统服务都在该进程中运行,常见的比如WindowManagerServer(Wms)、ActivityManagerSystemService(AmS)、PackageManagerServer(PmS)等,这些系统服务都是以一个线程的方式存在于SystemServer进程中。SystemServer的main()函数首先调用的是init1()函数,这是一个native函数,内部会进行一些与Dalvik虚拟机相关的初始化工作。该函数执行完毕后,其内部会调用Java端的init2()函数,该函数首先创建了一个ServerThread对象,该对象是一个线程,然后直接运行该线程,于是,从ServerThread的run()方法内部开始真正启动各种服务线程。
基本上每个服务都有对应的Java类,从编码规范的角度来看,启动这些服务的模式可归类为三种:模式一是指直接使用构造函数构造一个服务,由于大多数服务都对应一个线程,因此,在构造函数内部就会创建一个线程并自动运行。模式二是指服务类会提供一个getInstance()方法,通过该方法获取该服务对象,这样的好处是保证系统中仅包含一个该服务对象。模式三是指从服务类的main()函数中开始执行。无论以上何种模式,当创建了服务对象后,有时可能还需要调用该服务类的init()或者systemReady()函数以完成该对象的启动
当以上服务线程都启动后,AMS以systemReady调用完成最后启动,mMainStack.resumeTopActivityLocked(null)-》mService.startHomeActivityLocked启动第一个Activity。至此,FrameWorkd启动完成。
SystemServer中启动服务列表
服务类名称 |
作用描述 |
启动模式 |
EntropyService |
提供伪随机数 |
1.0 |
PowerManagerService |
电源管理服务 |
1.2/3 |
ActivityManagerService |
最核心的服务之一,管理Activity |
自定义 |
TelephonyRegistry |
通过该服务注册电话模块的事件响应,比如重启、关闭、启动等 |
1.0 |
PackageManagerService |
程序包管理服务 |
3.3 |
AccountManagerService |
账户管理服务,是指联系人账户,而不是Linux系统的账户 |
1.0 |
ContentService |
ContentProvider服务,提供跨进程数据交换 |
3.0 |
BatteryService |
电池管理服务 |
1.0 |
LightsService |
自然光强度感应传感器服务 |
1.0 |
VibratorService |
震动器服务 |
1.0 |
AlarmManagerService |
定时器管理服务,提供定时提醒服务 |
1.0 |
WindowManagerService |
Framework最核心的服务之一,负责窗口管理 |
3.3 |
BluetoothService |
蓝牙服务 |
1.0+ |
DevicePolicyManagerService |
提供一些系统级别的设置及属性 |
1.3 |
StatusBarManagerService |
状态栏管理服务 |
1.3 |
ClipboardService |
系统剪切板服务 |
1.0 |
InputMethodManagerService |
输入法管理服务 |
1.0 |
NetStatService |
网络状态服务 |
1.0 |
NetworkManagementService |
网络管理服务 |
NMS.create() |
ConnectivityService |
网络连接管理服务 |
2.3 |
ThrottleService |
暂不清楚其作用 |
1.3 |
AccessibilityManagerService |
辅助管理程序截获所有的用户输入,并根据这 些输入给用户一些额外的反馈,起到辅助的效果 |
1.0 |
MountService |
挂载服务,可通过该服务调用Linux层面的mount程序 |
1.0 |
NotificationManagerService |
通知栏管理服务,Android中的通知栏和状 态栏在一起,只是界面上前者在左边,后者在右边 |
1.3 |
DeviceStorageMonitorService |
磁盘空间状态检测服务 |
1.0 |
LocationManagerService |
地理位置服务 |
1.3 |
SearchManagerService |
搜索管理服务 |
1.0 |
DropBoxManagerService |
通过该服务访问Linux层面的Dropbox程序 |
1.0 |
WallpaperManagerService |
墙纸管理服务,墙纸不等同于桌面背景, 在View系统内部,墙纸可以作为任何窗口的背景 |
1.3 |
AudioService |
音频管理服务 |
1.0 |
BackupManagerService |
系统备份服务 |
1.0 |
AppWidgetService |
Widget服务 |
1.3 |
RecognitionManagerService |
身份识别服务 |
1.3 |
DiskStatsService |
磁盘统计服务 |
1.0 |
理解Android Framework相关推荐
- 《深入理解Android 卷III》第四章 深入理解WindowManagerService
<深入理解Android 卷III>即将公布,作者是张大伟.此书填补了深入理解Android Framework卷中的一个主要空白.即Android Framework中和UI相关的部分. ...
- Android 系统(57)---深入理解Android输入系统
<深入理解Android 卷III>第五章 深入理解Android输入系统 <深入理解Android 卷III>即将发布,作者是张大伟.此书填补了深入理解Android Fra ...
- 《深入理解Android 卷III》第八章深入理解Android壁纸
<深入理解Android 卷III>即将发布,作者是张大伟.此书填补了深入理解Android Framework卷中的一个主要空白,即Android Framework中和UI相关的部分. ...
- Android Framework入门介绍
Android Framework入门介绍 https://blog.csdn.net/fu_kevin0606/article/details/79532710 framework概述 Androi ...
- 《深入理解Android 卷III》第六章 深入理解控件(ViewRoot)系统
<深入理解Android 卷III>即将发布,作者是张大伟.此书填补了深入理解Android Framework卷中的一个主要空白,即Android Framework中和UI相关的部分. ...
- 《深入理解Android 卷III》第七章 深入理解SystemUI
<深入理解Android 卷III>即将发布,作者是张大伟.此书填补了深入理解Android Framework卷中的一个主要空白,即Android Framework中和UI相关的部分. ...
- Android Framework 初理解
概述 其实我们写的App并不是一个完整的程序.我们写的只是一个套件组,就是一堆Activity,Service等等的组件.这个套件组给Framework框架组合在一起才是一个完整的程序.在这里先说一个 ...
- 《深入理解Android:Wi-Fi,NFC和GPS》章节连载[节选]--第二章 深入理解Netd
原文: http://blog.csdn.net/innost/article/details/20400389 本文使用的源码版本为Android5.1 本章主要内容 介绍Netd; 介绍MDNS和 ...
- [深入理解Android卷一全文-第九章]深入理解Vold和Rild
为什么80%的码农都做不了架构师?>>> 由于<深入理解Android 卷一>和<深入理解Android卷二>不再出版,而知识的传播不应该因为纸质媒介的 ...
最新文章
- mysql查询唯一单词_MySql从表中获取唯一单词列表,其中字段中的值用逗号分隔
- 计算机中用户权利和用户权限,揭秘:Win7系统用户和组权限说明
- JavaWeb学习总结(十二):Session
- y460安装的ubuntu开机时笔记本键盘失效的问题
- 2017年,软件开发全过程,描述得不能再详细了
- 机器视觉技术在表面缺陷检测方面的发展趋势
- 字体Times New Roman
- linux下swftools 的配置
- python中星号数字乘字符串_Python系列-数字和字符串
- 数据库两个表有一个字段互相关联,根据这个关联字段更新一张表
- 容器搭建Hadoop步骤
- sun服务器清理内存日志_服务器清理日志的命令行
- 《软件需求分析》阅读笔记3
- DF1协议的官网下载
- JetBrains系列产品学生认证申请免费使用教程
- 许久未见,归来仍是少年?
- Cassandra中Gossip具体实现方式
- 无线射频专题《无线局域网排错,第二层重传问题7@远近问题》
- catia二维图坐标如何表示_CATIA二维工程制图中孔系尺寸及点坐标标注方法
- InnoDB——锁、事务和复制
热门文章
- [ACM] hdu 2082 找单词 (母函数)
- Effective C++条款7:为多态基类声明virtual析构函数
- Java中用split函数进行分割字符串。
- 【LeetCode】开始LeetCode的第一题offer03
- mfc三视图和斜等测图实现_编程实现TCP协议数据传输
- Javascript条件运算符、其他运算符第五课(小二节)
- php更改二维数组的键,学习猿地-php如何修改二维数组的键名
- 计算机信息的应用安全中心在哪,腾讯游戏安全中心
- 椭圆极点极线性质_圆锥曲线(18)———圆锥曲线题目背后的性质总结(1)
- you need python_Life is short,you need python!(1)