Files
DroidDeck/docs/openmali/README.md

245 lines
16 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# openMali 工作区记录
> 本文件记录 2026-10-31 ~ 2026-11-01 在本机与小米平板上的 MaliBridge + DroidDeck 0.6.7 合并、构建、调试和性能测试结果。
> 这是本地工程记录,不是上游发布文档。未特别说明的 APK 均为 testkey 签名。
## 1. 目标与结论
- 目标:把 MaliBridge v0.5.4.2 的 Mali GPU 支持合并进 DroidDeck 0.6.7 主线,构建可安装 APK,并在平板上进入桌面、跑通 Steam 和性能测试。
- 已做到:
- 0.6.7 + MaliBridge v0.5.4.2 的合并包可安装。
- Ubuntu rc4 运行时 + 内置最新 proot + KWin Zink/Mali 桥接,成功进入 KDE 桌面。
- Steam 客户端下载/更新 100% 完成,进入 Steam 大屏幕登录页(二维码/账号密码)。
- 完成 CPU、GPU、IO、内存、温度基线测试。
- 关键结论:Mali 桥接本身没有成为瓶颈;真正的问题集中在 **运行时 DNS、proot 与 KWin 渲染栈**。当前 rc4 + packaged proot + render-node 是已验证可用的组合。
## 2. 设备与环境
- 设备:Xiaomi M367FC,SoC xring_o3_asic,GPU Mali-G2-Ultra-NX MC16,Android 17,内核 6.18.21。
- CPU:10 核;内存 15.7 GB;存储 229 GB;屏幕 3408x2272;120 Hz。
- Mali 驱动:ARM proprietary,Vulkan 1.4.345;桥接暴露 1.4.341。
- 新 App:com.droiddeck.launcher,DroidDeck 0.6.7,versionCode 25(0.6.7-dnsfix-v25),testkey。
- 旧 App:com.droiddeck.launcher.mali,DroidDeck-MaliBridge v0.5.4.2,versionCode 5042;保留用于对比,桌面可用。
## 3. 关键路径
- 新工程:/home/g/openMali/DroidDeck
- MaliBridge 子模块:/home/g/openMali/DroidDeck/external/MaliBridge,v0.5.4.2,提交 95a1e60
- 合并基线:main 69ffc096,tag mali-0.6.7-v0.5.4.2
- 旧版源码:/home/g/openMali/reference/mali0542-src
- 旧版 APK:/home/g/openMali/reference/DroidDeck-MaliBridge-v0.5.4.2.apk
- 最终 APK:/home/g/openMali/output/DroidDeck-0.6.7-Mali-rc4.apk
- 基准/参考工具:/home/g/openMali/reference/vkbridge-bench,/home/g/openMali/reference/oldapk
## 4. 已验证的修改
### 4.1 运行时与 proot
- 运行时 catalog 从 Debian linuxfs.json(r9) 切到 Ubuntu:
- app/src/main/java/com/droiddeck/launcher/runtime/LinuxRuntimeInstaller.java
- CATALOG_URL = .../linuxfs-ubuntu.json
- 实际安装:ubuntu-r1-rc4;运行时约 3 GB;桌面栈另下载约 898 MB。
- APK 不再排除 proot,改为内置最新官方 pack:
- pack-proot-172bb48b00150b42
- 压缩包 SHA-256:172bb48b00150b4292ba171089abecdf7243c06edddd68bf42dddb8c5bb24e4e
- app/src/main/jniLibs/arm64-v8a/libproot.so(246,512 B)
- app/src/main/jniLibs/arm64-v8a/libproot-loader.so(18,136 B)
- app/build.gradle 移除 libproot.so / libproot-loader.so 的 excludes
- LinuxRuntime:
- 优先使用 nativeLibraryDir 中的 packaged proot/loader。
- 新增 PROOT_PACKAGED 来源;isInstalled 接受 packaged proot。
- prootSource 显示 packaged;ProotFastPath 只允许 PROOT_PACK,因此当前 fast path 关闭。
- 旧 r9 + 旧 session/helper/host 的 0.6.7 组合已尝试但放弃:
- KWin 曾能打开 3408x2272 窗口,但新 host 不显示、会话不稳定。
- 该路线不作为最终方案。
### 4.2 proot fast path 实验
- 临时允许 packaged proot 走 fast path,实测反而更慢:
- fast path off(当前):sha256 256 MB 207 ms,gzip -1 405 ms,read 3.9 GB/s。
- fast path on:sha256 259 ms,gzip 461 ms,read 3.8 GB/s。
- 结论:该 pack 的 fast path 对 CPU/IO 是负优化,已恢复默认关闭;源码 ProotFastPath 也恢复为只允许 PROOT_PACK。
### 4.3 桌面 / KWin / Mali 桥接
- tools/linuxfs/desktop/droiddeck-desktop 的 KWin OpenGL 分支:
- 设置 KWIN_COMPOSE=O2、MESA_LOADER_DRIVER_OVERRIDE=zink、GALLIUM_DRIVER=zink、LIBGL_KOPPER_DRI2=true。
- KWIN_RENDER_NODES 自动选择 /dev/dri/renderD0、/dev/dri/renderD307 或任意 /dev/dri/renderD*。
- 在平板上实际使用 /dev/dri/renderD307(由 /dev/mali0 绑定)。
- /usr/share/droiddeck/kwin-compositor 为 opengl。
- 效果:
- DroidDeckWayland 日志出现 [window] opened KDE Wayland Compositor 1280x720。
- host 统计出现 GPU frames,不再出现 kwin software fallback / black picture。
- KDE 桌面、任务栏、应用菜单正常。
- 分辨率:
- displayResolution.lxqt 设为 720p(1280x720)。
- 720p 与 900p 的 vkgears 都是约 119.8 FPS,说明 GPU 已到 120 Hz 上限;720p 只减少缩放/带宽。
- Steam 大屏幕模式:
- app 的“游玩 Steam”使用 gamescope/Big Picture。
- DroidDeckWayland 日志:Steam 大屏幕模式 1280x720,86.4 fps,875 GPU frames。
- 可用 Steam 登录页。
### 4.4 UI / 桥接文案
- GpuInfo 恢复 bridge-aware supportText(bridge),新增 gpuinfo_bridge / gpuinfo_bridge_off 字符串。
- DeviceInfo / DeviceReport / DriverMenus 使用当前 Mali 桥接状态显示支持文案。
- LinuxRuntime 恢复 bridgeStandIn 的 DRM render node 回退逻辑。
- 注意:Setup 顶部仍可能显示“GPU 不受支持”的旧标签(GpuDriversState 的 unsupported 标志),但下方已显示“实验性 Vulkan 桥接已开启”,桥接实际工作正常。
## 5. DNS 与 Steam
### 5.1 根因
- guest /etc/resolv.conf 被写成:
- 1.1.1.1
- 8.8.8.8
- 2001:4860:4860::8888
- 当前网络下这些公共 DNS 解析超时:
- curl: (28) Resolving timed out after 10001 milliseconds
- 设备实际 WiFi DNS 是 192.168.1.1;guest 改用该 DNS 后:
- getent 能解析 client-update.steamstatic.com。
- curl -I https://client-update.steamstatic.com/steam_client_linuxarm64 返回 200。
- 结论:Steam 下载失败是 DNS,不是 Steam/GPU/代理。
### 5.2 已修复:App 自动获取本地 DNS
- 修改 app/src/main/java/com/droiddeck/launcher/runtime/LinuxNetworkLinkComponent.kt:
- 新增 localDnsServers(),用 ConnectivityManager.allNetworks 遍历 WiFi/Ethernet 网络(排除 VPN)。
- 收集这些网络的 DNS,并把默认路由 gateway 作为本地 DNS 兜底。
- 私有地址(192.168/10.x)和 IPv4 优先。
- writeResolver 的顺序:当前 active network DNS + localDnsServers() + 公共 DNS 兜底。
- 验证(2026-11-01,dnsfix APK):
- logcat:LinuxNetworkLink: resolver: 192.168.1.1 8.8.8.8 1.1.1.1 2001:4860:4860::8888
- guest /etc/resolv.conf 第一行是 nameserver 192.168.1.1。
- getent hosts store.steampowered.com 正常;curl -I https://store.steampowered.com 返回 200。
- 旧 guest DNS 守护 /root/.config/plasma-workspace/env/01-dns-guard.sh 已删除;没有守护进程仍正常。
- 说明:localDnsServers() 只取 WiFi/Ethernet 的 DNS,网关排在各 DNS 之后;active network 是 VPN 时不追加本地 DNS,只用 VPN 自己的 DNS。
### 5.3 Steam 客户端修复
- Steam 主程序下载后权限为 666:
- /root/.local/share/Steam/steamrtarm64/steam
- 需 chmod +x;更新后变为 700 也可执行。
- 需要数据目录软链接:
- /root/.steam/steam -> /root/.local/share/Steam
- /root/.steam/root -> /root/.local/share/Steam
- stale pid:
- /root/.steam/steam.pid 可能残留已死 PID,导致 “Steam is already running”;启动前删除。
- 不要在 Konsole 里用桌面 UI 方式启动 steam:
- 会走 Xwayland/CEF,遇到 XRRGetOutputInfo() is not available / 无窗口。
- 应从 DroidDeck 的“游玩 Steam”启动 Big Picture/gamescope。
- 已验证(2026-11-01):
- Steam 客户端更新 575,927 KB 到 100%。
- Big Picture 已登录,库中显示 Shadow of the Tomb Raider 等游戏。
- 32 位 steamrtarm32/steam-runtime-launcher-service 缺失的日志仍会出现,但 Big Picture 可用;游戏启动尚未验证。
## 6. 性能测试
### 6.1 存储 IO
| 路径 | 写 | 读 |
|---|---:|---:|
| Android /data/local/tmp | 1.0 GB/s | 4.7 GB/s |
| Android /sdcard | 0.94 GB/s | 4.3 GB/s |
| Guest proot(fast path off) | 1.2 GB/s | 3.9 GB/s |
Guest 读取比 host 低约 17%,是 proot 路径开销;写入不慢。
### 6.2 CPU
| 项目 | Host | Guest |
|---|---:|---:|
| sha256 256 MB 单线程 | 267 ms | 207 ms |
| sha256 4x256 MB 4 线程 | 256 ms(约 4 GB/s 聚合) | 216 ms(约 4.7 GB/s 聚合) |
| gzip -1 256 MB | 307 ms | 405 ms(+32%) |
注意:host/guest 的 sha256 实现不同,不能直接比较;gzip 更接近,proot 下约慢 30%。
### 6.3 GPU
- vkgears:119.86 FPS(600 帧/5 秒),720p 与 900p 基本一致,已到 120 Hz 上限。
- 早期桥接基准:128 MiB copy 20.5 GB/s;空 submit 约 70 µs;4 KiB copy+submit 约 285 µs。
- Steam Big Picture:1280x720,约 86.4 fps,875 GPU frames。
- vkcube 在纹理路径触发断言(demo_prepare_texture_image),属于桥接兼容性问题,不是性能问题。
### 6.4 温度 / 内存
- CPU 29–33 °C,GPU 31–46.5 °C,Thermal Status 0,无节流。
- 电池约 28 °C,64%。
- 内存:15.7 GB 总,约 8.3 GB 已用,7.1 GB 可用,swap 约 2.6 GB。
- 没有内存告急,但 swap 偏高;游戏前可重启/关闭后台。
### 6.5 v25 复测(2026-11-01 18:32)
环境:DroidDeck v25;GPU/IO 在 lxqt 桌面 1920x1080@120 测,CPU 分别测桌面和 Steam 会话;游戏 FPS 取自 Terraria 世界内 HUD。Thermal Status 0,CPU 32.8 °C,GPU max 34.8–46.5 °C,电池 31.8 °C / 92%。
| 项目 | v25 实测 | 说明 |
|---|---:|---|
| sha256 256 MB 单线程 | 桌面 283–322 ms;Steam 219–241 ms | Steam 会话约 230 ms,接近此前 207 ms |
| gzip -1 256 MB | 桌面 514–534 ms;Steam 355–357 ms | Steam 会话约 356 ms;此前约 405 ms |
| sha256 4×256 MB | Steam 222–269 ms;桌面 262–275 ms | 4 线程 |
| Host /data/local/tmp O_DIRECT | 写 1060 / 读 1450 MB/s | 绕过 page cache |
| Guest /root ext4 | 写 876 / 读 2337 MB/s | fdatasync;O_DIRECT 写 1270 MB/s |
| Guest /root/Storage | 写 920 / 读 3029 MB/s | 读受 page cache 影响 |
| vkgears 1280x720 | 115.8 FPS,p50 111.1,p99 25 ms | 4 秒采样 |
| vkgears 1920x1080 | 113.2 FPS,p99 31 ms | 2 秒采样 |
| Terraria 1280x720@120 | 59.9 FPS,AVG 49.3,1% 22.7 | HUD;CPU 36% / 2668 MHz / 33 °C,GPU 1% |
| 内存 | 总 15.7 GB,可用 8.7 GB | Guest 已用 6.7 GB,swap 2.2 GB |
结论:GPU 与之前 119.86 FPS 基本一致(低约 3–4%),Terraria 稳定 60 FPS;IO 正常;测试期间无热节流。CPU 在 Steam 会话约 230 ms / 356 ms,接近或优于此前 207 ms / 405 ms;桌面会话因升频状态较低,v25 无 CPU 回归。
## 7. 构建与安装
- 构建:
- cd /home/g/openMali/DroidDeck
- ./gradlew :app:assembleRelease -PndkVersion=27.3.13750724
- 修改 runtime inputs 后先记录:
- python3 tools/release/runtime_inputs.py record
- APK(DNS 自动修复 + GPU 状态文案 + HUD/CPU 温度 + mscoree 兜底,当前安装):
- /home/g/openMali/output/DroidDeck-0.6.7-Mali-rc4-dnsfix-v25.apk
- 76 MB;versionCode 25;versionName 0.6.7-dnsfix-v25
- SHA-256 9808a8ab17f2d9a39e0b3abc9a05c2ee1c07ec7f4ac7cfa77866b2229fb6eb82
- 上一版保留:v24(SHA-256 56b0ab03c0120c2a7a6ad0e4ed8d30a748021d7fe9e99a13b60f62a41e13b5e0)、v23(SHA-256 b0fadc5c...)、v22(SHA-256 69cd4f5f...)、v21(SHA-256 508294a6...)、v20(SHA-256 afd1ce12...)、v19(SHA-256 f63f4eae...)、v18(SHA-256 cc469703...)、v16 DroidDeck-0.6.7-Mali-rc4-dnsfix.apk(SHA-256 6c5f8c1f...)和 DroidDeck-0.6.7-Mali-rc4.apk(无 App 内 DNS 修复,SHA-256 c58fcc58...)。
- testkey 签名;官方 release 私钥不在本机。
- MIUI 安装:
- 对已安装的旧包,adb push + adb shell pm install -r 可更新。
- 对全新安装,MIUI 会报 INSTALL_FAILED_USER_RESTRICTED;需用文件管理器打开 APK,走 PackageInstaller,并在“是否允许 Shell 安装应用”点允许。
- 官方 0.6.9 是 release key,testkey 包不能就地升级/降级;必须完整卸载,App 数据会被清空。
## 8. 当前安装状态
- com.droiddeck.launcher:0.6.7-dnsfix-v25(versionCode 25,testkey),2026-11-01 18:25 就地更新安装,App 数据保留。
- GPU 状态:Setup 概览显示“GPU 通过 Mali 桥接”,绿色通过;不再显示“GPU 不受支持”。实现为 FrontEndSetup 的 gpuOk 包含 s.vkBridge,并新增 setup_gpu_bridged 文案。
- 修复“清数据重启后 GPU 菜单消失”:showChecks 默认值从 false 改为 s.vkBridge;桥接开启时详情默认展开,GPU 行直接可见。已在 pm clear 后重新启动验证。
- HUD:XRing/Mali 的 GPU load/clock/temp/thermal sysfs 对普通 App 拒绝访问,日志为 thermal zones 0、gpu load none、kgsl gpubusy refused。v21 在无数据时隐藏 GPU 统计行、VRAM=0 时隐藏 VRAM,只保留 GPU 型号;真正 GPU% / 温度 / 共享显存需要 root 或厂商遥测。
- HUD 分辨率/卡死:v22 的 RES 不再用 Android displayMetrics 兜底,改用会话逻辑分辨率;桌面模式隐藏游戏 HUD,Steam/游戏模式显示。实测 Steam 下 HUD 为 RES 1280x720 @ 120Hz、FPS 42.8 / AVG 53.0。
- CPU 温度/频率:v23 增加 USB/adb 辅助的 CPU 温度输入(/sdcard/DroidDeck/cpu-temp,由开发者在主机侧每 2 秒写入 cpu_therm,仓库不附带该脚本);v24 把 HUD 的 CPU 行顺序改为“占用 → 频率 → 温度”,Full/Mega/Tiles 三种布局都生效。
- 安装方式:官方 0.6.9(release key)与 testkey 不兼容,完整卸载 0.6.9 后通过 PackageInstaller 安装;App 数据已被清空,当前是全新状态(首次启动显示配置页)。
- DNS 自动修复已在 APK 内;运行时 ubuntu-r1-rc4、Mali 桥接、proot、桌面需要重新下载/配置;此前 Steam Big Picture 和 1280x720 KWin 已验证,但当前新数据需重新登录。
- com.droiddeck.launcher.mali:旧 0.5.4.2 仍安装,桌面可用,用于对比。
- 注意:Steam chmod/软链接/pid 清理仍是 guest 运行时修改;清除 App 数据或重装运行时会丢失。
- Terraria 1.4.5.8 启动修复(2026-11-01):`dotnet40` 组件把 `WINEDLLOVERRIDES` 设为 `mscoree=n`,但该组件没有原生 `mscoree.dll`,Wine 报 `mscoree.dll not found` 后直接退出。v25 的 `droiddeck-wincomponents` 对 `mscoree=n` 自动追加 builtin 回退(`mscoree=n,b`);`dotnet40` 仍启用时,Terraria 已稳定进入世界并显示 HUD。
## 9. 已知问题 / 下一步
1. DNS 自动修复已完成(见 5.2);仍需在不同 WiFi/无 WiFi 环境下回归,确认 localDnsServers 的回退行为。
2. Steam 桌面 UI 在 Xwayland 下仍可能无窗口;继续使用“游玩 Steam”/Big Picture,不要用 Konsole 直接 steam。
3. Steam 32 位组件 steamrtarm32 / steam-runtime-launcher-service 缺失;Big Picture 可用。Terraria 1.4.5.8 已进入世界,其他游戏仍待验证。
4. vkcube 纹理断言是桥接兼容性 bug,可单独排查。
5. 真实游戏帧率/Proton/DXVK 尚未测试;当前性能数据主要是桌面、vkgears、IO/CPU。
6. 仍是 testkey;如需官方升级安装,需要官方 release keystore。
7. 官方 0.6.9 与 testkey 不兼容:只能完整卸载后安装,App 数据会丢;官方 APK 备份在 /tmp/installed-069.apk(宿主)和 /sdcard/Download/DroidDeck-0.6.9.apk(平板),回滚同样要先卸载。
8. HUD 的 Mali GPU load/temp/VRAM 受驱动 sysfs 权限限制;除非 root/厂商接口,普通 App 无法获取。v21 已移除误导性的 GPU - 和 VRAM 0.0,保留 GPU 型号。
## 10. 已放弃 / 不再使用
- r9 + 旧 session/helper/host 组合:KWin 窗口不稳定/黑屏,放弃。
- proot fast path:实测负优化,关闭。
- 代理强制给 Steam:本地 DNS 直连更稳定;Steam 更新器对 proxy 环境并不可靠。
## 截图
Terraria 1.4.5.8 在 DroidDeck v25 + Mali 桥接 + Wine Mono 下进入世界。HUD 的 CPU 行是“占用 → 频率 → 温度”:
![DroidDeck v25 HUD / Terraria](../images/droiddeck-hud-v25-terraria.png)