OFFSET偏移
← 文章目录OFFSET / FIELD NOTESNO. 148

Waydroid 故障排查与 FAQ

按内核、容器、网络、图形和应用层的证据定位故障。

所在专题Waydroid ↗
约 43 分钟阅读开始阅读

适用范围与操作前提#

命令和输出使用通用示例。内核、镜像、包与服务版本会影响具体行为,阅读时应结合所用版本的文档核对。

修改容器、镜像、挂载和防火墙前先备份 Android 数据并停止相关会话;带删除或强制停止的示例可能丢失数据。NixOS 的系统与用户环境配置应通过 Nix 管理,通用 Linux 的 apt/pacman、直接写 /etc 和 pip 安装段落不用于 NixOS 宿主。重建的 build、test、switch 与启动后的功能验证是不同阶段。

本文档覆盖 Waydroid 最常见故障,按症状诊断、根因分析、可复现修复命令三步完成。每类问题保留诊断示例;修复需要先确认原因、版本、数据备份和权限边界,不逐条盲目执行。


容器启动失败#

Service manager /dev/binder has died

症状:waydroid session start 后立即退出,日志显示 Service manager /dev/binder has died。

根因:此日志说明 Binder 服务管理器消失,可能由容器退出、镜像/驱动或资源问题引起。先看 LXC 和 Android 日志;PSI 缺失是独立的宿主配置检查点,不能把这条日志直接等同于 Binder 依赖 PSI。

解决方案:

Step 1 — 检查 PSI;仅在需要时添加 kernel 启动参数:

先查看 /proc/pressure/ 和内核配置;如果 PSI 已可用,此修改不是修复该日志的必需步骤。启动配置示例应匹配实际引导器,不替换整段已存在的参数。

# 编辑 /etc/default/grub,在 GRUB_CMDLINE_LINUX 中添加
GRUB_CMDLINE_LINUX="... psi=1"

# 更新 grub 配置
sudo update-grub        # Debian/Ubuntu
sudo grub-mkconfig -o /boot/grub/grub.cfg  # Arch

# NixOS 用户(在 configuration.nix 中):
# boot.kernelParams = [ "psi=1" ];

Step 2 — 确认 PSI 生效:

cat /proc/pressure/cpu
# 应该输出形如: some avg10=0.00 avg60=0.00 avg300=0.00 total=...

ls /proc/pressure/
# 应包含: cpu  io  memory
# 若为空 → PSI 未生效,检查内核编译选项 CONFIG_PSI=y

Step 3 — 检查实际镜像与运行环境

/proc/self/maps 中的 vsyscall 映射不是 Waydroid 的通用验收条件,也不称为“vsyscall32”。只有某个旧二进制实际因该接口失败时才评估兼容参数,不能默认降低内核保护来修复 Binder。

sudo waydroid logcat
journalctl -u waydroid-container -b

自定义内核故障应比较已知可用内核和对应日志,不能宣称所有 Zen/Liquorix 内核都与 PSI 冲突。


Binder 模块未加载

症状:waydroid log 中报 Failed to open /dev/binder 或 binder: Unknown symbol。

可能原因:Binder 未提供、未加载、节点/权限错误或内核模块不匹配;Unknown symbol 需要检查模块与内核的匹配。

解决方案:

# 检查 binder 模块状态
lsmod | grep binder

# 如果无输出,加载传统 binder_linux 模块
sudo modprobe binder_linux

# 或加载 发行版提供的 Rust Binder(若实际可用)
sudo modprobe rust_binder

# 确认 /dev/binder 设备存在
ls -la /dev/binder*
# 应显示 /dev/binder, /dev/hwbinder, /dev/vndbinder

# 如果需要开机自动加载
echo "binder_linux" | sudo tee /etc/modules-load.d/waydroid.conf

binder_linux vs rust_binder 检查当前发行版实际提供的 Binder 模块与节点;C/Rust 实现的可用性和兼容性按具体内核核对,不从版本号推断稳定性。参见 01 架构 了解 binder 选型。


LXC 版本不兼容

症状:容器创建后处于 CREATING 状态永不变为 RUNNING,或 waydroid init 报 lxc configuration error。

根因:宿主 LXC 版本与 Waydroid 镜像的 LXC 配置格式不兼容。

解决方案:

# 查看 LXC 版本
lxc-info --version

# 查看 Waydroid LXC 日志
sudo cat /var/lib/waydroid/lxc/waydroid/waydroid.log

# 查看容器状态
sudo lxc-ls -f | grep waydroid

# 若卡在 CREATING,尝试强制停止后重新 init
sudo waydroid container stop
# 破坏性清理示例:先停止会话/容器、核对路径和备份,再手动决定
# sudo rm -rf -- /var/lib/waydroid/lxc/waydroid
sudo waydroid init -f # 强制初始化;先核对当前状态与备份

waydroid init -f 是强制初始化选项,不等同于无条件清除全部用户数据;手动删除数据目录才会造成相应数据丢失。确认备份后再执行。


systemd 服务未启动

症状:waydroid session start 报 connection refused 或 No such file or directory。

根因:waydroid-container systemd 服务未运行。

解决方案:

# 检查服务状态
systemctl status waydroid-container

# 查看完整日志
journalctl -u waydroid-container -b --no-pager -l

# 如果服务未启用
sudo systemctl enable --now waydroid-container

# 如果服务启动后立即退出
journalctl -u waydroid-container -b -p 3  # 只看错误

常见 systemd 日志解读:

日志关键词 含义
permission denied on /dev/binder binder 设备权限不足,检查 udev 规则
cannot open /var/lib/waydroid 目录不存在或权限错误
lxc-start: No such file LXC 未安装或路径错误

ZFS 根文件系统导致启动循环

症状:容器反复重启(boot loop),waydroid log 无明确错误。

根因:ZFS dataset 默认未启用 acltype=posixacl,而 Waydroid 容器需要 POSIX ACL 支持才能正常运行。

解决方案:

# 确认当前 acltype 设置
zfs get acltype <VERIFIED_DATASET>

# 若为 off,手动启用
sudo zfs set acltype=posixacl <VERIFIED_DATASET>

# 示例(假如 dataset 路径为 rpool/ROOT/nixos)
sudo zfs set acltype=posixacl <VERIFIED_DATASET> # 仅在日志/数据集条件确认后

# 重启 Waydroid
sudo systemctl restart waydroid-container
waydroid session start

NixOS + ZFS 用户 如果 fstab 文件因 waydroid 安装被写入非标准条目,可能导致 nixos-rebuild 失败。在安装 Waydroid 前务必先运行 nixos-generate-config 生成正确的 fstab 基线。详见 03 NixOS 集成。


网络相关问题#

Android 内无网络连接

症状:Android 内浏览器无法打开网页,但宿主网络正常。

根因:Waydroid 通过 waydroid0 网桥 + NAT + dnsmasq 提供网络。链路中任一环节中断都会导致断网。

排查链路:

# Step 1: 检查 IPv6 是否禁用(Waydroid 依赖 IPv6)
cat /proc/sys/net/ipv6/conf/all/disable_ipv6
# 按当前脚本要求核对;不是 Binder 依赖的证据

# Step 2: 检查 waydroid0 网桥是否存在
ip link show waydroid0
# 应显示 state UP。若不存在,重启 waydroid-container

# Step 3: 检查 dnsmasq 是否运行
pgrep -a dnsmasq | grep waydroid

# Step 4: 检查防火墙 FORWARD 规则
sudo nft list ruleset | grep -A5 waydroid
# 或
sudo iptables -L FORWARD -v | grep waydroid

修复(根据断点针对性处理):

# 如果 IPv6 被禁用
sudo sysctl -w net.ipv6.conf.all.disable_ipv6=0

# 如果 waydroid0 缺失
sudo systemctl restart waydroid-container

# 如果 dnsmasq 未运行,检查端口占用
sudo ss -tulpn | grep -E ':53 |:67 '
# 若 53/67 端口被 systemd-resolved 占用,修改 /etc/systemd/resolved.conf:
# DNSStubListener=no
sudo systemctl restart systemd-resolved

详见:05 网络与安全模型 完整网络架构。


DNS 解析失败

症状:Android 内可以 ping IP 地址,但无法解析域名。

根因:端口 53 被宿主的 systemd-resolved 或其他 DNS 服务占用,导致 dnsmasq 无法绑定。

解决方案:

# 确认端口占用
sudo lsof -i :53

# 方案 A:禁用 systemd-resolved 的 DNS 监听
sudo mkdir -p /etc/systemd/resolved.conf.d/
echo -e "[Resolve]\nDNSStubListener=no" | sudo tee /etc/systemd/resolved.conf.d/waydroid.conf
sudo systemctl restart systemd-resolved

# 方案 B:如果方案 A 不可行,手动在 Android 内设置 DNS
sudo waydroid shell
# 在 Android shell 中:
setprop net.dns1 <EXAMPLE_IP>
setprop net.dns2 <EXAMPLE_IP>

Docker 网桥冲突

症状:安装 Docker 后 Waydroid 网络不可用。

根因:Docker 的 docker0 网桥可能与 waydroid0 网桥的 IP 段或 lxc-use-nft 设置冲突。

解决方案:

# 方案 A:修改 LXC 配置,禁用 nftables
# LXC_USE_NFT 是网络脚本变量,不在 LXC config 追加无效配置;先核对实际后端
sudo systemctl restart waydroid-container

# 方案 B:调整 waydroid0 网桥 IP(避免与 docker0 <EXAMPLE_IP>/16 重叠)
# 编辑 /var/lib/waydroid/lxc/waydroid/config,修改:
# lxc.net.0.ipv4.address = <EXAMPLE_IP>/24
# lxc.net.0.ipv4.gateway = <EXAMPLE_IP>

# 方案 C:重建容器网络
sudo waydroid container stop
sudo systemctl restart waydroid-container
waydroid session start

Play Store 无法连接

症状:Play Store 打开后显示"重试"或白屏,但其他应用可联网。

可能原因:网络/DNS、GAPPS 镜像、服务状态或未注册设备。官方自认证流程可以处理特定未认证提示,不是所有白屏的唯一原因。

解决方案:

# Step 1: 获取 Android ID
sudo waydroid shell
# 进入 Android shell 后:
sqlite3 /data/data/com.google.android.gsf/databases/gservices.db \
  "select * from main where name = 'android_id';"
# 复制输出的数字(不带引号),然后 exit 退出 shell

# Step 2: 用浏览器打开
# https://www.google.com/android/uncertified

# Step 3: 在页面输入框中粘贴 android_id,提交

# Step 4: 等待数分钟并按页面状态检查(Google 需要时间下发认证)
# 关闭 Waydroid,服务反映更新后重启:
sudo systemctl restart waydroid-container
waydroid session start

# Step 5: 清除 Play Store 缓存
sudo waydroid shell pm clear com.android.vending # 会清除应用数据,先确认

Play Integrity API 即使通过 Play Protect 认证,Waydroid 仍无法通过 Google Play Integrity API 强校验(相应完整性等级)。应用是否拒绝运行取决于要求与服务端政策;自认证不等于满足设备或强完整性等级。详见 06 配置与调优。


ADB 连接

症状:adb devices 不显示 Waydroid 设备。

解决方案:

# 方案 A:通过 Waydroid 内置 ADB(默认端口 5555)
# 先在 Android 中打开 ADB:
# "设置 → 关于平板电脑 → 连续点击"版本号"7 次启用开发者选项"
# "设置 → 系统 → 开发者选项 → 开启 USB 调试"

# 获取 Android IP 地址
sudo waydroid shell ip addr show
# 通常在 waydroid0 网桥上,如 <EXAMPLE_IP>

# 连接
adb connect <EXAMPLE_IP>:5555

# 方案 B:如果方案 A 失败,使用 waydroid 命令行操作替代 adb
waydroid app list          # adb shell pm list packages
waydroid app install foo.apk  # adb install
waydroid app launch com.example.app  # adb shell am start

GPU 与显示问题#

屏幕闪烁/撕裂

症状:Android 窗口内画面闪烁、横向撕裂线,滚动时愈发明显。

根因:GPU 缓冲区调度与 Wayland compositor 的帧同步失配。常见于较旧的 iGPU 或特定 Mesa 版本。

解决方案:

# 方案 A:强制软件渲染
# 当前官方文档未列出此 runtime 属性,改为 waydroid.cfg 的 [properties]:
# ro.hardware.gralloc=default
# ro.hardware.egl=swiftshader
# 应用启动期覆盖后再重启容器
sudo systemctl restart waydroid-container

# 方案 B:如果方案 A 性能太差,尝试调整 GPU 缓冲区
# 查看当前 GPU 渲染后端
waydroid log | grep -i "gpu\|egl\|render"

# 尝试切换到 SwiftShader(软件实现 Vulkan)
# 启动期属性:在 waydroid.cfg 的 [properties] 中设置 ro.hardware.egl=swiftshader
# 不猜测镜像中的 Vulkan HAL 名;检查实际可用 HAL
sudo systemctl restart waydroid-container

详见 04 GPU 与硬件加速 中完整的 GPU 后端切换方案。


黑屏/白屏(应用窗口不渲染)

症状:Waydroid 启动后窗口全黑或全白,但 waydroid log 不报错。

根因:GPU compositor 未能初始化渲染上下文。

解决方案:

# 确认 GPU 检测情况
waydroid log | grep -i "gpu\|drm\|gbm"

# 手动测试软件渲染
# 当前官方文档未列出此 runtime 属性,改为 waydroid.cfg 的 [properties]:
# ro.hardware.gralloc=default
# ro.hardware.egl=swiftshader
# 应用启动期覆盖后再重启容器
sudo systemctl restart waydroid-container
waydroid session start

# 如果软件渲染正常 → 确认硬件渲染问题
# 查看 GPU 型号和驱动
lspci -k | grep -A3 -E "VGA|3D"
glxinfo | grep "OpenGL renderer"

NVIDIA GPU 黑屏

症状:NVIDIA 显卡用户启动 Waydroid 后窗口全黑,无任何渲染输出。

根因:现代 NVIDIA 驱动支持 GBM,但 Waydroid 镜像的 gralloc/Mesa/EGL 集成与上游 GPU 选择仍可能不支持该路径。

解决方案:

# 必须使用软件渲染
# 当前官方文档未列出此 runtime 属性,改为 waydroid.cfg 的 [properties]:
# ro.hardware.gralloc=default
# ro.hardware.egl=swiftshader
# 应用启动期覆盖后再重启容器

# 显式禁用 GBM
# 未确认此环境变量由当前版本读取,不使用它替代启动期 properties 配置
waydroid session start

# 永久设置(写入 ~/.bashrc 或 ~/.config/environment.d/waydroid.conf)
# 不写入未核实环境变量

# 或通过 waydroid prop 设置
# 启动期属性:在 waydroid.cfg 的 [properties] 中设置 ro.hardware.egl=swiftshader
# 不猜测镜像中的 Vulkan HAL 名;检查实际可用 HAL
sudo systemctl restart waydroid-container

NVIDIA + Waydroid 性能预期 软件渲染下的 Waydroid 不适合任何 3D 应用/游戏。即便是 Swiftshader(CPU 实现 Vulkan),性能差距需按实际应用测量。NVIDIA 用户对 Waydroid 的性能预期应设定为"勉强可用的 2D 应用"。


Intel + AMD 混合显卡

症状:双显卡笔记本(Intel iGPU + AMD dGPU)下,Waydroid 窗口渲染异常或崩溃。

根因:Waydroid 可能使用了与 Wayland compositor 不同的 GPU,导致渲染目标不匹配。

解决方案:

# 确认 Waydroid 渲染 GPU
waydroid log | grep -i "drm\|render"

# 确认 compositor 渲染 GPU
# Hyprland: hyprctl monitors
# Sway: swaymsg -t get_outputs

# 强制使用集成显卡(Intel)
# 在 waydroid.cfg 的 [waydroid] 中指定已核对的节点:
# drm_device=/dev/dri/renderD128

# 或强制使用独立显卡(AMD)
# # drm_device=/dev/dri/renderD129 # 按实际节点调整

DRI 设备编号规则 /dev/dri/renderD128 通常是第一块 GPU(iGPU),/dev/dri/renderD129 是第二块(dGPU)。用 ls -la /dev/dri/render* 确认。


多窗口模式渲染错乱

症状:启用多窗口后,应用调整大小时内容错位、渲染花屏。

根因:Android 13 的 freeform 窗口管理机制尚不完善,部分应用未适配动态窗口尺寸变化。

解决方案:

# 关闭多窗口模式
waydroid prop set persist.waydroid.multi_windows false
sudo systemctl restart waydroid-container

# 如果需要多窗口但部分应用有问题,仅为特定应用禁用:
# 在应用启动后不调整其窗口大小即可

详见 06 配置与调优 中多窗口模式的完整配置。


应用兼容性#

ARM 应用崩溃(x86 宿主机)

症状:APK 安装成功但打开即闪退,或弹出"应用已停止"。

根因:Waydroid 默认为 x86_64 Android 镜像,无法直接运行 ARM 原生库。需要 ARM 转译层。

解决方案:

# Intel CPU → libhoudini(第三方部署的专有转译组件)
waydroid session stop
# 按已审阅的社区安装器和镜像版本选择 libhoudini,不假定有 waydroid-extras 命令

# AMD CPU → libndk(NDK 转译,兼容性更好)
# 或选择 libndk 组件,按同一镜像/应用对照测试,不由 CPU 品牌保证

# 重启 Waydroid
sudo systemctl restart waydroid-container
waydroid session start

# 验证 ARM 转译生效
sudo waydroid shell getprop ro.product.cpu.abilist
# 应包含 arm64-v8a 或 armeabi-v7a

libhoudini vs libndk 选择原则

  • libhoudini:常与 Intel 相关的专有转译组件,Intel 平台首选,但闭源且不定时更新。
  • libndk:基于 Android NDK 的 ARM 转译,AMD 平台兼容性更好,这类转译组件通常是专有二进制,不能等同于开源 Android NDK 编译工具。
  • 两者互斥,不可同时安装。

详见 06 配置与调优 中完整的 ARM 转译配置。


Play Store 不显示某些应用

症状:Play Store 搜索不到某些应用,或显示"此应用与您的设备不兼容"。

根因:

  1. Play Protect 未认证(见上文网络章节)
  2. Waydroid 伪装设备型号不符合应用要求
  3. 架构不兼容(x86 vs ARM)

解决方案:

# Step 1: Play Protect 认证(见上文"Play Store 无法连接")

# Step 2: 检查镜像设备属性与应用过滤条件
# 原笔记的 persist.waydroid.device_name/manufacturer 未核实为官方接口
# prop set 成功不代表会更改 Android 设备型号;修改型号也不保证 Play 兼容性

# Step 3: 清除 Play Store 数据并重试
sudo waydroid shell pm clear com.android.vending # 会清除应用数据,先确认
waydroid app launch com.android.vending

# Step 4: 如果仍不显示,使用 Aurora Store 作为替代
# Aurora Store 不依赖 Play Protect 认证
waydroid app install com.aurora.store.apk

应用检测到 Root / 模拟器

症状:应用弹出"检测到 ROOT 环境"或"不支持模拟器",拒绝启动。

根因:Waydroid 与真机存在可检测差异(ro.build.tags=test-keys、缺失硬件熔丝等),部分应用使用 Play Integrity / SafetyNet 强校验。

兼容性检查与历史方案:

以下框架方案仅保留为源笔记的历史思路,版本兼容、安全代价与应用服务规则需单独核对,不承诺成功:

# ro.* 通常在启动时只读,不能把启动后 setprop 当作可靠修改方式
# 镜像/启动配置的属性变化也不等同于设备完整性证明

# 中等方案:Magisk + LSPosed
# 1. 在 Waydroid 中安装 Magisk(需 root)
# 2. 安装 LSPosed 框架
# 3. 安装 Hide My Applist / Shamiko 模块
# 4. 对目标应用启用隐藏

# 但要认识到:

Play Integrity 等级与应用要求 Waydroid 通常不能满足依赖受信任硬件的强完整性要求(MEETS_STRONG_INTEGRITY);自认证和修改属性不会自动获得此等级。这是因为 Waydroid 没有 TEE(可信执行环境)和安全硬件熔丝。不同应用所需完整性等级与服务端要求不同,不能推断所有相关应用永远无法运行;按当前要求验证。这不是 bug,是架构限制。


DRM 应用无法播放视频

症状:Netflix、Disney+、Prime Video 等应用黑屏或提示"设备不支持"。

可能原因:Widevine 等 DRM 的等级、许可证、密钥与服务端设备要求未满足。软件 L3 与依赖硬件保护的 L1 不同,不能把所有 DRM 都说成必须 TEE;Waydroid 的支持不应保证。

解决方案:

目前无可用修复方案。以下变通方法仅供参考:

  • 使用 DRM-free 的替代视频源
  • 使用宿主 Linux 浏览器的网页版观看(Firefox/Chrome 的 DRM 支持更好)
  • 部分 L3 级别 DRM 内容可能通过修改 CDM 文件工作,但这涉及版权合规问题

应用需要 WiFi 连接

症状:某些应用(如 Mihon、阅读类 App)检测不到 WiFi 连接而拒绝联网。

根因:Waydroid 使用虚拟以太网连接,应用的 WiFi 检测逻辑误判为无网络。

解决方案:

# 全局伪装 WiFi
waydroid prop set persist.waydroid.fake_wifi "*"
sudo systemctl restart waydroid-container

# 仅为特定应用伪装 WiFi(示例:Mihon 阅读器)
waydroid prop set persist.waydroid.fake_wifi "app.package.name"
sudo systemctl restart waydroid-container

# 查看当前 fake_wifi 设置
waydroid prop get persist.waydroid.fake_wifi

触控/点击不响应

症状:鼠标点击应用内按钮无反应,但滚动和键盘输入正常。

根因:部分应用检测触控硬件,Waydroid 默认不模拟触控设备。

解决方案:

# 启用虚拟触控
waydroid prop set persist.waydroid.fake_touch "com.example.app"
sudo systemctl restart waydroid-container

# 如果仍不响应,尝试通过 scrcpy 作为控制器
# scrcpy 通过 ADB 提供更精确的触控模拟
scrcpy --serial=<EXAMPLE_IP>:5555

游戏输入问题

症状:游戏内键盘映射不符合预期,或需要多点触控。

解决方案:

# 方案 A:使用 scrcpy 替代 Waydroid 主窗口
# scrcpy 的触控模拟更精确,且支持键盘映射
adb connect <EXAMPLE_IP>:5555
scrcpy --serial=<EXAMPLE_IP>:5555 --turn-screen-off

# 方案 B:对于需要手柄的游戏
# scrcpy 支持 OTG / 游戏手柄直通
# scrcpy --otg 针对 USB OTG 场景,不适用于这里的网络 ADB 容器连接

# 方案 C:Key Mapper 应用
# 在 Waydroid 内安装 Key Mapper,自定义键盘到触控的映射

系统级问题#

剪贴板不同步

症状:宿主与 Android 之间无法复制粘贴。

根因:Waydroid 剪贴板同步依赖宿主 wl-clipboard 工具。

解决方案:

# 安装 wl-clipboard
# Arch
sudo pacman -S wl-clipboard

# Debian/Ubuntu
sudo apt install wl-clipboard

# NixOS(在 home.packages 或 environment.systemPackages 中)
# pkgs.wl-clipboard

# 安装后重启 Waydroid 会话
waydroid session stop
waydroid session start

# 验证剪贴板同步
echo "test from host" | wl-copy
# 在 Android 中应能粘贴

剪贴板限制 Waydroid 剪贴板仅同步纯文本,不支持富文本、图片、文件。对于复杂剪贴板内容,使用 adb push/pull 作为补充方案。


系统挂起/休眠导致容器损坏

症状:系统从挂起/休眠恢复后,Waydroid 容器无响应或数据损坏。

根因:Android 容器内的文件系统状态在暂停时未正确冻结,恢复后可能出现不一致。

解决方案:

# 挂起/休眠前手动停止 Waydroid(推荐设为 systemd hook)
waydroid session stop
sudo systemctl stop waydroid-container

# 然后执行系统挂起
systemctl suspend

# --- 或创建 systemd sleep hook ---
# 创建 /usr/lib/systemd/system-sleep/waydroid-sleep.sh

创建挂起钩子脚本:

sudo tee /usr/lib/systemd/system-sleep/waydroid-sleep.sh << 'EOF'
#!/bin/sh
case "$1" in
  pre)
    # 挂起前停止 Waydroid
    # root sleep hook 没有用户 session bus,不在这里运行用户会话停止命令
    /usr/bin/systemctl stop waydroid-container 2>/dev/null
    ;;
  post)
    # 恢复后启动 Waydroid
    /usr/bin/systemctl start waydroid-container 2>/dev/null
    ;;
esac
EOF

sudo chmod +x /usr/lib/systemd/system-sleep/waydroid-sleep.sh

长时间运行后会话卡死

症状:Waydroid 运行数小时后窗口冻结,Android 内应用无响应。

可能原因:OOM、cgroup 任务上限、图形/驱动或 Android 服务故障;先核对实际 pid_max 和错误日志,不假定为 32768,也不把 65535 当通用优化。

解决方案:

# 临时修改
sysctl kernel.pid_max # 先检查当前值,未证实耗尽不修改

# 永久设置
# NixOS 用 boot.kernel.sysctl 管理经过验证的值;不直接覆盖 /etc
sudo sysctl --system

# 验证
sysctl kernel.pid_max
# 输出当前实际值,没有统一要求设为 65535

无法停止 Waydroid 容器

症状:waydroid session stop 卡住,或报 container is busy。

根因:Android 内有进程持有重要锁或未响应 SIGTERM。

解决方案:

# 尝试 1:标准停止
waydroid session stop

# 尝试 2:强制停止容器
sudo waydroid container stop

# 尝试 3:直接使用 LXC 命令
sudo lxc-stop -n waydroid -k

# 尝试 4:终极方案 — 杀死所有相关进程
# 如需最后手段,先查清具体 PID,再定向终止;不使用广泛模式杀进程
pgrep -a -f "lxc.*waydroid" # 只查询;强杀可能丢失未写数据

# 确认无残留进程
pgrep -a -f waydroid

磁盘空间不足

症状:waydroid init 失败或 Android 内提示存储空间不足。

根因:Waydroid 镜像和用户数据可能占用超过 5GB。

空间排查:

# 查看 Waydroid 磁盘占用
du -sh /var/lib/waydroid/
du -sh ~/.local/share/waydroid/

# 详细分层
du -h --max-depth=1 /var/lib/waydroid/ | sort -hr
du -h --max-depth=1 ~/.local/share/waydroid/ | sort -hr

# 典型占用:
# /var/lib/waydroid/images/system.img    ~1.2 GB
# /var/lib/waydroid/images/vendor.img    ~300 MB
# ~/.local/share/waydroid/data/data/     ~2-4 GB(用户数据 + 应用)

清理方案:

# 清理应用缓存(在 Android 内)
sudo waydroid shell pm trim-caches 1G

# 或完全重建(会丢失所有数据)
sudo waydroid container stop
# 破坏性清理示例:先停止会话/容器、核对路径和备份,再手动决定
# sudo rm -rf -- /var/lib/waydroid
# 破坏性清理示例:先停止会话/容器、核对路径和备份,再手动决定
# rm -rf -- ~/.local/share/waydroid
sudo waydroid init -f # 强制初始化;先核对当前状态与备份

声音问题

症状:Android 应用有画面无声音,或声音调节不生效。

解决方案:

# Step 1:确认 PulseAudio socket 连接
waydroid log | grep -i "audio\|pulse"

# Step 2:确认宿主音频正常
pactl info | grep "Server Name"

# Step 3:安装 Sound Quick Settings(通知栏音量控制)
# 从 F-Droid 或 APKMirror 获取 Sound Quick Settings APK
waydroid app install SoundQuickSettings.apk

# Step 4:或使用 ShizuTools 实现逐应用静音
waydroid app install ShizuTools.apk

Liquorix / Zen 内核不兼容

症状:Waydroid 容器随机崩溃或无响应,dmesg 中有 PSI 或 scheduler 相关错误。

可能原因:某个内核版本、模块或镜像的具体兼容问题,需要日志与对照内核;Binder 不是由 PSI 提供,也没有证据证明所有此类内核冲突。

解决方案:

# 可用标准受支持内核做对照测试,保留备用引导,不视为唯一修复
# Arch:
sudo pacman -S linux linux-lts

# NixOS:
# 在 configuration.nix 中:
# boot.kernelPackages = pkgs.linuxPackages;
# 或
# boot.kernelPackages = pkgs.linuxPackages_latest;
# 然后 nixos-rebuild switch

# 如果必须使用 Liquorix/ Zen:
# 尝试关闭内核的 MuQSS/PDS 调度器(不同版本参数不同)
# 但不保证稳定,建议仅在测试环境中尝试

快速诊断检查清单#

当 Waydroid 出现任何问题时,按以下顺序逐一排查:

# 1. 内核支持
ls -la /dev/binder*                # binder 设备
cat /proc/pressure/cpu 2>/dev/null # PSI 接口
cat /proc/sys/net/ipv6/conf/all/disable_ipv6  # IPv6

# 2. 服务状态
systemctl status waydroid-container
pgrep -a dnsmasq | grep waydroid

# 3. 网络链路
ip link show waydroid0
sudo nft list ruleset | grep waydroid 2>/dev/null || sudo iptables -L -v | grep waydroid

# 4. 容器日志
sudo cat /var/lib/waydroid/lxc/waydroid/waydroid.log 2>/dev/null
journalctl -u waydroid-container -b --no-pager -l -n 50

# 5. Waydroid 日志
waydroid log

# 6. 持久化属性
waydroid prop get persist.waydroid.multi_windows
waydroid prop get persist.waydroid.fake_wifi
waydroid prop get persist.waydroid.fake_touch

将上述命令的输出整理后,可以快速定位 常见问题的具体层次。


总结#

Waydroid 的故障诊断遵循一个清晰的路径:

  1. 内核层:Binder 节点/权限 → 内核与资源压力 → 实际存储兼容性
  2. 容器层:LXC 版本 → systemd 服务 → 设备权限
  3. 网络层:waydroid0 → dnsmasq → IPv6 → 防火墙 FORWARD
  4. GPU 层:GBM → render node → 软件渲染回退 → NVIDIA 特殊处理
  5. 应用层:ARM 转译 → Play Protect → Root 检测 → DRM 限制

大多数问题在容器启动失败和无网络这两个环节即可定位。深入到 GPU 和应用兼容性层时,通常涉及 Waydroid 架构本身的限制,需要理性预期。


核对依据#

Waydroid 官方安装说明。

Waydroid 官方命令说明。

Waydroid 上游源码。

官方 Google 自认证流程。

官方属性文档。

Google Play Integrity 判定。

参考与延伸

  1. Waydroid 官方安装说明 ↗
  2. Waydroid 官方命令说明 ↗
  3. Waydroid 上游源码 ↗
  4. 官方 Google 自认证流程 ↗
  5. 官方属性文档 ↗
  6. Google Play Integrity 判定 ↗

根据技术笔记重新整理,示例使用通用名称。

沿专题继续阅读

Waydroid

  1. 01Waydroid 架构:LXC、Binder 与会话桥接
  2. 02Waydroid 安装与基础设置
  3. 03NixOS 中的 Waydroid 集成
  4. 04Waydroid 的 GPU 检测与硬件加速
  5. 05Waydroid 网桥、NAT 与安全边界
  6. 06Waydroid 属性、多窗口与 ARM 转译
  7. 07Waydroid 故障排查与 FAQ
  8. 08Waydroid 使用技巧:窗口、转译和共享目录
CONTINUE READING / 下一篇Waydroid 使用技巧:窗口、转译和共享目录

保留 Ivon 的使用技巧与操作细节,并注明历史版本和兼容性边界。