我眼中的Android Framework

11人阅读 评论(0) 收藏 举报
分类:

在开发中我们会遇到各种各样的非常奇怪的问题,有些问题是百思不得骑姐。其实这些问题大都是因为我们不了解安卓内部运行原理,知其所以然才是我们的目的。

任何控制类程序都有一个入口,安卓应用程序肯定也是有滴。
Android framework包含三个小伙伴:服务端、客户端和linux驱动。

服务端

服务端主要包含两个狠重要的类:WindowManagerService(WMS)和ActivityManagerService(AMS)

客户端

客户端包含以下类:

  • ActivityThread:是安卓应用程序的主线程类,这个小伙伴所在的线程就是UI线程或者称为主线程。

  • Activity:ActivityThread会根据用户的操作选择让哪个Activity对象上它的船。

  • PhoneWindow:富二代,继承于牛气的Window类,自己屋里住着一个DecorView对象,像它老爸喜欢制定规则提供了一些通用窗口操作API。

  • Window:富一代,长得比较抽象,喜欢制定规则提供了一些通用的窗口操作API。它不喜欢被人管所以呢,注意:WindowManagerService管理的窗口不是Window类,其实是View和ViewGroup。

  • DecorView:很能干的家伙,家产来自FrameLayout,比较注重外在喜欢打扮,DecorView是对FrameLayout进行了一些修饰,从名字就可以看出来。

  • ViewRoot:小管家继承于Handler,主要作用是把WMS的IPC调用转换为本地的一个异步调用。

  • W类:ViewRoot小助手,继承于binder,是ViewRoot内部类。主要帮助ViewRoot实现把WMS的IPC调用转换为本地的一个异步调用。

  • WindowManager:客户端如果想创建一个窗口得先告诉WindowManager一声,然后它再和WindowManagerService交流一下看看能不能创建,客户端不能直接和WMS交互。

Linux驱动

Linux驱动和Framework相关的主要是两个部分:画家SurfaceFlingger和快递员Binder。

每一个窗口都对应一个画Surface,SF主要是把各个Surface显示到同一屏幕上。Binder是提供跨进程的消息传递。

从apk程序的运行过程去看各个组件分别在什么时候干了什么工作?

ActivityThread从main()函数中就开始动起来,然后调用prepareMainLooper()为UI线程创建一个消息快递通道即MessageQueue。

接着创建ActivityThread对象,创建过程会创建一个消息装卸工Handler对象和一个快递员Binder对象,其中Binder负责接收远程Ams的IPC调用,接收到调用后让Handler把消息装到消息快递队列,UI线程很忙的都是异步的从消息快递队列中取出消息并执行相应操作,比如 start、stop、pause。

然后UI线程让队列调用Looper.loop()方法进入消息循环体,进入后就会不断地从消息队列中读取并处理消息。

当ActivityThread接收到Ams发送start某个Activity的快递后就会创建指定的Activity对象。Activity会先按窗户再去按玻璃和贴窗花,所以先创建PhoneWindow->DecorView->创建相应的View或ViewGroup。创建完成后就可以让大家欣赏了,调用WindowManager把界面显示到屏幕上,然后创建ViewRoot,然后调用Wms提供的远程接口添加一个窗口并显示到屏幕上。

接下来就是用户的操作,事件线程不断的把消息快递发到事件队列中去,然后事件分发线程秘书逐个取出消息,然后调用Wms中的相应函数处理该消息。

很多线程是不是很晕?

1. 安卓程序中都有哪些线程?

客户端小伙伴至少包含三个线程小弟,Activity启动后会创建一个ViewRoot.W对象,同时ActivityThread会创建一个ApplicationThread对象,这两个对象继承消息总管Binder,每个Binder对应一个线程,负责接收Linux Binder驱动发送的IPC调用。还有一个是UI线程呗。

2. UI线程是什么?

一直在倾听用户的心声,所有的处理用户消息,以及绘制页面的工作都在该线程中完成。

3. 自定义的线程和UI线程有什么区别?

UI线程是从ActivityThread运行的,在该类的main()方法中已经使用了Looper.prepareMainLooper()为该线程添加了Looper对象,已经为该线程创建了消息队列,是自带秘书光环的。因此,我们才可以在Activity中去定义Handler对象,因为创建Handler对象时其线程必须已经创建了消息队列,装卸工得配运输带要不然没法干活。而普通的Thread则没有默认创建消息队列,所以不能直接在Thread中直接定义Handler,这个就是我们不懂程序运行原理导致的困惑。



作者:wecent
链接:https://www.jianshu.com/p/77bf139bbcd7
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
查看评论

我眼中的机器学习

什么是机器学习?        很多接触过机器学习领域的人,或多或少知道点机器学习的常用算法,但是对于机器学习的认识却并不清晰。今天查找相关资料,总结得出机器学习的相关概念。        机器学...
  • American199062
  • American199062
  • 2016-04-22 00:49:56
  • 877

我眼中的人工智能(2017年初)

声明:原创作品,转自我的公众号:http://mp.weixin.qq.com/s/j02w51JYEF-5iPwynpvKhw (因面向读者不同,此处略有删减) “除人脑以外,没有任何一个自...
  • singmk
  • singmk
  • 2017-02-21 10:26:37
  • 1843

十年磨一剑之我眼中的京东

记得第一次在京东上购物还要回退到2009年,当时叫京东商城,从此和京东结缘,一直在京东上买东西,记得以前还不支持货到付款,现在方便多了,不仅货到付款,而且可以刷卡,这种体验是非常好的。我们公司还经常从...
  • dotnetstudio
  • dotnetstudio
  • 2015-01-09 23:00:44
  • 3035

我眼中“项目经理”需要回答的开放性问题

你读过哪些项目管理的书籍?分别有什么收获? 你认为擅长哪些技术?在以往项目开发中,做过哪些贡献? 一个项目的生命周期你如何理解?设计、开发、测试分别在哪些阶段会介入? 用户需求分析、市场和竞品分析、...
  • bxh7425014
  • bxh7425014
  • 2016-04-27 09:49:40
  • 371

别人眼中的自己

今天上班的时候,一个朋友忽然给我发来了信息:(**** 是我的朋友 JackieChen 正是初级魔法师本人)**** 10:45:38迟到大王你怎么没半点自责心理? **** 10:45:56你不是...
  • finaland
  • finaland
  • 2005-06-17 13:51:00
  • 1011

我心中的怀念:火星人

刚才,我写完了火星人的真实故事(1)至(12),心中有所感悟。           火星人具有虚拟的人格和法人的实体。二十年前,在北京大学校园的氛围中,火星人诞生了。          老实说,火...
  • yuanmeng001
  • yuanmeng001
  • 2014-12-15 05:18:14
  • 1301

我眼中的优秀的团队

文中的“我”,其实不是一个单纯的角色,它可能会包含多层含义,不管是我作为一个团队的管理者,还是我作为一名技术团队的普通员工,都会对自己的团队有一些期许,一些定义,一些要求,而这就是今天我们要谈论的话题...
  • lijiajun95
  • lijiajun95
  • 2017-01-01 21:46:00
  • 1346

你我眼中的团队应该是什么样的

一个好的团队应该是什么样的呢,我自己有一些定义,拿出来大家讨论一下看看吧:首先一个团队的所有都应该好人,都应有责任心,都敢于负责任,不要为了怕担责任就不做事情,总是想着做好自己应该做的就行了,有风险的...
  • timbear
  • timbear
  • 2006-12-08 20:53:00
  • 2644

不同人眼中的我

在别人眼中我是 在我朋友眼中我是 在同行眼中我是 在我女朋友眼中我是 在我父母眼中我是 我以为我是 而实际上我是 终有一天我会是...
  • hnzmdzcm
  • hnzmdzcm
  • 2012-08-31 21:29:43
  • 494

我眼中的人才

在我眼中,人才分三等。第一等,指出正确道路的人。能从迷雾中分清目标的方向,从万千道路中看出哪一条是正确的那一条。第二等,高效管理的人。能够利用手中现有的资源,经过整合,产生最佳效果。第三等,具有非凡执...
  • lhbgyl
  • lhbgyl
  • 2006-05-10 21:03:00
  • 390
    个人资料
    持之以恒
    等级:
    访问量: 26万+
    积分: 1万+
    排名: 1801