环境: Ubuntu 26.04 Resolute Raccoon,GNOME 50 Wayland session,kernel 7.0.0-15-generic,NVIDIA RTX Pro 6000 Blackwell Workstation Edition + AMD Ryzen 9 9950X(集成 Granite Ridge iGPU),
nvidia-driver-595-open,显示器 1.67x 分数缩放,167% scale。
本来只是想在工作站上装个全民 K 歌(选 Android 平板版界面大、伴奏库全)。一天下来试了主流的四种 Android-on-Linux 路径——AVD、Waydroid、scrcpy、Genymotion——全部失败,中间 5 次硬重启。问题不是任一工具写得烂,而是底下 NVIDIA Blackwell + Wayland 这条路目前整体不稳。这篇把各条路怎么死的、上游 bug 报告链接、以及最终能用的退路都记下来,避免后来人重蹈。
TL;DR
| 方案 | 失败模式 | 关键症状 |
|---|---|---|
| Android Studio AVD(独立 chrome) | Qt 工具栏按钮无反应 | 鼠标点击有动画但 sendKey 不触发,扩展控制变灰 |
| Waydroid | 启动后无任何窗口出现 | HWC hwcomposer.waydroid.so 在 hwc_wayland_thread() 主动 abort |
| scrcpy(USB/UHID/AOA) | 锁死内核两次 | 镜像窗口正常,运行几分钟整机失去响应,只能按 reset |
| Genymotion 3.10(自带 QEMU) | 黑屏 + 锁死内核一次 | Player 窗口出来但全黑,VM 内 audio 正常,几分钟后整机挂 |
共同根因:NVIDIA Blackwell 桌面 Linux 驱动栈 + Wayland 整套生态目前处在过渡期——开源内核模块(nvidia-open)+ 闭源用户态 EGL + 比较新的 kernel 7.0 + 分数缩放,任何持续运行 GPU 的桌面应用都可能踩到 NVIDIA 自己也承认的回归 bug。
避坑:真要跑 Android 的事直接用真手机或者云手机。本机这条路目前不可达。
路径 1:Android Studio AVD chrome 按钮失灵
正常装 SDK + cmdline-tools + sdkmanager + 创建 AVD 都顺利(KVM 用得上,Android 15 系统镜像 boot 也快),问题是 emulator 那个 Qt chrome 窗口出来后:
- 右侧工具栏的电源、音量、Home、Back 按钮鼠标点了有动画,但没任何效果
- 三个点弹出来的 Extended Controls 面板里项目全是灰的
- 触摸屏幕本身 OK,旋转按钮也 OK,只有"发 key event"那条路死掉
- 用
adb shell input keyevent KEYCODE_POWER直接发键能正常锁屏/亮屏
抓 verbose 日志能看到一行很关键的 warning:
The emulator now requires a signed jwt token for gRPC access!
Use the -grpc flag if you really want an open unprotected grpc port
emulator 36.5.x 强制 gRPC + JWT 鉴权,而 /run/user/$UID/avd/running/.../jwks/*/active.jwk 是空的 {"keys": []}——独立模式下没人写公钥进去,所以所有 UI→qemu 的 gRPC 调用都被拒签。但加 -grpc 8554 关掉鉴权后按钮还是不响应——说明独立 UI 的工具栏 button click 根本不走 gRPC,signal/slot 在 mutter Wayland 上根本没传到 slot。
事实匹配 GNOME mutter issue #3543 (“Android emulator not responding with popup dialog on Wayland session but works perfectly on X11 session”)和 Pop!_OS Cosmic #2830 (“Android Emulator shows gray screen and detached controls”)——这是 Wayland 合成器跟 Android emulator 的多窗口模型不兼容,toolbar 在 Wayland 下变成 detached top-level window,事件路由就断了。
ArchWiki 上 xfwm4 那条工作流(改 focus model 为 follow mouse)在 mutter 上没用——mutter 没那个开关。
试了 36.5.11 stable、36.6.10 beta、37.1.1 canary 全一样。唯一已知能修的姿势是登 X11 session。
路径 2:Waydroid 启动后无窗口
Ubuntu 26.04 codename resolute 在 Waydroid 官方仓库白名单里,装的是 1.6.2 + LXC 6:
curl https://repo.waydro.id # 写入 /etc/apt/sources.list.d/waydroid.list
sudo apt install waydroid
sudo waydroid init # 下 Lineage 20 (Android 13) system+vendor
sudo systemctl enable --now waydroid-container
waydroid session start
waydroid show-full-ui # 这里应该弹窗口,实际什么都不出
容器、session、binderfs、网络全 OK,adb 进 container 也通,但没有任何窗口。在 alt+tab 里也找不到。
挖 logcat 看到 SF 在喷:
HWComposer: presentAndGetReleaseFences: present failed for display 0: NoResources (6)
HwcComposer: executeCommands failed because of Status(EX_TRANSACTION_FAILED): 'DEAD_OBJECT'
getprop ro.hardware.gralloc = minigbm_gbm_mesa——Android side 用 minigbm 调 Mesa 的 libgbm 来分配显示 buffer。再看 tombstone:
backtrace:
#00 abort+191 (libc.so)
#01 hwc_wayland_thread(void*)+95 (/vendor/lib64/hw/hwcomposer.waydroid.so)
Waydroid 自己写的 HWC 在 wayland 线程里主动 abort。这是已知的"跨 GPU dmabuf 不互通"症状:
- AMD iGPU(
/dev/dri/renderD129)分配 dmabuf,通过 linux_dmabuf 协议给 mutter - mutter 跑在 NVIDIA EGL 上
- NVIDIA 闭源 EGL 无法导入 AMD 分配的 tiled dmabuf(modifier 不兼容),拒收
- hwc_wayland_thread 看 import 失败,断言 abort
minigbm 没有 gbm_nvidia 后端,Waydroid system.img 又把 gralloc HAL 编死成 minigbm_gbm_mesa,运行时不能改。理论上能救的 NVK + nouveau 桌面切换在 Blackwell 上还不成熟,等于死路。
更细的展开见 Waydroid 上游 issue tracker 里关于 NVIDIA proprietary driver 的若干长期 open 票。
路径 3:scrcpy 在 HyperOS 3 上的双重坑 + 锁机
apt install scrcpy 装 3.3.4,小米 17(HyperOS 3 中国 ROM,Android 16)开 USB 调试插上去,scrcpy 一启:镜像出来,音频通,但鼠标键盘任何操作都被吃掉。
直接 adb shell input keyevent 也能复现:
java.lang.SecurityException: Injecting input events requires the caller
(or the source of the instrumentation, if any) to have the INJECT_EVENTS permission.
HyperOS 在 InputManagerService 里把 ADB shell 的 INJECT_EVENTS 权限单独锁了,需要进开发者选项打开"USB 调试(安全设置)"。这条开关有几个隐含前提:
- 必须已登录小米账号
- 账号注册不满 7 天可能被冷却(国行 ROM)
- HyperOS 3 干掉了老 MIUI 的"MIUI 优化"那条总开关,目前没找到额外旁路
开了"USB 调试(安全设置)"+ 拔插重连后仍然 SecurityException——HyperOS 3 这条开关在中国 ROM 上行为还不一致。
scrcpy 有个不走 ADB 注入的 fallback:UHID(--keyboard=uhid --mouse=uhid),它通过 /dev/uhid 注册成虚拟 USB HID 给手机,手机当外接键鼠用,完全绕过 INJECT_EVENTS。shell uid 在 3011(uhid) 组里,这条路通。
输入工作了,但坐标偏移——1.67x 分数缩放下,scrcpy 走 SDL 在 XWayland 上拿到的窗口坐标和实际像素位置不一致,UHID 模式下绝对坐标翻译错乱。SDL_HINT_VIDEO_HIGHDPI_DISABLED=1 没用,换 --mouse=aoa 也没用——AOA 也是 SDL 拿坐标,同一层问题。
最致命的:尝试 SDL_VIDEODRIVER=wayland 让 SDL 走原生 Wayland(理论上能正确处理分数缩放)——整机锁死,必须按 reset 键。第二次试 --mouse=aoa 跑了两分钟,又锁死一次,又按 reset。
这个症状(scrcpy 一类 GL/视频解码窗口在 NVIDIA Wayland 上跑一会儿就锁机)在 NVIDIA 开发者论坛能搜到多份 ticket,见后面"根因"章节。
路径 4:Genymotion 3.10 自带 QEMU,黑屏 + 锁机
Genymotion Desktop 3.10 已经不依赖 VirtualBox,自带 QEMU 9.2 + 自己的 Qt5 player + KVM 加速。装好后选 Nexus 10 启动:
- Player 窗口出来,全黑屏
- 鼠标点中央有"咔"的点击音效(Android launcher 收到点击的反馈)
- 屏幕始终没画面
挖日志看到两个事:
第一,Genymotion 的 CPUID 解析在 Zen 5 上是坏的:
[VMTools] Chipset: "AuthenticAMD"
[VMTools] CPUID 0x80000001 (AMD): ECX= "7ed8320b"
[VMTools] VMX/SVM CPU availability: false
但实际系统侧 cpuid 工具直接读拿到的是 0x75c237ff(bit 2 = 1,SVM ✓),kvm-ok 也确认 KVM 可用,/proc/cpuinfo 里 svm flag 在。Genymotion 自己读 CPUID 拿到了一个不对的值——9950X(Zen 5)这一代 Genymotion 还没适配。
但这是性能问题(退到纯 CPU emulation 慢),不能解释黑屏——慢只会让画面更新慢,不会让画面完全不出。
第二,看 QEMU 的实际命令行:
-nographic -vga std
QEMU 起的时候用 -nographic(没有自己的显示后端),-vga std(给 VM 一个标准 VGA 设备)。Genymotion player 通过 QMP socket(-qmp tcp:localhost:23555)和 QEMU 通信,自己渲染 VM 屏幕。这条路在 NVIDIA Wayland 上画面通道断了——player 用 Qt OpenGL widget 显示帧,Qt5 在 NVIDIA Blackwell 闭源 EGL 上初始化 GL context 时静默失败,所以窗口黑。Audio 走的是独立的 PulseAudio 通道,跟显示无关,所以 click 音效照常。
跑大约几分钟后,整机又锁死一次,reset。
这时已经 reset 第 5 次。停手。
共同根因:NVIDIA Blackwell + Wayland 桌面驱动栈
四个工具的失败模式表面看完全不一样,挖到底都聚到同一组上游 bug。
nvidia-driver-595-open 强制——Blackwell 没闭源内核模块
老姿势 nvidia-driver-XXX(闭源内核模块).ko + 闭源用户态从 2022 年开始分裂:NVIDIA 把 GPU 大部分管理逻辑搬进 GPU 内部 GSP 协处理器(跑闭源签名固件),内核模块退化成"传消息给 GSP"的薄壳——这一壳就能开源了。
- Turing(RTX 20)及之前:GSP 是新硬件特性,闭源 .ko 仍是默认
- Turing 及之后:两个都能用,NVIDIA 推荐 open
- Blackwell(RTX 50 系 + Pro 4000/5000/6000 Blackwell,2024-2025):闭源 .ko 直接没编 Blackwell 支持
所以 Ubuntu 的 ubuntu-drivers list 在 Blackwell 卡上只显示 -open 一个选项,不是 Canonical 限制,是 NVIDIA 上游就不做了。
注意"open driver"开的是内核模块那一壳,用户态 libnvidia-egl-* / libnvidia-glcore / Vulkan / CUDA 这些 .so 依然全闭源——所以今天踩的所有 Wayland EGL 锁机,即使能装上闭源内核模块也救不了。
多份上游 ticket 验证今天的现象
NVIDIA 开发者论坛和 GitHub 上的相关 issue,都是和今天一样的 Blackwell + Wayland + 长跑 GPU 任务锁机:
- RTX PRO 6000 Blackwell Card Crash:工作站卡运行游戏 → Wayland compositor 失去响应,音频继续,必须硬重启。逐字描述跟今天 scrcpy/Genymotion 锁机一样。
- Fedora 43 RTX PRO 6000 Blackwell GPU Crashes + Black Screen:Fedora 用户跑 vLLM、看 YouTube → GPU 锁、黑屏。
- Regression: nvidia-modeset Kernel Panic & kwin_wayland Crash on 5060 Ti (Blackwell):消费级 5060 Ti 在 Wayland + 高 VRAM 也是 nvidia-modeset kernel panic。
- NVIDIA/open-gpu-kernel-modules #1117:“RTX 50-series (Blackwell): s2idle resume hangs on Linux 7.0 kernel; same driver works on 6.17"——同一个驱动版本(580.142、595.58.03)在 kernel 7.0 上 hang,6.17 上不 hang。这台机器内核就是 7.0.0-15。
- NVIDIA 官方文档已知问题:Wayland sessions on RHEL 10 with Blackwell-architecture GPUs are corrupted and unusable——NVIDIA 自己写"corrupted and unusable”。
也就是说:Blackwell 桌面 Linux 整个状态今天就是这个样子,跟 Ubuntu/Fedora/RHEL 哪个 distro 关系不大,跟具体型号(5060 Ti / 5090 / Pro 6000)关系不大,核心是 nvidia-open + Wayland + 长 GPU 任务这个组合现在不稳。
可行的避坑路径
按改动成本从小到大:
| 路径 | 改动 | 效果 |
|---|---|---|
| 接受现状,需要时切 X11 session | GDM 齿轮 → “Ubuntu on Xorg” | mutter 路由问题、Wayland EGL 锁机全绕开;代价:X11 上分数缩放是 global,体验差一档 |
| 降内核到 6.17 | apt 装 linux-generic-6.17 或 HWE 锁版 | 至少修掉 GitHub #1117 那条 s2idle/runtime hang |
| 桌面避免长跑 GPU 应用 | 不开 Android 模拟器/游戏/视频解码窗 | 短期 workaround,你已经在做 |
| 等驱动迭代 | NVIDIA 600/610 + Mesa 27+ | 估计 6-12 个月,参考 Ada 成熟周期 |
| 换硬件 | 桌面工作站换 AMD/Intel 集显主显 | 终极方案,Blackwell 留做计算加速卡 |
**对今天最初的需求(跑全民 K 歌)**最实在:
- 直接用真手机原生屏唱——这才是 app 设计场景
- 云手机服务(红手指 / 多多云 / 网易 UU 云手机)——浏览器开 tab 就用,跟本地图形栈零接触,~25-50 元/月
- 投屏到电视/外接显示器,信号不经过 Linux 桌面
后续
NVIDIA Blackwell 在桌面 Linux 上的成熟,业内估计还要 6-12 个月——参考 Ada(RTX 40,2022)从首发到 Wayland 稳定也走了一年半。短期内这台机器的定位明确:
- CUDA 算力工作:旗舰级,毫无问题,这才是它的主战场
- Wayland 桌面 + 持续 GPU 应用:踩雷概率高,关键场景切 X11
- 本地 Android 模拟:目前不可达,等 NVIDIA 修或换硬件
这一天主要的收获是把上面这张表搞清楚——以后类似需求来,直接看一眼就知道走哪条路、不要在哪条路上浪费时间。