文章目录

  • 图形系统
  • 显示系统
  • Buffer管理
  • 显示系统的架构
  • 从应用的角度理解Android

Android图形显示子系统概述

Android图形显示系统,是Android比较重要的一个子系统,和很多其他子系统的关联紧密。想象一下,没有图形显示系统的手机是什么样子,可能连对讲机都不如吧。图形显示系统比较复杂,从Android诞生到现在,几经修改,已经变的越来越庞大了。总的说来,图形显示系统可以分为两大部分来理解:

  • 图形系统
  • 显示系统

图形系统

图形系统也就是图形支持系统,提供绘图和图形处理支持。包括最初的2D绘图API Skia,后来的3D绘图API OpenGLES,RenderScript,OpenCV,到最近的Vulkan。也包括图片解码库,jpg,png,gif等。以及它们所需要的各种Driver支持。

但是Android为了方便大家,我们在做应用开发的时候,并不用大家直接用各种API去绘制界面,也不用直接用解码库去解码。Android已经给大家提供了一个界面绘制机制,有很多widget和view,Android的应用开发者,用现有的widget就能够绘制出比较酷炫的界面。

Android提供的大多view和widget都是2D的绘图,2D绘图比较慢,也发挥不出GPU的作用,因此Android又设计了一套加速系统,硬件加速。其目的就是将2D的绘图操作转换为一个个的3D(Opengl)绘图,再采用部分更新的方式,只去重绘界面中有更新的部分view,这样就大大提升界面绘制的速度。

显示系统

图形绘制好了后,需要送到LCD显示屏上,我们才能看到。绘制界面时,我们只关心单个界面,显示的时候,可能就有多个界面了。做过Android应该开发的都知道,我们需要继承一个Activity,用Activity呈现我们的界面。Activity的生命周期管理,也就伴随了窗口的管理。这中间就涉及了两个Android中两个主要的服务,AMS(ActivityManagerService)和WMS(WindowManagerService)。View,AMS,WMS可以说是整个上层显示系统的三驾马车。

在Android中,一个窗口用一个Surface描述。多个窗口(窗口不一定都是Activity),需要同时显示,我们就需要将多个窗口进行合并。这就需要显示系统中重量级的服务SurfaceFlinger,Surfaceflinger控制窗口的合成,将多个窗口合并成一个,再送到LCD。

Surfaceflinger是Native的服务,Surfaceflinger中怎么去描述一个窗口呢?Surfaceflinger采用图层的概念,即Layer。SurfaceFlinger合成,就是基于Display HAL的实现,将多个Layer合并。Display HAL,各个厂商的实现就千差万别了。

Buffer管理

前面讨论了怎么绘制,怎么显示。但是,绘制,绘在什么地方,拿什么去显示。答案只能是内存Buffer。Android的系统中,采用GraphicBuffer对buffer进行封装,而buffer采用ion实现,能在进程间共享。

Surface属性应用进程,Layer属于SurfaceFlinger进程。如果只用一个Buffer,那么两个进程都有可能同时在用Buffer,这就可能会造成我们看到的屏幕显示不对,存在撕裂。另外,只用一个Buffer,效率也不高啊,绘制本来就是GPU在绘制,显示这边是CPU或者是其他的硬件模块,一个工作,另外一个不工作,且不浪费。所以Android采用Buffer队列的方式,即BufferQueue。绘制的是一个Buffer,显示的是一个buffer,各自处理完后,交换一下Buffer。这样效率就高很多了。这中间再采用一个生产者-消费者模型,Buffer是载体,Surface应用这边是Producer,SurfaceFlinger这边是是Consumer。这样就更好理解了。

显示系统的架构

有了前面的描述,是不是对Android的图形显示系统有了大概的认识了?没有关系,我们直接来看架构图。架构图来自Androd的官网, https://source.android.com/devices/graphics/ ,

大家可以对照图再回味一下,前面的描述。有些地方,这个图并不能很好的体现,不过没有关系,接下来我们会详细的介绍各个模块和流程。

换一种方式来描述Android的显示系统,架构图如下:

再和前面Android的图进行对照,是不是更清楚一些了。

这个图里,前面的描述里有点没有说到,SurfaceFlinger到OpenGLES,大家是不是觉得有点奇怪。其实是这样的,SurfaceFlinger合成,有两种方式,ClientDevice。Client就是Client合成完Layer后再将合成后的数据给到HWComposer,HWComposer此时做的工作很少,直接给到Display。Device则是将未合成的Layer,给到硬件合成的设备,合成完后再给到Display。

可能大家还是很迷茫,没有关系~,我们接下来将参照Android的源码,逐一为大家讲解。

从应用的角度理解Android

做Android开发,我们都讲了太多的架构,也听了太多的架构。不知道大家有没有从应用的角度去看过Android的系统?我们先来看Android的整体系统架构。

Android基于Linux内核,我们是不是可以将上层Android理解为Linux内核的一个应用。这个应用非常庞大,集集了电话,BT,WiFi,音视频播放,Camera等功能。

基于Linux内核的系统非常的多,比如常用的,Debian系列的Ubuntu,Debian;Redhat系统的RedHat,Fedora等。你可以理解Android自成一个系列。所以,我们也可以基于Linux内核去开发自己的系统。

回到Android,Android在Linux中加了很多驱动,再采用硬件抽象的方式,向上提供接口,这就是我们所说的HAL层。所以我们要增加一个模块,需要增加Linux驱动,然后实现HAL,以供上层使用。当然,我们也可以基于Android的HAL去开发上层的系统,又可以将基于HAL的系统看成一个应用。据了解,FirefoxOS,360OS,YunOS等,基本都是基于Android的HAL的方式去开发的(Oops~如有亵渎,神灵保佑…)。

基于HAL的Android Framework,分为Native Framework和JavaFramework。HAL层是C++写的,按里说,Native的 Framework应该就够了,什么还要去实现Java的Framework呢?Android的应用大多数都是用Java开发,中间还有一个Java虚拟机,和JNI。

其实,这是有历史原因的。现在Android已经形成了一个很大的生态链,但是想想当初,Android系统刚才发布,得有开发者呀,没有开发者的支持,如何能形成生态链。所以,Android就采用了这种Java开发方式,大大笼络了Java开发人员。

再回到我们的显示子系统,Surfaceflinger基于HAL HWComposer,管理和控制着整个Android的显示。而上层,则是WMS,AMS,View等系统服务管理和控制着整个Android的显示。

回到上一章给出的Display架构图,我们是不是可以直接基于Native的Framework进行应用的开发呢,答案是肯定的。Android也为此提供了NDK,以便于Android Native应用的开发。

下面,让我们从一个Native应用开始,揭开Android显示系统的面纱~

Android P 图形显示系统(九) Android图形显示子系统概述相关推荐

  1. android 4.0系统,全新Android 4.0系统_手机Android频道-中关村在线

    与搭载Android 2.3系统的OPPO R807不同,OPPO R817搭载了Android 4.0系统.不过这款手机仍旧舍弃了Android系统的原生界面,因此两款手机在界面上的变化其实并不非常 ...

  2. android自动获取系统时间,Android获取系统时间的多种方法

    Android中获取系统时间有多种方法,可分为Java中Calendar类获取,java.util.date类实现,还有android中Time实现. 现总结如下: 方法一: void getTime ...

  3. imac android studio,MAC系统下Android Studio 实用小技巧 – 站长微资讯

    MAC系统下Android Studio 常用快捷键 1 . Cmd + C 复制,Cmd + Shift + C 复制文件路径 2 . Cmd + V 粘贴, Cmd + Shift + V 从剪切 ...

  4. android 判断华为系统版本号,Android获取系统(ROM)类别及版本号

    很多时候我们需要知道用户当前使用的是什么系统,甚至是系统的版本号(比如MIUI V7.V8)来进一步处理业务逻辑,比如打开系统权限设置界面. 感谢国内各大Android手机/系统生产商,让我们这些An ...

  5. opus android编译,Mac系统opus Android编译集成

    一.源码下载 opus官网 源码下载 我这里使用的是1.3.1版本 新建Android module opus 其目录结构如下 将opus源码拷贝至src目录,在src目录下新建Android.mk ...

  6. android 禁止跟随系统字体,Android 应用全局字体调节或禁止随系统字体大小更改...

    1.禁止跟随系统字体大小调节 在Application中复写getResources()方法 @Override public Resources getResources() {//还原字体大小 R ...

  7. android移动警务系统,基于Android系统的移动警务平台设计与实现

    摘要: 信息化已经成为当前的时代特征,随着网络技术的发展,目前基于移动终端的应用开发和使用已经成为了一种趋势,其中在民用领域的应用发展最为迅速,特别是随着Android智能手机的普及,各类手机应用程序 ...

  8. 关于android老年人关怀系统,基于Android环境的老人社交应用平台设计研究

    [摘要] 随着我国老龄化进程的加快,我国人口结构正朝着"多老少小"的极端模式迈进.追根溯源,这种局面的产生是来源于商业经济.社会文化和地区观念等多方面的综合影响.这不仅导致了我国人 ...

  9. android新生报到系统,基于Android平台与Mobile GIS的新生报到服务系统

    摘要: 随着智能手机的普及和移动互联网技术的快速发展,移动地理信息系统(Mobile GIS)的应用需求也随之不断地增加,成为地理信息系统(Geographic Information System, ...

  10. android 入侵检测系统,面向Android智能手机异常入侵检测的在线学习算法.DOC

    面向Android智能手机异常入侵检测的在线学习算法 页码 计算机应用研究 第28卷收稿日期:2014-00-00:修回日期: 基金项目:基金项目1全称(基金项目号):基金项目2全称(基金项目号):作 ...

最新文章

  1. Android 使用ViewPager实现导航页面
  2. 文石服务器维护,文石BOOX OS 2.0新系统即将上线,联合京东读书推出BOOX书城
  3. Magento怎么升级?
  4. html中的瀑布流是什么
  5. pythonjam教程_Python学习:安装配置pycharm编辑器教程
  6. 使用yarn运行react项目指令_Jenkins | 使用yarn构建前端项目
  7. Centos 7 mysql 5.7 给root开启远程访问权限,修改root密码
  8. 2008R2Win7管理八DNS新功能及常规管理
  9. ETL-informatica进阶资料整理
  10. 源码:Spark SQL 分区特性第一弹
  11. WPS公式标号对齐,公式居中问题
  12. 伪装请求头伪装useragent比fake-useragent库好用的伪装请求头库: anti-useragent
  13. AI 人工智能包含的领域方向
  14. 常用正则表达式大全 (转)
  15. 冯东阳:5000元葬送了我的行业站点之梦
  16. SQL编程-获取员工其当前的薪水比其manager当前薪水还高的相关信息
  17. #{}和¥{}的区别
  18. 杭电计算机考试科目,杭电计算机考研经验
  19. Android 模拟登陆正方教务系统(一)
  20. 黑群晖安装Transmission和emby搭建家庭影音娱乐中心服务器(上)

热门文章

  1. 阿里云新BGP高防IP详解
  2. 寒武纪MLU220-SOM荣获亚洲智能交通旗舰展2021年度“创新产品”
  3. SaaSBase:推荐七款超好用的大数据分析工具
  4. 怎么用计算机开方知识点,高中数学知识点:开平方根的方法和步骤
  5. chm文件打开空白无内容的解决办法
  6. 关于国外网站下载速度比较慢的解决办法
  7. 【克罗地亚】LAGNO
  8. 【ASP.NET】——aspx与aspx.cs两种调用方法
  9. 初中计算机课word教学内容,初中计算机的教学计划
  10. [图形学] 射线和线段之间的最小距离