在 WSL 2 下运行 Anbox

介绍

这本来是我之前在 reddit 上面发的一个 帖子. 现在干脆把它重新写成中文, 姑且算是给自己引流.

Anbox 实现了基于 lxc 的 Android on Linux 支持, 由于 WSL 2 就是完整的 Linux, 于是稍加折腾就能跑起来了.

安装 anbox

我在 copr 上有现成的 Anbox build, 直接安装即可. 我使用的 WSL 内发行版是 Fedora Remix.

Ubuntu 上我也试过, 但是不能正常显示(窗口啥都没有), 但是 Android 跑起来了, 可能是 SDL 的锅. 跑 Arch 的 WSL 也能跑起来 步骤几乎相同.

代码 1从 Copr 安装 Anbox
$ sudo dnf copr enable yanqiyu/anbox
$ sudo dnf install anbox

从源代码编译

你需要 anbox-moduleskernel 的源代码. 内核源代码选择和你的 WSL 一致的版本(uname -r).

我这儿是 4.19.84-microsoft-standard, 下面的步骤以此为例, 如果你的版本不一样, 直接换掉版本就成.

解压并准备好编译.

代码 2~/WSL2-Linux-Kernel-4.19.84-microsoft-standard 中准备内核模块编译环境
$ cd WSL2-Linux-Kernel-4.19.84-microsoft-standard
$ cp /proc/config.gz ./
$ gzip -d config.gz
$ mv config .config
$ sudo dnf install bison flex elfutils-libelf-devel openssl-devel -y
$ make prepare
$ make modules_prepare
$ sudo mkdir -p /lib/modules/4.19.84-microsoft-standard
$ sudo ln /home/(USERNAME)/WSL2-Linux-Kernel-4.19.84-microsoft-standard -s /lib/modules/4.19.84-microsoft-standard/build

编译模块

代码 3使用 DKMS 编译并安装 Anbox 内核模块
$ git clone https://github.com/anbox/anbox-modules.git
$ sudo cp -rT ashmem /usr/src/anbox-ashmem-1
$ sudo cp -rT binder /usr/src/anbox-binder-1
$ sudo dkms install anbox-ashmem/1
$ sudo dkms install anbox-binder/1

安装模块

代码 4加载 Anbox 内核模块
$ sudo modprobe ashmem_linux
$ sudo modprobe binder_linux

可能会有报错, 完全正常, 只要下面的命令输出提示模块正常工作就行

代码 5检查 Anbox 内核模块与设备节点
$ lsmod | grep -e ashmem_linux -e binder_linux
$ ls -alh /dev/binder /dev/ashmem

安装 Android 镜像

这里 下载 Android 镜像

放到 /var/lib/anbox/android.img

启动 anbox!

提前准备

代码 6启动 Anbox 前的环境准备
$ export $(dbus-launch)
$ mkdir /tmp/runtime-user
$ export XDG_RUNTIME_DIR=/tmp/runtime-user

运行!

代码 7启动 Anbox 网络桥、容器与应用管理器
$ sudo /usr/share/anbox/anbox-bridge.sh start
$ sudo daemonize /usr/bin/anbox container-manager --daemon --privileged --data-path=/var/lib/anbox
$ anbox launch --package=org.anbox.appmgr --component=org.anbox.appmgr.AppViewActivity

修复网络

代码 8通过 /usr/share/anbox/anbox-shell.sh 取得管理员权限后修复 Anbox 网络
ip route add default dev eth0 via 192.168.250.1
ip rule add pref 32766 table main
ip rule add pref 32767 table local

效果

图 1运行截图

当前问题