概述
Anbox 运行时主要由两个分开的实例构成:
会话管理器运行于登录到 Linux 系统的用户的会话内。它将通过一些 sockets 与运行在容器内的 Android 实例通信,并提供与 Linux 系统的集成。它还扮演多路复用器的角色,将 Android 应用映射为桌面环境的单个窗口。当前所有的应用窗口由相同的进程(会话管理器)所有。应用逻辑本身依然位于 Android 容器内的另外的进程中。
下图展示了一个总体的架构:
应用映射
Android 应用被映射为桌面环境中单独的窗口。这是通过插入 Android hwcomposer HAL
模块来实现的,该模块接收一组图层以在屏幕上合成。Anbox 告诉 SurfaceFlinger 通过它的 hwcomposer 实现为每个应用获得图层,并把这与它从 Android WindowManager 接收的其它信息结合,来把独立的图层映射为应用。更多详情请查看如下的实现:
- android/hwcomposer
- src/anbox/graphics/layer_composer.cpp
- src/anbox/wm/manager.cpp
编译 Android 镜像
对于 Anbox,我们使用的是 Android 的最小定制版本,但是基于 Android 开放源代码项目
最近版本的所有工作。
要重新构建 Android 镜像,你首先需要获得所有相关的源码。这将消耗你大量的磁盘空间(~40GB)。AOSP 建议至少要有 100 GB 的空闲磁盘空间。也可以查看 他们的 页面。
一般来说,为了构建 Anbox Android 镜像,位于 AOSP 工程的页面 的指南是适用的。此处我们将不再专门描述通常如何构建 Android 系统,而只聚焦于 Anbox 所需的步骤。
获得所有相关源码
首先建立一个新的 workspace,你将在其中下载所有的源码。
现在,通过下载 manifest 并启动获取源码来初始化仓库:
依赖于你的网络连接,这将消耗一些时间。
构建 Android
当所有的源码都成功地下载之后,你就可以启动构建 Android 本身了。
首先通过 envsetup.sh
脚本初始化环境。
然后使用 lunch
初始化构建。
支持的构建目标的完整类表如下:
- anbox_x86_64-userdebug
- anbox_armv7a_neon-userdebug
- anbox_arm64-userdebug
现在通过如下命令构建所有其它的东西:
一旦构建完成,我们需要获取结果,并用它们创建适用于 Anbox 的镜像文件。
这将在当前目录下创建一个名为 android.img 的文件。
现在,你就可以在 Anbox 运行时中使用使用你的定制镜像了。
以自己构建的 android.img 运行 Anbox
如果你已经在你的系统上安装了 Anbox,你需要先停掉它。在通过 Anbox 安装器脚本完成 Anbox 安装并 snap 之后,Anbox 会自动启动,查看主机的进程列表将看到如下内容:
此时,可以这样做来停掉 Anbox:
再次查看主机的进程列表,将无法再看到 Anbox 相关的进程。
同时停掉它们是很重要的,容器管理器和会话管理器。
一旦两个服务都被停掉了,你可以通过运行如下命令用定制的 android.img 启动容器管理器:
这将启动容器管理器并在特定的数据路径中设置容器根文件系统。
注意: 如果你查看 $HOME/anbox-data/rootfs 目录,你将不会看到任何东西,因为容器管理派生了一个私有的挂载命名空间,它阻止了外面查看它的挂载点。
cache 和 data 目录被绑定-挂载到 rootfs,位于 rootfs/data 和 rootfs/cache。