Anbox源码分析(二)
上一篇,我们大概了解了Anbox的基本架构和安装方法。这篇文章我们来分析下Anbox的视频渲染原理。
Android加载OpenGL ES的流程
在介绍Anbox的视频渲染原理前,我们先要了解Android加载OpenGL ES的流程。
OpenGL ES (OpenGL for Embedded Systems) 是OpenGL的一个子集,可以说是为了嵌入式设备而专门裁剪过的OpenGL。Android中的渲染都是通过OpenGL ES API实现的。
OpenGL ES只是API,或者说只是一个规范,任何人或任何机构都可以根据该规范去实现OpenGL ES的内容。Android允许硬件厂商实现自己的OpenGL ES,并通过一定的方式加载对应的OpenGL ES库。
Android7.1 加载OpenGL ES的源码在/frameworks/native/opengl/libs/EGL/Loader.cpp。
流程图可以参考下图:
其中:
libEGL_XX.so中的XX可以是硬件厂商自己设定的任何名字
eglGetProcAddress函数提供OpenGL ES所有函数的地址
Anbox渲染原理
从Android加载OpenGL ES的流程可以看出,只要Anbox在Android的/system/lib64/egl
下安装对应的OpenGL ES库,则可以使Android加载Anbox提供的渲染库了。
我们再来看一下Anbox是怎么做的。
在anbox/android/opengl/system
下有几个文件夹,看一下egl/Android.mk
文件。里面可以看到$(call emugl-begin-shared-library,libEGL_emulation)
,这一行的意思是编译为动态库,库名为libEGL_emulation
。
OK,与上一节对应上了,顺便提一句,anbox/android
文件夹是放在android源码中编译在android镜像中的,编译完成以后,Anbox在Android的/system/lib64/egl
下就安装了三个动态库,分别为libEGL_emulation.so
、libGLESv1_CM_emulation.so
和libGLESv2_emulation.so
。也就是Anbox作为虚拟的硬件厂商给Android提供的OpenGL ES渲染库。
但是,注意了,Anbox实际做渲染工作的并不是这三个库,这三个库的作用只是采集Android中APP渲染的OpenGL ES指令,并把指令通过高速传输通道qemu-pipe传输至宿主机的Anbox中,实际的渲染工作是在宿主机中执行的。
具体渲染的机制可以参考下图:
其中:
swiftshader
是谷歌提供的一种纯软件渲染的方式,代码可以直接在github下载。- 而host是使用宿主机中默认的OpenGL ES库。也就是说,如果宿主机中的显卡及显卡驱动支持OpenGL ES标准规范,则可以直接使用宿主机中的显卡进行渲染。但是目前大部分显卡或驱动都不能直接支持OpenGL ES。
此部分代码在anbox/external/android-emugl
和/anbox/src/anbox/graphics
中。下一篇文章,我们再根据代码具体来介绍Anbox的渲染原理。