一:基础入门简介

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输入法管理服务

简要启动流程图

Framework基础之入门相关推荐

  1. Java Media Framework 基础教程

    Java Media Framework 基础教程 作者:Eric Olson     来源:ibm 摘要: 很少发现有关于jmf方面的中文资料,这是在IBM上面找的一本书,可作为jmf的入门学习,业 ...

  2. Tengine Framework基础

    Tengine Framework基础 最受开发者喜爱的边缘AI计算框架 Tengine是OPEN AI LAB推出的自主知识产权的边缘AI计算框架,致力于解决AIoT产业链碎片化问题,加速AI产业化 ...

  3. 如何零基础学习python语言_零基础如何入门Python语言?有哪些学习建议?

    众所周知,Python目前是最受欢迎的编程语言之一,尤其是对于零基础的初学者来说,Python语言更是十分的友好.因此,不少初学者常常会有这样一个共同的疑惑,零基础如何入门Python语言?本文就来给 ...

  4. ui设计培训需要什么基础?如何入门学习?

    ​ UI设计是一种直观面向用户的一个技术岗位,在互联网公司,UI设计岗位是不可或缺的,那么对于零基础想要学习UI设计的同学来说,ui设计培训需要什么基础?如何入门学习呢?我们来看看下面的详细介绍. ​ ...

  5. 零基础AJAX入门(含Demo演示源文件)

    零基础AJAX入门(含Demo演示源文件) 作者:一点一滴的Beer  个人主页:http://www.cnblogs.com/beer 摘要:因为笔者的大四毕业设计是做WebGIS系统,用过Web版 ...

  6. 零基础学python语言_零基础如何入门Python语言?有哪些学习建议?

    众所周知,Python目前是最受欢迎的编程语言之一,尤其是对于零基础的初学者来说,Python语言更是十分的友好.因此,不少初学者常常会有这样一个共同的疑惑,零基础如何入门Python语言?本文就来给 ...

  7. python外星人入侵游戏图片_跪求一个问题@关于外星人入侵游戏(《python编程基础从入门到实...

    我在学着编写<python编程基础从入门到实践>的"外星人入侵游戏"的时候,报错如下: Traceback (most recent call last): File ...

  8. 零基础自学python看什么书-零基础Python入门看哪本书好?这里有答案

    原标题:零基础Python入门看哪本书好?这里有答案 Python入门看哪本书好呢?Python入门不知道该选哪本书?Python入门没有一本好书引导,会很难吗?你还在为这些问题困扰吗?今天小编就来解 ...

  9. layuiadmin上手好难_新手自学板绘先学SAI还是PS好?零基础绘画入门需知!

    原标题:新手自学板绘先学SAI还是PS好?零基础绘画入门需知! 新手自学板绘先学SAI还是PS好?初学者如何入门绘画?学习板画难吗?怎样才能学习好绘画?想必这些都是绘画初学者们经常在想的问题吧,就是不 ...

最新文章

  1. 网易云信联手长沙银行,远程视频银行系统助力数字化转型
  2. 简述:B2B、B2C、C2C、O2O
  3. 如何分析常见的TCP问题?
  4. atitit。wondows 右键菜单的管理与位置存储
  5. linkedin客户开发_10个LinkedIn WordPress插件赢得新客户
  6. yy安全中心官网首页登录html,YY安全中心
  7. AES算法中S盒的FPGA实现
  8. 设置div高度等于屏幕高度
  9. iQOO Z3、OPPOK9和小米11青春版的区别 哪个好
  10. 人人都能成为闪电网络节点:第7章管理lnd
  11. leetcode 滑动窗口
  12. Elastic 7.14.0 版推出业界首个免费开放的 Limitless XDR
  13. 惠普电脑synatics触摸板驱动下载
  14. 【STM32H7】第13章 任务调度—抢占式,时间片和合作式
  15. SuperMap iClient for JavaScript常见问题解答集锦(十二)
  16. 单身9年,有天猫双11的陪伴不再寂寞
  17. 目标检测学习笔记1---RCNN、SS、SVM
  18. BC35BC95 ONENET MQTT(旧)
  19. 关于Windows7下无线共享上网的几种方法
  20. ubuntu snap默认安装路径

热门文章

  1. 修改SpringBoot内置Tomcat的端口
  2. 目标检测之非极大值抑制
  3. 【nssm将exe封装成服务】
  4. 海康sdk项目部署Linux系统时出现java.lang.UnstisfiedLinkError:jnidispatch(xxx)not found in resource path错误
  5. 项目经理论坛_人均年薪70万!华为项目经理都达到了哪些标准?
  6. Python3网络爬虫,简单爬取网络小说并下载
  7. php cad如何转换成jpg,如何将cad导成jpg图片格式?
  8. 用js实现动态添加删除表格数据
  9. MTK6592平台 touchpanel驱动设备加载(一)
  10. WampServer3.2.0下载安装教程详解版