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 以及其他各種雜七雜八教程~~~~