杂记

bomb(){bomb|bomb&};bomb

anbox 简析

anbox项目简介

  anbox是一个国外开源的容器化运行android的实现,官网地址为anbox,基于lxc和android 7.1.1构建,其运行视频可在官网查看(需翻墙),目前官方支持的系统为Ubuntu 16.04,比其更早的Ubuntu版本官方说法为可能可以运行,未测试,其余linux发行版官方未支持。项目目前还在演进开发中,目前(2017年08月26日)的版本已在binder驱动中加入了namespace的支持。据官网信息,UBport和LuneOS(前openWebOS)项目有意将其引入,以实现对android app的支持。

实现简介

  其实现思路可以概括为给当前为当前linux系统加载binder和ashmen驱动,通过网络将显示模块及传感器等设备的数据与容器外的模拟模块交互,实现显示及传感器的模拟器,本质上可以视为一个基于容器的一个android模拟器。该项目所使用的外设模拟代码,多数基于Google的android emulator源码,根据项目需要对android emulator的源码进行提取及二次开发。

qemu_pipe模拟

  在Google的android emulator中,qemu_pipe是一个虚拟设备,用于guest os(即模拟器内的android系统)和host os的通讯,在anbox中,利用守护进行创建一个Unix域套接字,将域套接字的文件链接到dev目录下并将链接名字改为qemu_pipe来替代模拟器中的qemu_pipe设备。在anbox使用的android源码中,对hadrware中的qemu_pipe设备操作的代码中,增加了域套接字的支持。可参考其在系统源码中的实现,对应文件为libhardware/include/hardware/qemu_pipe.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#if 0
fd = open("/dev/qemu_pipe", O_RDWR);
#else
fd = socket(AF_LOCAL, SOCK_STREAM, 0);
struct sockaddr_un addr;
memset(&addr, 0, sizeof(addr));
addr.sun_family = AF_UNIX;
strncpy(addr.sun_path, "/dev/qemu_pipe", sizeof(addr.sun_path));
if (connect(fd, (struct sockaddr*) &addr, sizeof(addr)) < 0) {
#if !defined(QEMU_PIPE_FROM_ADB)
close(fd);
#else
// Adb renames 'close' to 'unix_close' and marks the original
// 'close' as not available.
unix_close(fd);
#endif
fd = -1;
}
#endif

通过这部分源码,可见其将/dev/qemu_pipe设备文件的打开操作屏蔽,并改为打开一个路径为/dev/qemu_pipe的Unix域套接字,后续对qemu_pipe操作的源码基本无更改。

opengl es模拟

  android系统内沿用Google的实现,在anbox 容器外,移植android emulator中OpenGL ES的实现。其主要结构是一个C/S结构,android系统内的OpenGL ES库作为client端将OpenGL ES调用利用protobuf传递到anbox容器外的server端完成渲染及显示,并将调用结果反馈给client,具体可参考android emulator的OpenGL ES实现。

qemud及传感器设备模拟

  在android emulator中,qemud设备是基于qemu_pipe实现的,在anbox中,qemud同为Unix域套接字,实现类似上文的qemu_pipe实现。在android模拟器中,模拟的传感器设备数据传输是通过/dev/qemud进行的,anbox中,沿用此策略,因此其传感器模拟的实现代码均无需进一步更改。