Waydroid
Waydroid 是一种基于容器的、能在常规的 GNU/Linux 系统上启动完整 Android 系统的方法。
准备工作[编辑 | 编辑源代码]
CPU 要求[编辑 | 编辑源代码]
CPU 要求取决于 CPU 架构。更多信息可参阅此表格。
可以使用 cat /proc/cpuinfo
检查是否具备所需的 CPU 指令集。
GPU 要求[编辑 | 编辑源代码]
Waydroid 目前最适合在 Intel GPU 上使用 (可开箱即用) 。
已支持所有 AMD GPU;如果 Waydroid 不工作,您可能需要构建一个新的 Waydroid 映像 (在 Radeon 680M 上正常工作) ,或者尝试以下有关 NVIDIA 的说明。
NVIDIA GPU 目前不被支持。有两种解决方法:
- 可能的话,切换到集成显卡
- 使用软件渲染
Wayland 会话管理器[编辑 | 编辑源代码]
Waydroid 只在 Wayland 会话管理器中工作,因此请确保您处于 Wayland 会话中。
请注意,即使处于 X11 会话中,许多 Wayland 会话管理器也支持嵌套会话,因此可以在 X11 会话中运行 Waydroid (最简单的例子是 weston包) 。
内核模块[编辑 | 编辑源代码]
需要运行包含 binder (如果您的内核版本低于 5.18,则还需要 ashmem) 模块的内核。Arch Linux 默认内核 (linux包) 并未提供这些模块,因此需要安装提供这些模块的内核。
为使用不同的内核,可能需要重新配置引导加载程序。请参见您的引导加载程序对应的 Wiki 页面,了解如何使用新内核启动。引导到另一个内核(或新版本内核)是少数必须重启 Linux 系统的情况之一。在启动 Waydroid 之前,需要引导到包含这些模块的内核。
有多种方式可以获取兼容的内核:
使用 Linux-Zen[编辑 | 编辑源代码]
linux-zen包 内核包含了必要的模块。这可能是最方便的方法,您不需要花很长时间编译内核,而且能定期接收到更新。
使用 linux-lily[编辑 | 编辑源代码]
linux-lilyCNRepo 包含了 binder 模块。这是一个较少更新的内核包,可以通过添加 archlinuxcn 仓库来安装。
DKMS 模块[编辑 | 编辑源代码]
可以安装 anbox-modules-dkms-gitAUR,并使用以下命令加载内核模块:
# modprobe ashmem_linux # modprobe binder_linux
或者如果您的内核版本是 5.18 或更新,安装只提供 binder_linux 的 binder_linux-dkmsAUR 即可。
构建内核[编辑 | 编辑源代码]
另外,可以用必要的选项重新编译 linux包 内核——或者其他内核版本 (>=5.7)。参见内核#编译。
当设置编译选项时,有两个选项:binder 和 binderfs。下面提供了有关这两者的说明。
使用 binder[编辑 | 编辑源代码]
模块既可以被编译到内核中 (y
),也可以被编译到模块中 (m
),或者不编译 (n
) 。此外,配置中的选项不能任意组合,有些选项依赖于其他选项。
以下配置选项会将 binder 编译成模块,与此同时最后一个选项指定了在 binder 模块加载时,将在 /dev/
目录下创建 3 个设备。
CONFIG_ANDROID=y CONFIG_ANDROID_BINDER_IPC=m CONFIG_ANDROID_BINDERFS=n CONFIG_ANDROID_BINDER_DEVICES="binder,hwbinder,vndbinder"
当从 AUR 构建内核时,可以按照以下步骤更新配置:
- 执行
makepkg --nobuild
,将会下载源代码、验证并解压源代码包,然后执行prepare()
函数。 - 编辑位于内核根目录下的
.config
文件 (注意文件名里的点)。 - 在
prepare()
函数尾部的命令很可能被用于从配置文件信息重新生成 Makefile (可能是make olddefconfig
) 。将这条命令移动到build()
函数里,或者单独执行。 - 执行
makepkg --noextract
,将自动从makepkg --nobuild
停下的位置继续执行。
使用 binderfs[编辑 | 编辑源代码]
已知 binder 内核模块会给部分用户造成一些问题。为了解决这些问题,binderfs 应运而生。编译内核时,必须要在新旧方式之间做出选择。使用以下选项,可以使用 binderfs 来替代 binder。
内核源代码也附带了用于设置配置选项的简单脚本。此脚本不会做依赖检查,就像手动编辑配置文件一样。当与 .config
处于相同目录时,可以执行以下命令:
$ scripts/config --enable CONFIG_ANDROID $ scripts/config --enable CONFIG_ANDROID_BINDER_IPC $ scripts/config --enable CONFIG_ANDROID_BINDERFS $ scripts/config --set-str CONFIG_ANDROID_BINDER_DEVICES ""
当从 AUR 构建内核时,将这几行插入到 PKGBUILD 中的合适位置即可 (通常在 prepare()
中) 。
设置 binder 设备[编辑 | 编辑源代码]
确保已经安装 Waydroid 软件包的最新版本。Waydroid 将自动处理此问题。
安装[编辑 | 编辑源代码]
可以选择通过 AUR 安装 waydroid-imageAUR 或 waydroid-image-gappsAUR 来提供所需的 Android 映像。然而,让 Waydroid 自己下载映像是更推荐的做法。另外,中国用户可能会下载极为缓慢,可以通过添加 archlinuxcn 仓库之中国大陆镜像后执行sudo pacman -S waydroid-image
来快速下载。
在初始化 Waydroid 之后,如果映像不可用,将会自动下载最新的 Android 映像(可能会耗时很久;你也可以自行下载之后将文件放到 /usr/share/waydroid-extra/images/)。
# waydroid init
初始化支持 GApps 的 Waydroid:
# waydroid init -s GAPPS -f
接下来启动/启用 waydroid-container.service
。
# systemctl enable --now waydroid-container
Waydroid 现在应该能正常工作了。
用法[编辑 | 编辑源代码]
确保 waydroid-container.service
正在运行,然后执行:
$ waydroid session start
Waydroid 会话现在已处于活动状态,这里有一些与 Waydroid 交互的实用命令:
启动 GUI:
$ waydroid show-full-ui
启动 shell:
# waydroid shell
安装应用程序:
$ waydroid app install $path_to_apk
运行应用程序:
$ waydroid app launch $package-name #Can be retrieved with `waydroid app list`
网络[编辑 | 编辑源代码]
网络应该开箱即用,否则可能需要确保在执行 Waydroid session start 之前,内核中已启用包转发并且允许以下规则通过防火墙:
以 ufw包 为例:
- 允许 DNS 流量:
# ufw allow 67
# ufw allow 53
- 允许包转发:
# ufw default allow FORWARD
对于 firewalld包, 可以使用这些命令:
- DNS:
# firewall-cmd --zone=trusted --add-port=67/udp
# firewall-cmd --zone=trusted --add-port=53/udp
- 包转发:
# firewall-cmd --zone=trusted --add-forward
trusted
内。如果不是这样,请调整上述命令,或将 waydroid0
移动到 trusted
。为了使重新启动时能保留更改,可能还需要执行以下命令:# firewall-cmd --runtime-to-permanent
故障排除[编辑 | 编辑源代码]
如果您遇到了问题,可参见官方的问题跟踪:Waydroid 问题跟踪
一般建议[编辑 | 编辑源代码]
Waydroid 正在快速发展中,因此如果您遇到问题,这里有一系列值得尝试的步骤:
- 确保 Waydroid 软件包处于最新;
- 通过执行以下命令,确保已安装最新的 Waydroid 映像:
# waydroid upgrade
- 重置 Waydroid:停止
waydroid-container.service
,执行# waydroid init -f
并重新启动服务。 - 可能还需要做一下简单的清理,执行以下命令:
# rm -rf /var/lib/waydroid /home/.waydroid
$ rm -rf ~/waydroid ~/.share/waydroid ~/.local/share/applications/*aydroid* ~/.local/share/waydroid
无法安装ARM应用[编辑 | 编辑源代码]
安装waydroid_script脚本,AMD 处理器安装 libndk,Intel 处理器安装 libhoudini
git clone https://github.com/casualsnek/waydroid_script
cd waydroid_script
python3 -m venv venv
venv/bin/pip install -r requirements.txt
sudo venv/bin/python3 main.py
? Select Android version (↑↓ Select Item)
❯ Android 11
Android 13
Exit
? Select Android version Android 11
? Please select an action ([↑↓]: Select Item)
❯ Install
Remove
Hack
Get Google Device ID to Get Certified
? Select Android version Android 11
? Please select an action Install
? Select apps ([↑↓]: Select Item. [Space]: Toggle Choice), [Enter]: Confirm
○ gapps
○ microg
❯ ◉ libndk // AMD CPU 空格选择
○ magisk
○ smartdock
○ fdroidpriv
◉ libhoudini //intel CPU 空格选择
○ widevine
旋转的应用程序无法使用[编辑 | 编辑源代码]
参见 https://github.com/waydroid/waydroid/issues/70 。
按 F11 可将当前应用切换到窗口模式。
无法启动剪贴板管理服务[编辑 | 编辑源代码]
安装 python-pyclipAUR。
无法使用物理键盘[编辑 | 编辑源代码]
按左 Alt 键。
dnsmasq: failed to open pidfile /run/waydroid-lxc/dnsmasq.pid: Permission denied[编辑 | 编辑源代码]
没有设置 apparmor 规则,前往 /etc/apparmor.d/usr.sbin.dnsmasq 并在末尾添加
#/etc/apparmor.d/usr.sbin.dnsmasq @{run}/waydroid-lxc/ r, @{run}/waydroid-lxc/* rw,
Waydroid shell 中的命令输出无法访问或命令未找到[编辑 | 编辑源代码]
在基于 Arch 的发行版上,使用 lxc-attach 时可能会出现一个 "bug",可能会导致 waydroid shell
内的命令出现此问题,如 adbd
或 settings
。
一个可能的解决方案是用
# lxc-attach -P /var/lib/waydroid/lxc/ -n waydroid --clear-env
替代
# waydroid shell
WARNING: Service manager /dev/binder has died[编辑 | 编辑源代码]
参见 https://github.com/waydroid/waydroid/issues/136 。
无法输入中文[编辑 | 编辑源代码]
默认的安卓系统不包括中文输入法。在容器内部安装一个中文输入法即可。