安卓图形内部原理

46

我还没有找到关于Android图形系统如何工作的清晰解释,具体来说,它是否使用显示服务器,是否基于DirectFB或X11等。

据我所知,Android依赖于Linux帧缓冲。不过,我并没有发现Android使用什么样的显示服务器或窗口管理器来多路复用访问帧缓冲。因此,任何指引都将不胜感激!

最后,据我所理解,ARM指令集提供了加速OpenGL的指令,但是这与显示服务器的集成并不清楚,例如,客户端应用程序是否协商共享内存缓冲区,以便直接向其写入数据?

该平台的OpenGL库是否为加速器开源?我找到了一些参考资料,表明它们是闭源二进制文件。同样,任何指引都将不胜感激。


1
+1。对于像我这样突然遇到与显示相关的问题的人非常有用.. :) 请问您能否修改Linux帧缓冲链接?似乎已经更改并不再支持。提前致谢。 - Sandeep
4个回答

47

Android图形系统有两个核心部分: SurfaceFlinger和Skia。SurfaceFlinger是Android的合成器,由窗口管理器用于创建和显示窗口(实际上称为表面)。目前,SurfaceFlinger基于OpenGL ES 1.x实现,并且在可用时还可以使用其他硬件加速技术(MDP,在T-Mobile G1上的2D混合器或Xoom上的硬件覆盖层)。

每个应用程序主要使用Skia将其渲染到其窗口(或表面)中。Skia是Android的2D图形库。您还可以使用OpenGL ES 1.x和2.0将内容渲染到表面上。

Android不使用DirectFB、X11或任何其他现有的Linux解决方案。


1
窗口管理器是所有程序共享的一个独特进程,类似于传统的显示服务器。它拥有对显示设备的独占访问权限等。 - naasking
1
我对你在DirectFB上的评论很感兴趣。如果你看一下Jim Huang的演讲,你会注意到幻灯片30和31中提到了帧缓冲区的参考。它们与DirectFB有什么不同? - CyberFonic
1
@Romain Guy,能否请您回答我在问题下面发布的评论?如果可能的话,请看一下这个链接:http://stackoverflow.com/questions/16331775/android-display-user-space-kernel-space-interaction - Sandeep
1
@RomainGuy 为什么Android没有使用X11?您有什么见解吗? - Sudip Bhandari
1
@SudipBhandari X11在窗口系统和现代桌面方面是一个可怕的过时遗物,如果你要从头开始重新设计GUI堆栈,并且基于Linux核心,完全将其剥离是有意义的。我很高兴得知X11不是Android的一部分。 - matanster
显示剩余2条评论

11

1
只是提醒一下:最新版本已经发生了相当大的变化。幻灯片中包含的信息可能已经过时。 - Sandeep

6

Romain Guy的话绝对没错。但自从Android 3.0之后情况有所变化。现在Skia不再那么重要了,大部分2D绘图都使用OpenGL加速,也就是HWUI组件。


1
学习Android图形堆栈的好起点是什么? - proton
2
@ppu 这是我博客的无耻宣传 http://pierrchen.blogspot.com/,其中讨论了很多关于Android图形内部的内容。 - pierrotlefou
2
我想调试HWUI,但不知道该如何做。任何日志都无法输出。(PS:你是中国人,我也是。所以请帮个忙。) - kangear
1
@pierrotlefou 这非常有用,谢谢你分享你的知识。 - wukong

3

1
我不知道那个页面对于当前版本还有多少参考价值,但看起来它仍然是一个官方页面。 - matanster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接