Bootstrap

Android模拟器图形绘原理(二十二),Android码农是如何进入腾讯的

Android系统到模拟器

在Goldfish-openGL下提供了对于EGL,GLES1.1,GLES2.0的相应的编码类,对于其中实现的每一个方法获取到当前gl_encoder_context持有的IOStream,来将数据写入到流之中来进行通信。对于Android系统和模拟器之间的连接是通过HostConnection来实现的。其中的通信实现采用的是QemuPipe。

Android模拟器实现了一种特殊的虚拟设备类来提供宿主系统和模拟器之间非常快速的通信渠道。该种通道的打开连接方式。

  • 首先打开/dev/qemu_pipe设备来进行读和写操作,从Linux3.10开始,设备被重新命名为/dev/goldfish_pipe,但是和之前的操作还是一样的。

  • 提供一个零结尾的字符创描述我们所要连接的服务。

  • 然后通过简单的读写操作便可以和其进行通信。

fd = open("/dev/qemu_pipe", O_RDWR);

const char* pipeName = “”;

ret = write(fd, pipeName, strlen(pipeName)+1);

if (ret < 0) {

//error

}

… ready to go

这里的pipeName是要使用的服务名程,这里支持的服务有

  • tcp:

提供一个非内部模拟器的NAT router,我们只能使用这个socket进行读写,接受,不能够进行连接非本地socket。

  • unix:

打开一个Unix域socket在主机上

  • opengles

连接到OpenGL E
S模拟进程,现在这个实现等于连接tcp:22468,但是未来可能会改变。

  • qemud

连接到qemud服务在模拟器内,这个取代了老版本中通过/dev/ttys1的连接方式.

在内核中代码,向外提供了一个对于qemu_pipe,其中包含了我们如何与其进行交互。

由于QEMU Pipe发送数据的时候使用的是裸包,其速度要比TCP的方式快很多。

通信协议的实现<

;