activitywatch-fix-report
ActivityWatch on Fedora 43 / KDE Plasma 6 Wayland — Fix Report
Date: 2026-04-30
Environment: Fedora 43, KDE Plasma 6, Wayland session, kwin 6.6.4
Install location: /home/edge/.local/share/activitywatch/ (官方 bundle 直接解壓)
TL;DR
ActivityWatch 在登入後並沒有「真正壞掉」——子模組 (aw-server, aw-watcher-window, aw-watcher-afk) 一直在背景記錄;但 tray 管理器 aw-qt 在 Wayland session 下啟動時 crash,所以工作列看不到圖示,也無法用 tray 選單控制服務。額外地,autostart 引用的 Icon=activitywatch 從未被安裝到 hicolor 主題,KDE 自動啟動面板裡的條目顯示空白圖示。
兩個問題都已修復,登出/登入後 tray 圖示會自動出現。
動了什麼
| Path | Change |
|---|---|
~/.local/share/icons/hicolor/512x512/apps/activitywatch.png |
create — 從 media/logo/logo.png (512×512) 複製 |
~/.local/share/icons/hicolor/128x128/apps/activitywatch.png |
create — 從 media/logo/logo-128.png 複製 |
~/.local/share/icons/hicolor/scalable/apps/activitywatch.svg |
create — 從 media/logo/logo.svg 複製 |
~/.local/share/icons/hicolor/icon-theme.cache |
regenerate — gtk-update-icon-cache -f -t |
~/.config/autostart/aw-qt.desktop |
modify — Exec= 前綴加 env QT_QPA_PLATFORM=xcb;Icon= 改為 freedesktop 名稱 activitywatch |
最終 autostart .desktop 內容:
1 | [Desktop Entry] |
診斷過程
1. 先排除「以為設過 systemctl」的記憶
~/.config/systemd/user/整個目錄不存在systemctl --user list-unit-files | grep activitywatch空/usr/lib/systemd/user/只有plasma-kactivitymanagerd.service(KDE 自家 kactivitymanagerd,名字相像但跟 ActivityWatch 無關,可能是這個導致記憶混淆)
→ 結論:systemd user unit 從未被裝起來,過去能跑是靠 XDG autostart。
2. autostart 機制本身正常
~/.config/autostart/aw-qt.desktop 存在,且 Exec= 已是絕對路徑。今天 10:10 的 log 顯示 aw-qt 確實有被登入時拉起來。所以 autostart 不是問題。
3. 子模組還在跑、但 aw-qt 自己不見了
1 | ps -ef | grep aw- |
這三個的 PPID = 2386,而 PID 2386 是 systemd --user——表示它們本來的父進程 (aw-qt) 死了,被 systemd 收養。子進程沒掛是因為 aw-qt 以 subprocess.Popen 啟動它們,並沒有在自身退出時 kill 掉它們。
4. 在前景重跑 aw-qt 抓到真正的錯誤
1 | $ /home/edge/.local/share/activitywatch/aw-qt |
找到了。 之前 log 永遠停在 Creating trayicon... 是因為 dynamic linker 在 trayicon 階段才 lazy-load Qt wayland plugin,符號解析失敗 → 進程被 kernel 直接幹掉,沒有機會寫任何錯誤到 log file。
5. 改用 XWayland 驗證假設
1 | $ env QT_QPA_PLATFORM=xcb /home/edge/.local/share/activitywatch/aw-qt |
成功。tray 圖示出現。
根本原因
問題 A — aw-qt 在 Wayland 下 crash
ActivityWatch bundle 內附 libQt6WaylandClient.so.6,這個 .so 引用 wl_proxy_marshal_flags 這個 symbol(屬於 libwayland-client,在 wayland 1.20 之後才加入)。
Bundle 內同時附了一份較舊的 libwayland-client.so.0,aw-qt 啟動時 LD_LIBRARY_PATH 把 bundle 目錄擺在最前,於是 Qt6WaylandClient 解析 wl_proxy_marshal_flags 時去 bundle 裡的舊 libwayland 找——找不到——symbol lookup error。
換句話說這是 bundle 內部的版本不一致 bug:打包者把新版 Qt wayland plugin 跟舊版 libwayland 放在一起。在 Wayland session(KDE Plasma 6、GNOME 都是)才會踩到,X11 session 不會,因為不會去 dlopen Qt wayland plugin。
為什麼 Windows 沒這問題? Windows 平台根本沒有 Qt wayland plugin,aw-qt 只走 Win32 native,不踩這條程式碼路徑。
修法: QT_QPA_PLATFORM=xcb 強制 Qt 走 XCB plugin(XWayland),跳過 wayland plugin 的載入。tray icon 走 StatusNotifierItem D-Bus protocol,KDE 對 XWayland 的 SNI 支援很好,視覺體驗跟 native Wayland 沒差。
問題 B — .desktop 圖示渲染不出來
KDE 自動啟動面板裡 ActivityWatch 條目的圖示空白。
之前 Icon= 雖然指了絕對路徑 /home/edge/.local/share/activitywatch/media/logo/logo.png,但 KDE Plasma 6 自動啟動面板不接受絕對路徑——它只查 freedesktop icon theme 的 name。Bundle 從未把 activitywatch 圖示安裝到 ~/.local/share/icons/hicolor/,所以查不到 → 顯示空白。
修法: 把 bundle media/logo/ 下的三種尺寸 (512×512 PNG, 128×128 PNG, scalable SVG) 安裝到對應的 hicolor 目錄,跑 gtk-update-icon-cache,並把 Icon= 改回 freedesktop name activitywatch。
解決辦法(最終做法)
1 | # 1. 安裝 hicolor 圖示 |
驗證
登出/登入後:
- Plasma 工作列 system tray 出現 ActivityWatch 圖示
- 點開 tray 選單能看到 Modules 列表(aw-server / aw-watcher-window / aw-watcher-afk 都 running)
- KDE「系統設定 → 啟動與關機 → 自動啟動」面板裡 ActivityWatch 條目有正確圖示
http://localhost:5600web UI 可訪問
後續建議
- bundle 升級時可重新測試 native Wayland:哪天上游打包修好 Qt wayland plugin 跟 libwayland 的版本錯位,可以拿掉
QT_QPA_PLATFORM=xcb。判斷方法:直接~/.local/share/activitywatch/aw-qt(不帶 env),看是否有Initialized aw-qt and trayicon successfully。 - 若想要 systemctl 化管理(重啟、status、journald log),可改成 systemd user service:建
~/.config/systemd/user/aw-qt.service,ExecStart=env QT_QPA_PLATFORM=xcb /home/edge/.local/share/activitywatch/aw-qt,PartOf=graphical-session.target,WantedBy=graphical-session.target,並把~/.config/autostart/aw-qt.desktop設Hidden=true避免雙重啟動。本次採用 XDG autostart 簡單方案,未動 systemd。 - 目前的 orphan 子進程:今天 10:10 起的 server/watcher 由 systemd 收養而非新 aw-qt,新的 aw-qt tray 選單裡的 Stop/Restart 控制不到那批。日常使用無影響(資料都進同一個 sqlite)。如果在意,重開機或手動
pkill -f 'aw-(server|watcher)'+ 重啟 aw-qt 即可重新接管。
參考檔案
- Crash log(保留樣本):
~/.cache/activitywatch/log/aw-qt/aw-qt_2026-04-30T11-37-26.log之後的前景輸出 - Bundle desktop template (上游原始):
/home/edge/.local/share/activitywatch/aw-qt.desktop - 修改後的 autostart:
~/.config/autostart/aw-qt.desktop