Waydroid

来自 Arch Linux 中文维基

本文或本章节的语言、语法或风格需要改进。参考:Help:Style

原因:需要改进文章风格。(在Talk: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 目前不被支持。有两种解决方法:

  • 可能的话,切换到集成显卡
  • 使用软件渲染
    • 确保已经执行 waydroid init (参见#安装部分)
    • 编辑 /var/lib/waydroid/waydroid_base.prop 并设置:
      ro.hardware.gralloc=default
      ro.hardware.egl=swiftshader
    • 重启 waydroid-container.service

Wayland 会话管理器[编辑 | 编辑源代码]

Waydroid 只在 Wayland 会话管理器中工作,因此请确保您处于 Wayland 会话中。

请注意,即使处于 X11 会话中,许多 Wayland 会话管理器也支持嵌套会话,因此可以在 X11 会话中运行 Waydroid (最简单的例子是 weston) 。

内核模块[编辑 | 编辑源代码]

需要运行包含 binder (如果您的内核版本低于 5.18,则还需要 ashmem) 模块的内核。Arch Linux 默认内核 (linux) 并未提供这些模块,因此需要安装提供这些模块的内核。

为使用不同的内核,可能需要重新配置引导加载程序。请参见您的引导加载程序对应的 Wiki 页面,了解如何使用新内核启动。引导到另一个内核(或新版本内核)是少数必须重启 Linux 系统的情况之一。在启动 Waydroid 之前,需要引导到包含这些模块的内核。

注意:waydroidAUR 1.2.1 开始不再需要 ashmem,可使用 memfd 替代,请参见此问题。这是因为从 5.18 版本开始,ashmem 已经在 Linux 主线中被 memfd 完全替代(参见此次提交)。

有多种方式可以获取兼容的内核:

使用 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)。参见内核#编译

当设置编译选项时,有两个选项:binderbinderfs。下面提供了有关这两者的说明。

使用 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 构建内核时,可以按照以下步骤更新配置:

  1. 执行 makepkg --nobuild,将会下载源代码、验证并解压源代码包,然后执行 prepare() 函数。
  2. 编辑位于内核根目录下的 .config 文件 (注意文件名里的点)。
  3. prepare() 函数尾部的命令很可能被用于从配置文件信息重新生成 Makefile (可能是 make olddefconfig) 。将这条命令移动到 build() 函数里,或者单独执行。
  4. 执行 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 将自动处理此问题。

安装[编辑 | 编辑源代码]

安装 waydroidAUR 软件包。

可以选择通过 AUR 安装 waydroid-imageAURwaydroid-image-gappsAUR 来提供所需的 Android 映像。然而,让 Waydroid 自己下载映像是更推荐的做法。

在初始化 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
注意: 正常情况下,Waydroid 创建的接口应该自动位于 firewalld 区域 trusted 内。如果不是这样,请调整上述命令,或将 waydroid0 移动到 trusted。为了使重新启动时能保留更改,可能还需要执行以下命令:
# firewall-cmd --runtime-to-permanent
注意: 请确保在运行 waydroid-container.service 前没有启用TUN Proxy,避免导致错误的网络设置;在启动后可以启用。

故障排除[编辑 | 编辑源代码]

如果您遇到了问题,可参见官方的问题跟踪:Waydroid 问题跟踪

一般建议[编辑 | 编辑源代码]

Waydroid 正在快速发展中,因此如果您遇到问题,这里有一系列值得尝试的步骤:

  1. 确保 Waydroid 软件包处于最新;
  2. 通过执行以下命令,确保已安装最新的 Waydroid 映像:
    # waydroid upgrade
  3. 重置 Waydroid:停止 waydroid-container.service,执行
    # waydroid init -f
    并重新启动服务。
  4. 可能还需要做一下简单的清理,执行以下命令:
    # rm -rf /var/lib/waydroid /home/.waydroid
    $ rm -rf ~/waydroid ~/.share/waydroid ~/.local/share/applications/*aydroid* ~/.local/share/waydroid

旋转的应用程序无法使用[编辑 | 编辑源代码]

参见 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 内的命令出现此问题,如 adbdsettings

一个可能的解决方案是用

# 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

启用 PSI,在内核参数中添加 psi=1

另请参阅[编辑 | 编辑源代码]