运行 Anbox

作者: hanpfei | 来源:发表于2017-11-28 15:53 被阅读603次

概述

Anbox 运行时主要由两个分开的实例构成:

  • 容器管理器
  • 会话管理器

容器管理器的工作是管理容器的建立,并在它的生命周期内维护它。它的职责是启动我们用以运行 Android 系统的 LXC 环境。

会话管理器运行于登录到 Linux 系统的用户的会话内。它将通过一些 sockets 与运行在容器内的 Android 实例通信,并提供与 Linux 系统的集成。它还扮演多路复用器的角色,将 Android 应用映射为桌面环境的单个窗口。当前所有的应用窗口由相同的进程(会话管理器)所有。应用逻辑本身依然位于 Android 容器内的另外的进程中。

下图展示了一个总体的架构:

architecture.png

应用映射

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,你将在其中下载所有的源码。

$ mkdir $HOME/anbox-work

现在,通过下载 manifest 并启动获取源码来初始化仓库:

$ cd $HOME/anbox-work
$ repo init -u https://github.com/anbox/platform_manifests.git -b anbox
$ repo sync -j4

依赖于你的网络连接,这将消耗一些时间。

构建 Android

当所有的源码都成功地下载之后,你就可以启动构建 Android 本身了。

首先通过 envsetup.sh 脚本初始化环境。

$ . build/envsetup.sh

然后使用 lunch 初始化构建。

$ lunch anbox_x86_64-userdebug

支持的构建目标的完整类表如下:

  • anbox_x86_64-userdebug
  • anbox_armv7a_neon-userdebug
  • anbox_arm64-userdebug

现在通过如下命令构建所有其它的东西:

$ make -j8

一旦构建完成,我们需要获取结果,并用它们创建适用于 Anbox 的镜像文件。

$ cd $HOME/anbox-work/vendor/anbox
$ scripts/create-package.sh  \
    $PWD/../../out/target/product/x86_64/ramdisk.img  \
    $PWD/../../out/target/product/x86_64/system.img

这将在当前目录下创建一个名为 android.img 的文件。

现在,你就可以在 Anbox 运行时中使用使用你的定制镜像了。

以自己构建的 android.img 运行 Anbox

如果你已经在你的系统上安装了 Anbox,你需要先停掉它。在通过 Anbox 安装器脚本完成 Anbox 安装并 snap 之后,Anbox 会自动启动,查看主机的进程列表将看到如下内容:

$ ps -aux | grep anbox
root      7113  0.0  0.0 766588 12308 ?        Ssl  14:46   0:00 /snap/anbox/65/usr/bin/anbox container-manager --data-path=/var/snap/anbox/common/ --android-image=/snap/anbox/65/android.img --daemon
hanpfei+  8327  7.2  1.5 2464708 252328 ?      Sl   14:49   0:01 /snap/anbox/65/usr/bin/anbox session-manager
root      8339  0.0  0.0  36776  3616 ?        Ss   14:49   0:00 /snap/anbox/current/libexec/lxc/lxc-monitord /var/snap/anbox/common/containers 14
root      8341  0.0  0.0 772888  8156 ?        Ss   14:49   0:00 [lxc monitor] /var/snap/anbox/common/containers default
100000    8350  0.0  0.0   7920  5912 ?        Ss   14:49   0:00 /system/bin/sh /anbox-init.sh
100000    8423  0.0  0.0  16728  9260 ?        Sl   14:49   0:00 /system/bin/anboxd
110000    8877  0.8  0.5 1038888 95412 ?       Sl   14:49   0:00 org.anbox.appmgr
hanpfei+  9094  0.0  0.0  19300   976 pts/21   S+   14:49   0:00 grep --color=auto anbox

此时,可以这样做来停掉 Anbox:

$ sudo systemctl stop snap.anbox.container-manager

再次查看主机的进程列表,将无法再看到 Anbox 相关的进程。

同时停掉它们是很重要的,容器管理器和会话管理器。

一旦两个服务都被停掉了,你可以通过运行如下命令用定制的 android.img 启动容器管理器:

$ datadir=$HOME/anbox-data
$ mkdir -p $datadir/rootfs
$ sudo anbox container-manager \
    --android-image=/path/to/android.img \
    --data-path=$datadir

这将启动容器管理器并在特定的数据路径中设置容器根文件系统。

$ ls -alh $HOME/anbox-data
total 20K
drwxrwxr-x  5 ubuntu  ubuntu  4,0K Feb 22 08:04 .
drwxrwxr-x 16 ubuntu  ubuntu  4,0K Feb 22 08:04 ..
drwxr-xr-x  2 100000  100000 4,0K Feb 22 08:04 cache
drwxr-xr-x  2 100000  100000 4,0K Feb 22 08:04 data
drwxr-xr-x  2 root    root   4,0K Feb 22 08:04 rootfs

注意: 如果你查看 $HOME/anbox-data/rootfs 目录,你将不会看到任何东西,因为容器管理派生了一个私有的挂载命名空间,它阻止了外面查看它的挂载点。

cachedata 目录被绑定-挂载到 rootfs,位于 rootfs/datarootfs/cache

原文
原文

相关文章

  • 运行 Anbox

    概述 Anbox 运行时主要由两个分开的实例构成: 容器管理器 会话管理器 容器管理器的工作是管理容器的建立,并在...

  • 最近比较火的Anbox项目

    ‌Anbox是什么? Anbox是Android in a box的缩写,可以在Linux系统中运行Android...

  • 魅族Pro 5(by ubuntu)用上Anbox

    Anbox简单来说是一个最小的Android容器,允许Anbox支持所支持的系统上运行android应用程序。 之...

  • Anbox 实现分析 1:程序入口

    Anbox 的总体架构如 运行 Anbox 一文的相关内容所述,其运行时主要由两个分开的实例构成,容器管理器和会话...

  • Anbox LXC

    Anbox LXC 编译安装 在命令行中,通过 anbox 命令直接启动 Anbox 的容器管理器时,它将动态链接...

  • 如何在Linux上运行Android应用程序和游戏

    想要在Linux上运行Android应用程序?玩Android游戏怎么样?有几个选项可用,但最好的工具是Anbox...

  • Anbox 实现分析 2:I/O 模型

    Anbox 运行时主要由两个分开的实例构成,即容器管理器 ContainerManager 和会话管理器 Sess...

  • Anbox

    Anbox 是在像 Ubuntu 这样的普通 GNU/Linux 系统上,一个基于容器的启动完整 Android ...

  • Anbox 容器管理服务

    Anbox 安装过程分析 Anbox 是在像 Ubuntu 这样的普通 GNU/Linux 系统上,基于容器启动完...

  • java net connect exeption failed

    我在Ubuntu上安装anbox,然后运行自己的APP,使用OKhttp3,每秒访问一次服务器(GET请求),24...

网友评论

    本文标题:运行 Anbox

    本文链接:https://www.haomeiwen.com/subject/kdqebxtx.html