在Linux系统上运行安卓游戏是有困难的,因为大多数安卓模拟器都只支持Windows。目前比较好的方案大概只有Waydroid了。Waydroid是Anbox项目的后继者,提供了在X86架构下运行安卓的方案。至于Arm,就需要依靠Arm转译库了。
# 准备Wayland
Waydroid只能在Wayland下运行,因此需要一个Wayland环境。如果已经在使用Wayland可以跳过这步。对于那些X11用户,可以安装Weston,它提供了一种在X11上运行Wayland容器的方法。
paru -S weston
# 特定模块的内核
你需要具有特定模块(binder)的内核来运行waydroid,最简单的方式是使用linux-zen
内核。当然如果你使用其他不包含该模块的内核,可以使用dkms来添加该模块:
paru -S binder_linux-dkms
# 部署Waydroid
首先安装waydroid;
paru -S waydroid
然后初始化;
waydroid init
启用waydroid容器:
sudo systemctl enable waydroid-container --now
打开weston,并在其中运行:
waydroid session start
以及
waydroid show-full-ui
如果一切正常,你应该能看到ui界面。
# 安装额外组件
为求方便,安装:
paru -S waydroid-script-git
这个包提供了一些方便的脚本来管理waydroid组件。
运行以下命令,并选择安装gapps和libndk/libhoudini(注意选择Android11)。一般来说,amd cpu选择libndk,intel cpu选择libhoudini会具有更好的性能。
sudo waydroid-extras
重启waydroid-container服务:
sudo systemctl restart waydroid-container
# 注册设备
我们需要注册设备以保证谷歌服务能够正常使用:
sudo waydroid-extras
选择Get Google Device ID to Get Certified
,并根据提示操作以注册设备id。之后等待十分钟左右以等待注册完毕。
# 问题排查
# 日志
如果发现问题,首先查看日志:
cat /var/lib/waydroid/waydroid.log
# 未找到pulse
No such file or directory - Failed to mount "/run/user/1000/pulse/native" onto "/usr/lib/lxc/rootfs/run/xdg/pulse/native"
waydroid依赖libpulse,如果你使用pipewire,需要安装;
paru -S pipewire-pulse
# Nvidia
由于waydroid不支持N卡的硬件加速,因此需要使用软件渲染。
sudoedit /var/lib/waydroid/waydroid_base.prop
然后修改以下两项:
ro.hardware.gralloc=default
ro.hardware.egl=swiftshader
重启waydroid-container服务:
sudo systemctl restart waydroid-container
该文件在执行sudo waydroid-extras
后会被覆盖,因此如果出现无法显示ui界面的情况,请第一时间确认该文件配置是否正确。
修改后如果不起作用,尝试重启。
# 启动游戏
# 安装adb
我们需要adb来与设备交互,如果你没有安装过adb,执行:
paru -S android-tools
然后重启。
# 获取设备
如果adb能够正常获取到设备信息,表示waydroid已正常运行:
> adb devices
List of devices attached
192.168.240.112:5555 device
# 安装游戏
adb install xxx.apk
然后可以在系统中看到游戏已成功安装,如果ARM翻译库正常作用,这时游戏应当就能运行了。
# 其他设置
# waydroid
使用以下命令以设置设备分辨率(前提是保证waydroid的分辨率小于窗口分辨率)
waydroid prop set persist.waydroid.width <number>
waydroid prop set persist.waydroid.height <number>
使用以下命令取消waydroid的睡眠:
waydroid prop set persist.waydroid.suspend off
# weston
针对使用weston的用户,可以按照需求修改配置文件:
[core]
xwayland=false
idle-time=0
[keyboard]
keymap_layout=gb
[output]
name=screen0
mode=1024x600
[launcher]
icon=/usr/share/icons/AdwaitaLegacy/24x24/legacy/utilities-terminal.png
path=/usr/bin/weston-terminal
[autolaunch]
path=<脚本的绝对路径>
watch=false
比较重要的是idle-time
,将其设置为0以阻止weston的自动锁定。可以使用autolaunch功能自动执行启动脚本。以下脚本开启weston时自动打开安卓应用程序:
#!/bin/bash
waydroid session stop
waydroid session start &
waydroid show-full-ui &
sleep 15
waydroid app launch com.bilibili.azurlane
weston有个比较坑的点是它不支持相对路径,在配置文件中必须使用绝对路径,甚至不支持~
扩展和$HOME
环境变量。
另外,weston默认不读任何位置的配置文件,需要使用-c
来指定配置文件路径,这里它支持~
和$HOME
了,但是仍然不支持相对路径(汗),注意即可。