anbox是一个安卓容器,可以在linux上原生运行安卓应用(近期国产系统的安卓子系统基本是基于这个项目),既然wsl2运行的是linux内核,那应该也能跑anbox,加上wslg和gpu加速可用性应该不错。
安装准备:
- windows dev 21364及以上。
- 已安装wsl2和wslg。
- 本教程使用Debian发行版安装,ubuntu系统无法启动,其他发行版请自行测试。
安装步骤:
编译内核并启用binder和ashmem模块(懒得自己编译的可以自动编译)
- 安装依赖
sudo apt update && sudo apt install g++ make flex bison libssl-dev libelf-dev bc libncurses-dev
,这是编译linux内核必需的软件包。 - 从GitHub克隆内核的代码
git clone -b linux-msft-wsl-5.10.y --depth=1 https://github.com/microsoft/WSL2-Linux-Kernel
cd WSL2-Linux-Kernel
cp Microsoft/config-wsl .config
make menuconfig
分别开启
device drivers -> android -> android drivers & android binder ipc driver
device drivers -> staging drivers -> android -> Enable the Anonymous Shared Memory Subsystem
make
等待编译完成将arch/x86/boot/bzImage复制到你的Windows用户目录下改名为kernel- 在Windows用户目录下创建
.wslconfig
并写入以下内容
[wsl2]
kernel = C:\\Users\\<你的用户名>\\kernel
- 重启wsl,在powershell输入
wsl --shutdown
并重新开启,用uname -a
检查新内核是否启用(看看编译日期是否正确)
安装anbox
- 首先通过apt安装anbox
修改软件源sudo sed -i 's/main/main contrib non-free/' /etc/apt/sources.list
安装sudo apt update && sudo apt install anbox dbus-x11 pulseaudio-utils libgl1
- 从此处下载anbox镜像放到
/var/lib/anbox/android.img
- 建立
/etc/init.d/anbox
#!/bin/sh
### BEGIN INIT INFO
# Provides: anbox-container-manager
# Required-Start: $syslog $local_fs $remote_fs $network
# Required-Stop: $syslog $local_fs $remote_fs $network
# Should-Start: $network
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Anbox Container Manager
### END INIT INFO
. /lib/lsb/init-functions
prog=anbox-container-manager
PIDFILE=/var/run/$prog.pid
LOGFILE=/var/run/$prog.log
DAEMON="/usr/bin/anbox"
PARAMS="container-manager --daemon --privileged --data-path=/var/lib/anbox --use-rootfs-overlay"
DESC="Anbox Container Manager"
start() {
log_daemon_msg "Starting $DESC" "$prog"
if [ ! -s /var/lib/anbox/android.img ]; then
log_end_msg 1
exit 0
fi
start_daemon /usr/share/anbox/anbox-bridge.sh start
if [ $? -ne 0 ]; then
log_end_msg 1
exit 1
fi
start_daemon $DAEMON $PARAMS > $LOGFILE &
if [ $? -ne 0 ]; then
log_end_msg 1
exit 1
fi
if [ $? -eq 0 ]; then
log_end_msg 0
fi
exit 0
}
stop() {
log_daemon_msg "Stopping $DESC" "$prog"
killall $DAEMON
if [ $? -ne 0 ]; then
log_end_msg 1
exit 1
fi
if [ $? -eq 0 ]; then
log_end_msg 0
fi
/usr/share/anbox/anbox-bridge.sh stop
if [ $? -ne 0 ]; then
log_end_msg 1
exit 1
fi
if [ $? -eq 0 ]; then
log_end_msg 0
fi
exit 0
}
force_reload() {
stop
start
}
case "$1" in
start)
start
;;
stop)
stop
;;
force-reload)
force_reload
;;
restart)
stop
start
;;
*)
echo "$Usage: $prog {start|stop|force-reload|restart}"
exit 2
esac
并设为可执行sudo chmod +x /etc/init.d/anbox
4. 修改网络服务文件sudo nano /usr/share/anbox/anbox-bridge.sh
在第一行插入alias iptables=iptables-legacy
启动anbox
新建启动脚本sudo nano /usr/share/anbox/start-anbox.sh
export $(dbus-launch --autolaunch=`cat /var/lib/dbus/machine-id`)
PROC_NAME=anbox
if [ `ps -ef |grep -w $PROC_NAME|grep -v grep|wc -l` -le 0 ];then
sudo service anbox start
anbox launch --package=org.anbox.appmgr --component=org.anbox.appmgr.AppViewActivity
echo 'ip rule add pref 32766 table main;ip rule add pref 32767 table local;ip route add default dev eth0 via 192.168.250.1;exit' | sudo /usr/share/anbox/anbox-shell.sh
else
anbox launch --package=org.anbox.appmgr --component=org.anbox.appmgr.AppViewActivity
fi
增加执行权限sudo chmod +x /usr/share/anbox/start-anbox.sh
,然后执行脚本看一下能否启动。
运行效果
当然还有一些问题,包括网络配置和音频与视频支持以及arm兼容层安装,下次再说吧。。。
更新:
- 修复网络问题,在安卓启动后输入
echo 'ip rule add pref 32766 table main;ip rule add pref 32767 table local;ip route add default dev eth0 via 192.168.250.1;exit' | sudo /usr/share/anbox/anbox-shell.sh
- 有些软件无法安装是因为架构问题,需要安装houdini兼容层才能运行arm应用,参考此处。
- 安装软件请使用adb,直接在wsl中安装adb就可以连接anbox,可以先装一个酷安,之后就可以用酷安安装软件。
- 没有声音/无法播放视频是解码器问题,参考此处。
- 声音延迟是anbox本身的问题,可以自己编译带patch的版本解决,相关资料。
- 鼠标在窗口边缘点击会改变窗口大小,无法点击屏幕,目前没有解决方法。。。
- 输入法不可用,目前没有解决方法。
- 目前正在尝试折腾deepin的uengine😂(应该解决了声音延迟和输入法问题)。
如有相关问题的解决方法欢迎探讨。
参考文章:在 WSL 2 下运行 Anbox 以及其他各种杂七杂八教程~~~~