[Internal testing communication] DEEPIN v25 KeePassXC.AppImag 最新版无法输入中文的修复方法
Tofloor
poster avatar
深圳市耀影科技有限公司
deepin
2026-09-18 22:14
Author

截图_选择区域_20260918221111.png

图片.png

keepassxc 2.7.12 此方式目前可行

keepassxc-fix-tools.zip

  • 使用说明
/home/user/Downloads/keepassxc-fix-tools/fix-keepassxc-appimage.sh
/home/user/Downloads/KeePassXC.AppImage /home/user/Downloads/KeePassXC-fixed.AppImage

- 修复日记_双语.md

KeePassXC 中文输入修复日记 / Fix Diary (Bilingual 双语)

日期 / Date: 2026-09-18
系统 / OS: Deepin (Debian-based), fcitx5 5.1.12
软件 / Software: KeePassXC 2.7.12 (AppImage)


一、问题现象 / Problem

在 Deepin 系统中运行 KeePassXC AppImage 后,无法输入中文(拼音候选框不出现)。
Running the KeePassXC AppImage on Deepin, Chinese input does not work (no pinyin candidate window).


二、原因分析 / Root Cause

AppImage 捆绑了独立的 Qt 5.12 运行库(usr/lib/),不依赖系统 Qt。
The AppImage bundles its own Qt 5.12 libraries (usr/lib/) and does not use the system Qt.

  1. AppImage 内部的 usr/plugins/platforminputcontexts/ 目录缺少 fcitx5 输入法插件,
    只有 ibus/compose 插件 → 无法与系统 fcitx5 建立输入法连接。
    The AppImage's platforminputcontexts/ directory lacks the fcitx5 plugin
    (only ibus/compose present) → cannot connect to the system fcitx5.
  2. 即使把系统 fcitx5 插件复制进去,捆绑的 Qt 5.12 与系统 Qt 5.15 存在
    运行时兼容问题(插件能加载但输入被绕过)。
    Even after copying the fcitx5 plugin in, the bundled Qt 5.12 is incompatible
    with the system Qt 5.15-built plugin (loads but input is bypassed).

结论 / Conclusion: 需要让 AppImage 使用系统 Qt 5.15 运行。
The AppImage must use the system Qt 5.15 at runtime.


三、修复步骤 / Fix Steps

1. 复制 fcitx5 插件进 AppImage(后备)/ Copy fcitx5 plugin (fallback)

/usr/lib/x86_64-linux-gnu/qt5/plugins/platforminputcontexts/libfcitx5platforminputcontextplugin.so
→ /usr/plugins/platforminputcontexts/

2. 复制依赖库 / Copy dependency libraries

libFcitx5Qt5DBusAddons.so.1 → /usr/lib/
libFcitx5Qt5DBusAddons.so.5.1.9 → /usr/lib/

3. 修改启动脚本 AppRun.wrapped / Modify AppRun.wrapped

# 系统Qt库优先 / Prefer system Qt libraries
export LD_LIBRARY_PATH="/usr/lib/x86_64-linux-gnu:${LD_LIBRARY_PATH}"
# 使用系统Qt插件(含fcitx5输入法插件) / Use system Qt plugins (incl. fcitx5)
export QT_PLUGIN_PATH="/usr/lib/x86_64-linux-gnu/qt5/plugins"
# 指定输入法 / Set input method
export QT_IM_MODULE="fcitx"
export GTK_IM_MODULE="fcitx"
export XMODIFIERS="@im=fcitx"
# 使用xcb平台(避免dxcb导致图标偏大) / Use xcb platform
export QT_QPA_PLATFORM=xcb

4. 重新打包 / Repack

  • 用 grep -abo "hsqs" 定位 squashfs 偏移,dd 提取运行时 (runtime)
  • mksquashfs(gzip/128K)重建镜像
  • 拼接 runtime + squashfs → 新 AppImage
  • Locate squashfs offset via hsqs magic, extract runtime with dd,
    rebuild with mksquashfs (gzip/128K), concatenate runtime + squashfs.

四、验证结果 / Verification

测试 Test 结果 Result
fcitx5 连接状态 / fcitx5 status 2 (激活/active), pinyin ✅
拼音 ceshi + 空格 → 剪贴板 / clipboard '测试' ✅ 中文正常上屏
应用启动/解锁 / Launch & unlock 正常 ✅
界面显示 / UI display 正常,无乱码 ✅

五、文件清单 / File List

文件 File SHA256
KeePassXC_2.7.12.AppImage(修复后/Fixed) 02c44ee6d927f39933ebca79db73f10efe368fc933f7af8cba6b2fc9991066d7
KeePassXC_2.7.12.AppImage.bak(原版/Original) 564fe8b751b9ef7aa057e4d3d0b2878db24eaa0f6b1c855c82e699ab0913ae49

六、升级修复脚本 / Upgrade Fix Script

以后升级 KeePassXC 后,用脚本一键修复(One-command fix after upgrading):

# 用法 / Usage
/home/user/Downloads/keepassxc-fix-tools/fix-keepassxc-appimage.sh \
    KeePassXC-新版本.AppImage KeePassXC-新版本-fixed.AppImage

# 示例 / Example
/home/user/Downloads/keepassxc-fix-tools/fix-keepassxc-appimage.sh \
    /home/user/Downloads/KeePassXC_2.7.12.AppImage.bak \
    /home/user/Downloads/KeePassXC-fixed.AppImage

脚本会自动完成: 解包 → 复制fcitx5插件/依赖 → 修改AppRun.wrapped → 重新打包。
The script automates: extract → copy fcitx5 plugin/deps → modify AppRun.wrapped → repack.

前提 / Prerequisites:

  • 系统已安装 fcitx5 及 fcitx5-frontend-qt5 (Deepin 默认自带)
  • 系统有 squashfs-tools (mksquashfs)

七、备注 / Notes

  • 若系统输入法不是 fcitx5(如 ibus),修改脚本中 QT_IM_MODULE 即可。
    If the input method is not fcitx5 (e.g. ibus), change QT_IM_MODULE in the script.

  • 本修复仅解决中文输入;界面图标大小等外观问题不在本脚本范围内。
    This fix only addresses Chinese input; UI appearance issues are out of scope.

  • fix-keepassxc-appimage.sh

#!/usr/bin/env bash
# =============================================================================
# KeePassXC AppImage 中文输入修复脚本 (Chinese Input Fix Script)
# -----------------------------------------------------------------------------
# 用途: 修复 KeePassXC AppImage 无法使用 fcitx5 输入中文的问题
#       Fix the issue that KeePassXC AppImage cannot input Chinese via fcitx5.
#
# 原理 (Principle):
#   AppImage 捆绑了独立的 Qt 5.12, 不含 fcitx5 输入法插件, 且插件版本不兼容。
#   修复方式: 让 AppImage 改用系统 Qt 5.15 (fcitx5 完全兼容):
#     1. 复制系统 fcitx5 Qt5 插件进 AppImage (后备)
#     2. 修改启动脚本 AppRun.wrapped:
#        - LD_LIBRARY_PATH 优先系统 Qt 库
#        - QT_PLUGIN_PATH 指向系统 Qt 插件目录(含 fcitx5 插件)
#        - 设置 QT_IM_MODULE=fcitx 等环境变量
#        - 使用 xcb 平台插件(避免 dxcb 导致图标偏大)
#     3. 重新打包 AppImage
#
# 用法 (Usage):
#   ./fix-keepassxc-appimage.sh <原始AppImage路径> [输出AppImage路径]
#   Example:
#   ./fix-keepassxc-appimage.sh KeePassXC-2.7.12.AppImage KeePassXC-fixed.AppImage
# =============================================================================
set -e

# ---------- 参数 ----------
INPUT="${1:?用法: $0 <原始AppImage路径> [输出路径]}"
OUTPUT="${2:-${INPUT%.AppImage}-fixed.AppImage}"

# 解析为绝对路径 (脚本内部会切换工作目录)
INPUT="$(readlink -f "$INPUT")"
OUTPUT="$(readlink -f "$OUTPUT")"
# ---------- 检查依赖 ----------
command -v mksquashfs >/dev/null || { echo "错误: 缺少 mksquashfs (请安装 squashfs-tools)"; exit 1; }
[ -f "$INPUT" ] || { echo "错误: 文件不存在: $INPUT"; exit 1; }
[ -x "$INPUT" ] || chmod +x "$INPUT" || true

# 系统 fcitx5 组件 (Deepin/Debian)
FCITX_PLUGIN="/usr/lib/x86_64-linux-gnu/qt5/plugins/platforminputcontexts/libfcitx5platforminputcontextplugin.so"
FCITX_DBUS_LIB="/usr/lib/x86_64-linux-gnu/libFcitx5Qt5DBusAddons.so.1"
FCITX_DBUS_LIB_REAL="/usr/lib/x86_64-linux-gnu/libFcitx5Qt5DBusAddons.so.5.1.9"

[ -f "$FCITX_PLUGIN" ] || { echo "错误: 未找到系统 fcitx5 Qt5 插件: $FCITX_PLUGIN"; exit 1; }

echo "==> 输入: $INPUT"
echo "==> 输出: $OUTPUT"

# ---------- 解包 ----------
WORK="$(mktemp -d /tmp/kpxc-fix-XXXXXX)"
trap 'rm -rf "$WORK"' EXIT
echo "==> 解包 AppImage ..."
( cd "$WORK" && "$INPUT" --appimage-extract >/dev/null 2>&1 )
[ -d "$WORK/squashfs-root" ] || { echo "错误: 解包失败"; exit 1; }

# ---------- 检查是否已修复 ----------
if grep -q "QT_IM_MODULE" "$WORK/squashfs-root/AppRun.wrapped" 2>/dev/null; then
    echo "提示: 该 AppImage 似乎已修复过 (AppRun.wrapped 已含输入法设置)"
fi

# ---------- 复制 fcitx5 插件与依赖 ----------
echo "==> 复制 fcitx5 插件 ..."
mkdir -p "$WORK/squashfs-root/usr/plugins/platforminputcontexts"
cp "$FCITX_PLUGIN" "$WORK/squashfs-root/usr/plugins/platforminputcontexts/"
if [ -f "$FCITX_DBUS_LIB" ]; then
    cp -a "$FCITX_DBUS_LIB" "$WORK/squashfs-root/usr/lib/"
fi
if [ -f "$FCITX_DBUS_LIB_REAL" ]; then
    cp -a "$FCITX_DBUS_LIB_REAL" "$WORK/squashfs-root/usr/lib/"
fi

# ---------- 修改启动脚本 ----------
echo "==> 修改 AppRun.wrapped ..."
ARW="$WORK/squashfs-root/AppRun.wrapped"
# 备份原脚本
cp "$ARW" "$ARW.orig"
cat > "$ARW" << 'EOF'
#!/usr/bin/env bash

# ===== KeePassXC 中文输入修复: 使用系统 Qt 5.15 (fcitx5 兼容) =====
# 系统Qt库目录优先于AppImage捆绑的Qt 5.12, 使fcitx5输入法插件正常工作
export LD_LIBRARY_PATH="/usr/lib/x86_64-linux-gnu:${LD_LIBRARY_PATH}"
# 使用系统的Qt平台插件(含fcitx5输入法插件)
export QT_PLUGIN_PATH="/usr/lib/x86_64-linux-gnu/qt5/plugins"
# 指定输入法模块为fcitx(fcitx5)
export QT_IM_MODULE="fcitx"
export GTK_IM_MODULE="fcitx"
export XMODIFIERS="@im=fcitx"
# 使用xcb平台插件(避免dxcb导致树/条目图标偏大), 中文输入不受影响
export QT_QPA_PLATFORM=xcb

export PATH="$(dirname $0)/usr/bin:${PATH}"

if [ "$1" == "cli" ] || [ "$(basename "$ARGV0")" == "keepassxc-cli" ] || [ "$(basename "$ARGV0")" == "keepassxc-cli.AppImage" ]; then
    [ "$1" == "cli" ] && shift
    exec keepassxc-cli "$@"
elif  [ "$1" == "proxy" ] || [ "$(basename "$ARGV0")" == "keepassxc-proxy" ] || [ "$(basename "$ARGV0")" == "keepassxc-proxy.AppImage" ]; then
    [ "$1" == "proxy" ] && shift
    exec keepassxc-proxy "$@"
elif [ -v CHROME_WRAPPER ] || [ -v MOZ_LAUNCHED_CHILD ] || [ "$2" == "keepassxc-browser@keepassxc.org" ]; then
    exec keepassxc-proxy "$@"
else
    exec keepassxc "$@"
fi
EOF
chmod +x "$ARW"

# ---------- 重新打包 ----------
echo "==> 查找 squashfs 偏移 ..."
OFFSET=$(grep -abo "hsqs" "$INPUT" | tail -1 | cut -d: -f1)
[ -n "$OFFSET" ] || { echo "错误: 无法定位 squashfs (非标准 AppImage?)"; exit 1; }
echo "    squashfs 偏移: $OFFSET"

echo "==> 提取运行时 (runtime) ..."
dd if="$INPUT" of="$WORK/runtime" bs=1 count="$OFFSET" status=none

echo "==> 重建 squashfs (gzip, 128K) ..."
mksquashfs "$WORK/squashfs-root" "$WORK/new.squashfs" -noappend -comp gzip -b 131072 -no-xattrs >/dev/null 2>&1

echo "==> 拼接生成新 AppImage ..."
cat "$WORK/runtime" "$WORK/new.squashfs" > "$OUTPUT"
chmod +x "$OUTPUT"

echo ""
echo "=================================================="
echo "  修复完成 (Done)!"
echo "  输出: $OUTPUT"
echo "  SHA256: $(sha256sum "$OUTPUT" | awk '{print $1}')"
echo "=================================================="
echo "  提示: 如系统输入法不是 fcitx5, 请按需修改脚本中的 QT_IM_MODULE"

  • xclip_read.py
  • import ctypes, time, sys
    from ctypes import *
    x11 = CDLL("libX11.so.6")
    Display = c_void_p; Window = c_ulong; Atom = c_ulong; Time = c_ulong
    x11.XOpenDisplay.restype = Display
    x11.XOpenDisplay.argtypes = [c_char_p]
    x11.XInternAtom.restype = Atom
    x11.XInternAtom.argtypes = [Display, c_char_p, c_int]
    x11.XDefaultRootWindow.restype = Window
    x11.XDefaultRootWindow.argtypes = [Display]
    x11.XCreateSimpleWindow.restype = Window
    x11.XCreateSimpleWindow.argtypes = [Display, Window, c_int, c_int, c_uint, c_uint, c_uint, c_ulong, c_ulong]
    x11.XSelectInput.argtypes = [Display, Window, c_long]
    x11.XConvertSelection.argtypes = [Display, Atom, Atom, Atom, Window, Time]
    x11.XFlush.argtypes = [Display]
    x11.XPending.restype = c_int; x11.XPending.argtypes = [Display]
    x11.XNextEvent.argtypes = [Display, c_void_p]
    x11.XGetWindowProperty.restype = c_int
    x11.XGetWindowProperty.argtypes = [Display, Window, Atom, c_long, c_long, c_int, Atom, POINTER(Atom), POINTER(c_int), POINTER(c_ulong), POINTER(c_ulong), POINTER(POINTER(c_ubyte))]
    x11.XFree.argtypes = [c_void_p]
    x11.XCloseDisplay.argtypes = [Display]
    d = x11.XOpenDisplay(None)
    if not d: print("ERROR: cannot open display"); sys.exit(1)
    CLIPBOARD = x11.XInternAtom(d, b"CLIPBOARD", 0)
    UTF8 = x11.XInternAtom(d, b"UTF8_STRING", 0)
    XSEL = x11.XInternAtom(d, b"XSEL_DATA", 0)
    root = x11.XDefaultRootWindow(d)
    win = x11.XCreateSimpleWindow(d, root, -10, -10, 1, 1, 0, 0, 0)
    x11.XSelectInput(d, win, 1 << 22)
    x11.XConvertSelection(d, CLIPBOARD, UTF8, XSEL, win, 0)
    x11.XFlush(d)
    data = b""; got = False
    t0 = time.time()
    while time.time() - t0 < 6 and not got:
        while x11.XPending(d):
            buf = (c_ubyte * 192)()
            x11.XNextEvent(d, buf)
            evtype = int.from_bytes(bytes(buf[:4]), 'little')
            if evtype == 31:
                tr = Atom(); fm = c_int(); ni = c_ulong(); ba = c_ulong(); prop = POINTER(c_ubyte)()
                if x11.XGetWindowProperty(d, win, XSEL, 0, 1048576, 0, 0, byref(tr), byref(fm), byref(ni), byref(ba), byref(prop)) == 0 and ni.value > 0:
                    data = bytes(prop[:ni.value]); x11.XFree(prop)
                got = True
        time.sleep(0.05)
    x11.XCloseDisplay(d)
    try:
        text = data.decode("utf-8")
        print("剪贴板内容:", repr(text))
        if any('\u4e00' <= ch <= '\u9fff' for ch in text):
            print(">>> 结论: 含中文 => 中文输入【成功】!")
        else:
            print(">>> 结论: 无中文字符")
    except Exception as e:
        print("解码失败:", e)
    
    

附件内有以下文件,
图片.png

Reply Favorite View the author
All Replies
avatar
深圳市耀影科技有限公司
deepin
2026-09-18 22:14
#1

缺点就是: 数据列表的行高比较高,这个期待大佬修复

Reply View the author
avatar
red13
deepin
2026-09-19 03:55
#2

都折腾成这样了,拿原码配套Qt5.15.2 自己编译一下呢?又花不了多少时间。。。

先上图

image.png

image.png

image.png

来,咱们自己动手,把饭喂嘴里了啊~~

一、AppImage 构造与打包工具

构造工具两个:
地址:https://github.com/linuxdeploy/linuxdeploy
名称:linuxdeploy-x86_64.AppImage
作用:生成AppImage包的结构
地址:https://github.com/linuxdeploy/linuxdeploy-plugin-qt
名称:linuxdeploy-plugin-qt-x86_64.AppImage
作用:自动提取相关Qt依赖,两个工具放一起都别改名。

打包工具一个:
地址:https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage
名称:appimagetool-x86_64.AppImage
作用:因为要整合输入法插件进去,所以不能在生成包结构的时候直接生成包,得分两步走。

二:系统环境

sudo apt install build-essential cmake ninja-build libgl1-mesa-dev libglib2.0-dev libfontconfig1-dev libfreetype6-dev libx11-dev libxext-dev libxfixes-dev libxi-dev libxrandr-dev libxrender-dev libxcursor-dev libxkbcommon-dev libxkbcommon-x11-0 libdbus-1-dev libssl-dev python3.12-venv python3-pip

1.创建虚拟环境目录

mkdir -p ~/qt-aqt
python3 -m venv ~/qt-aqt/venv

  1. 激活虚拟环境

source ~/qt-aqt/venv/bin/activate

  1. 在虚拟环境中安装 aqtinstall(可加 阿里云 源加速)

pip install aqtinstall -i https://mirrors.aliyun.com/pypi/simple/

三:下载 Qt5.15.2 你要相信阿里云的速度,虚拟机中下载110秒就全下载回来了
aqt install-qt --base https://mirrors.aliyun.com/qt linux desktop 5.15.2 gcc_64 --outputdir /home/{用户名}/Qt

四:创建文件夹
#放源码
mkdir -p /home/{用户名}/000.develop/src
#放结果
mkdir -p /home/{用户名}/000.develop/appimage/keepassxc/usr

五:处理编译源码
cd /home/{用户名}/000.develop/src

#下载 keepassxc 源码(用git或直接去官网下源码回来)
keepassxc-2.7.12-src.tar.xz

#解压
tar -xvf keepassxc-2.7.12-src.tar.xz

六:编译
cd keepassxc-2.7.12
mkdir build && cd build

#编译并安装 KeePassXC ,去掉说明文当部分
cmake -G Ninja -DCMAKE_PREFIX_PATH=/home/{用户名}/Qt/5.15.2/gcc_64 -DCMAKE_INSTALL_PREFIX=/home/{用户名}/000.develop/appimage/keepassxc/usr -DWITH_XC_YUBIKEY=ON -DWITH_XC_BROWSER=ON -DWITH_XC_AUTOTYPE=ON -DWITH_XC_SHARE=ON -DWITH_XC_DOCS=OFF -DBUILD_TESTING=OFF ../
ninja
ninja install

七:整理应用并打包
#转路径去收获成果
cd ../appimage

#部署应用
./linuxdeploy-x86_64.AppImage
--appdir AppDir
--plugin qt
--executable /home/{用户名}/000.develop/appimage/keepassxc/usr/bin/keepassxc
--icon-file /home/{用户名}/000.develop/appimage/keepassxc/usr/share/icons/hicolor/256x256/apps/keepassxc.png
--desktop-file /home/{用户名}/000.develop/appimage/keepassxc/usr/share/applications/org.keepassxc.KeePassXC.desktop

#复制系统的输入法插件
cp /usr/lib/x86_64-linux-gnu/qt5/plugins/platforminputcontexts/libfcitx5platforminputcontextplugin.so ./AppDir/usr/plugins/platforminputcontexts/

#创建语言语种文件夹
mkdir -p ./AppDir/usr/share/keepassxc/translations
#复制Qt中文
cp /home/{用户名}/Qt/5.15.2/gcc_64/translations/qt_zh_CN.qm ./AppDir/usr/translations
#复制应用语言
cp ~/000.develop/appimage/keepassxc/usr/share/keepassxc/translations/keepassxc_* ./AppDir/usr/share/keepassxc/translations

#打包
./appimagetool-x86_64.AppImage AppDir KeePassXC-v2.7.12-fcitx5-x86_64.AppImage

Reply View the author
avatar
深圳市耀影科技有限公司
deepin
2026-09-19 18:39
#3

KeePassXC 2.7.12 AppImage 构建指南(Deepin 25)

在 Deepin 25(v25.2.2,x86_64)系统上,从源码编译 KeePassXC 2.7.12 并打包为
集成 fcitx5 输入法插件的 AppImage,可直接拷贝到其他 Linux 机器运行。


一、构建环境

本指南已在本机(Deepin 25 社区版 / 内核 6.18.48 / Python 3.12.13)完整验证通过。

项目 要求
系统 Deepin 25(v25.2.2,x86_64)或同源 Debian 系
权限 可用的 sudo 账户
磁盘 预留 5GB 以上(Qt 约 2.5GB、编译产物约 1GB)
网络 可访问 deepin 源、阿里云镜像;GitHub 视网络情况可能需要代理

目录规划

~/000.develop/
├── appimage/                      # 工具与成果目录
│   ├── linuxdeploy-x86_64.AppImage
│   ├── linuxdeploy-plugin-qt-x86_64.AppImage
│   ├── appimagetool-x86_64.AppImage
│   ├── keepassxc/usr/             # 编译安装前缀
│   ├── AppDir/                    # 临时包结构
│   └── KeePassXC-v2.7.12-fcitx5-x86_64.AppImage   # 最终产物
└── src/
    └── keepassxc-2.7.12/          # 源码与 build 目录
~/Qt/5.15.2/gcc_64/                # aqt 安装的 Qt
~/qt-aqt/venv/                     # aqtinstall 虚拟环境

二、安装系统编译依赖

KeePassXC 2.7.12 的编译依赖可分为三类:基础工具链、Qt/X11 开发库、加密与功能库。

sudo apt update
sudo apt install -y build-essential cmake ninja-build \
libgl1-mesa-dev libglib2.0-dev libfontconfig1-dev libfreetype-dev \
libx11-dev libxext-dev libxfixes-dev libxi-dev libxrandr-dev \
libxrender-dev libxcursor-dev libxkbcommon-dev libxkbcommon-x11-0 \
libdbus-1-dev libssl-dev python3.12-venv python3-pip \
libxtst-dev libbotan-2-dev libminizip-dev libargon2-dev \
libpcsclite-dev libusb-1.0-0-dev libyubikey-dev libykpers-1-dev \
libqrencode-dev

各依赖用途简表:

软件包 用途
build-essential / cmake / ninja-build 编译工具链(gcc/g++、CMake ≥3.16、Ninja ≥1.10)
Qt 5.15.2(见第四节) Core/Gui/Widgets/Svg/Network/DBus/X11Extras 等模块
libbotan-2-dev 密码学后端(2.7 起 KeePassXC 使用 Botan)
libargon2-dev Argon2 密钥派生(数据库加密核心算法)
libminizip-dev 压缩与 KDBX 归档支持
libxtst-dev / libxi-dev Auto-Type 自动输入(XTest 协议)
libpcsclite-dev / libusb-1.0-0-dev YubiKey 智能卡通信
libyubikey-dev / libykpers-1-dev YubiKey 一次性密码
libqrencode-dev 二维码生成(TOTP/分享)
libx11-dev 等 X11 系列 图形界面 X11 开发头文件
libssl-dev / libdbus-1-dev TLS 加密 / D-Bus 通信
python3.12-venv / python3-pip 运行 aqtinstall 工具

提示:Deepin 25 中 freetype 开发包名为 libfreetype-dev;argon2 包名为 libargon2-dev,
与旧版 Debian 的命名不同,请以上面清单为准。


三、下载 AppImage 构建工具

需要三个工具,全部放入 ~/000.develop/appimage/ 目录并保持原名(linuxdeploy 的
qt 插件依赖文件名与同目录关系被自动识别):

mkdir -p ~/000.develop/appimage && cd ~/000.develop/appimage

wget -O linuxdeploy-x86_64.AppImage \
  https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage

wget -O linuxdeploy-plugin-qt-x86_64.AppImage \
  https://github.com/linuxdeploy/linuxdeploy-plugin-qt/releases/download/continuous/linuxdeploy-plugin-qt-x86_64.AppImage

wget -O appimagetool-x86_64.AppImage \
  https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage

chmod +x ./*.AppImage

三个工具的分工:

  • linuxdeploy:解析可执行文件的动态库依赖,生成 AppImage 包结构(AppDir)
  • linuxdeploy-plugin-qt:自动收集 Qt 运行库与插件(platforms、imageformats 等)
  • appimagetool:将 AppDir 压缩打包为单个可执行 AppImage 文件

为什么分两步打包:需要先把 fcitx5 输入法插件手动放入包结构,再统一压缩,
因此不能使用 linuxdeploy 一步出包的 --output appimage 模式。


四、安装 aqtinstall 并下载 Qt 5.15.2

KeePassXC 2.7.12 要求 Qt ≥ 5.12,这里使用官方推荐的 aqt 工具下载 Qt 5.15.2
(gcc_64 桌面版),并借助阿里云镜像加速:

# 1. 创建虚拟环境(避免污染系统 Python)
mkdir -p ~/qt-aqt
python3 -m venv ~/qt-aqt/venv
source ~/qt-aqt/venv/bin/activate

# 2. 安装 aqtinstall(阿里云 PyPI 源)
pip install aqtinstall -i https://mirrors.aliyun.com/pypi/simple/

# 3. 下载 Qt 5.15.2(阿里云 Qt 镜像,约 1GB,实测约 3 分钟)
aqt install-qt --base https://mirrors.aliyun.com/qt \
  linux desktop 5.15.2 gcc_64 --outputdir ~/Qt

验证安装结果:

~/Qt/5.15.2/gcc_64/bin/qmake -v
# 应输出:QMake version 3.1 / Using Qt version 5.15.2

五、获取 KeePassXC 源码

mkdir -p ~/000.develop/src && cd ~/000.develop/src

# 方式一:下载官方源码包(推荐,体积小、版本确定)
wget -O keepassxc-2.7.12-src.tar.xz \
  https://github.com/keepassxreboot/keepassxc/releases/download/2.7.12/keepassxc-2.7.12-src.tar.xz
tar -xf keepassxc-2.7.12-src.tar.xz

# 方式二:git 克隆(可选)
# git clone --branch 2.7.12 https://github.com/keepassxreboot/keepassxc.git keepassxc-2.7.12

六、编译安装

mkdir -p ~/000.develop/src/keepassxc-2.7.12/build
cd ~/000.develop/src/keepassxc-2.7.12/build

cmake -G Ninja \
  -DCMAKE_PREFIX_PATH=~/Qt/5.15.2/gcc_64 \
  -DCMAKE_INSTALL_PREFIX=~/000.develop/appimage/keepassxc/usr \
  -DWITH_XC_YUBIKEY=ON \
  -DWITH_XC_BROWSER=ON \
  -DWITH_XC_AUTOTYPE=ON \
  -DWITH_XC_KEESHARE=ON \
  -DWITH_XC_FDOSECRETS=ON \
  -DWITH_XC_SSHAGENT=ON \
  -DWITH_XC_DOCS=OFF \
  -DBUILD_TESTING=OFF ..

ninja
ninja install

CMake 选项说明:

选项 作用
-DWITH_XC_YUBIKEY=ON 启用 YubiKey 挑战-应答支持
-DWITH_XC_BROWSER=ON 启用浏览器扩展集成(keepassxc-browser)
-DWITH_XC_AUTOTYPE=ON 启用自动输入(X11 XTest)
-DWITH_XC_KEESHARE=ON 启用 KeeShare 分享功能
-DWITH_XC_FDOSECRETS=ON 启用 Secret Service 集成(可被系统钥匙圈/其他密码管理器调用)
-DWITH_XC_SSHAGENT=ON 启用 SSH Agent 集成
-DWITH_XC_DOCS=OFF 关闭文档生成(省去 asciidoctor 依赖)
-DBUILD_TESTING=OFF 关闭单元测试编译

配置成功后终端会列出启用的功能列表(Auto-Type、Browser、KeeShare、YubiKey、
Secret Service、SSH Agent)。
编译时长取决于 CPU:本机 2 核约 50~60 分钟,8 核以上通常 10 分钟以内。
安装完成后 ~/000.develop/appimage/keepassxc/usr/bin/ 下会出现
keepassxc、keepassxc-cli、keepassxc-proxy 三个可执行文件。


七、整理应用并打包

回到工具目录,依次完成:部署生成包结构 → 放入 fcitx5 输入法插件 → 放入语言文件 → 打包。

cd ~/000.develop/appimage

# 0) 清空旧包结构(重复打包时保证不残留旧文件)
rm -rf AppDir

# 指定 Qt 位置(供 linuxdeploy-plugin-qt 识别)
export QMAKE=~/Qt/5.15.2/gcc_64/bin/qmake
export LD_LIBRARY_PATH=~/Qt/5.15.2/gcc_64/lib:$LD_LIBRARY_PATH

# 1) 生成包结构(自动收集 Qt 运行库与插件)
#    重要:keepassxc-cli / keepassxc-proxy 也必须用 --executable 交给 linuxdeploy——
#    它会给每个可执行文件修正 RPATH($ORIGIN/../lib)。如果只是 cp 进 AppDir,
#    这两个文件在未安装 libbotan 的目标机上会报
#    "cannot open shared object file: libbotan-2.so.18",浏览器集成密钥交换失败。
./linuxdeploy-x86_64.AppImage \
  --appdir AppDir \
  --plugin qt \
  --executable ~/000.develop/appimage/keepassxc/usr/bin/keepassxc \
  --executable ~/000.develop/appimage/keepassxc/usr/bin/keepassxc-cli \
  --executable ~/000.develop/appimage/keepassxc/usr/bin/keepassxc-proxy \
  --icon-file ~/000.develop/appimage/keepassxc/usr/share/icons/hicolor/256x256/apps/keepassxc.png \
  --desktop-file ~/000.develop/appimage/keepassxc/usr/share/applications/org.keepassxc.KeePassXC.desktop

# 1b) 说明:三个可执行文件此时已由 linuxdeploy 部署进 AppDir/usr/bin 并带有正确
#     RPATH;解包 AppImage 后 usr/bin 下应能看到 keepassxc、keepassxc-cli、
#     keepassxc-proxy 三个文件,且都能脱离构建机独立运行。

# 2) 放入系统 fcitx5 输入法插件,并补齐其依赖库(libFcitx5*)
#    只拷插件 .so 不够:插件还链接 libFcitx5Qt5DBusAddons 等系统库,
#    目标机器未装 fcitx5 时插件会因缺依赖加载失败、输入法静默失效。
mkdir -p ./AppDir/usr/plugins/platforminputcontexts ./AppDir/usr/lib
cp /usr/lib/x86_64-linux-gnu/qt5/plugins/platforminputcontexts/libfcitx5platforminputcontextplugin.so \
   ./AppDir/usr/plugins/platforminputcontexts/
ldd ./AppDir/usr/plugins/platforminputcontexts/libfcitx5platforminputcontextplugin.so 2>/dev/null \
  | awk '/=> \/(usr\/)?lib\// {print $3}' \
  | grep -E 'libFcitx5|libibus' \
  | while read -r dep; do [ -f "$dep" ] && cp -L "$dep" ./AppDir/usr/lib/; done || true
# 注:行尾的 || true 是必须的——无匹配依赖时 grep 返回非零,若外层脚本开了
#     set -euo pipefail,会像本指南配套脚本曾遇到的问题一样静默中断。

# 3) 放入语言文件(Qt 全部语言 + 应用多语言,qt_zh_CN.qm 已包含在 qt_*.qm 内)
mkdir -p ./AppDir/usr/translations
cp ~/Qt/5.15.2/gcc_64/translations/qt_*.qm ./AppDir/usr/translations/
mkdir -p ./AppDir/usr/share/keepassxc/translations
cp ~/000.develop/appimage/keepassxc/usr/share/keepassxc/translations/keepassxc_*.qm \
   ./AppDir/usr/share/keepassxc/translations/

# 4) 完整性自检(缺关键文件时先报警再打包)
ls -1 ./AppDir/usr/bin             # 应含 keepassxc、keepassxc-cli、keepassxc-proxy
ls ./AppDir/usr/plugins/platforms  # 应含 libqxcb.so
ls ./AppDir/usr/translations/*.qm | wc -l  # Qt 语言文件数量

# 5) 打包为最终 AppImage(压缩约 2~3 分钟)
./appimagetool-x86_64.AppImage AppDir KeePassXC-v2.7.12-fcitx5-x86_64.AppImage

打包成功后输出:

~/000.develop/appimage/KeePassXC-v2.7.12-fcitx5-x86_64.AppImage   (约 93MB,含三个可执行文件、全量语言文件与输入法插件)

八、使用产物

# 直接运行
~/000.develop/appimage/KeePassXC-v2.7.12-fcitx5-x86_64.AppImage

# 授予执行权限后放到任意位置使用
chmod +x KeePassXC-v2.7.12-fcitx5-x86_64.AppImage
./KeePassXC-v2.7.12-fcitx5-x86_64.AppImage

AppImage 为单文件绿色应用,不依赖本机 Qt,可直接拷贝到其他
x86_64 Linux 发行版运行;输入法集成依赖目标机器已安装 fcitx5。

使用提醒

  1. glibc 兼容性:本包在 Deepin 25 上构建,目标机器 glibc 需不低于构建机;
    若要兼容更老的发行版,请在旧基准系统(如 Ubuntu 20.04/22.04 容器)中重新构建。
  2. 输入法框架本体:包内已带 fcitx5/ibus 的 Qt 输入法插件及其依赖库,
    但目标机器仍需安装 fcitx5 或 ibus 框架本身,否则无法输入中文。
  3. YubiKey:USB 挑战-应答需要目标机器具备 yubikey udev 规则
    (yubikey-personalization 提供的 60-yubikey.rules)并运行 pcscd 服务。
  4. Wayland:包内为 xcb 平台插件,Wayland 会话下经 XWayland 运行;
    Auto-Type 自动输入在 Wayland 会话下受限(依赖 X11 XTest)。
  5. FUSE:目标机器无 FUSE 时用 --appimage-extract-and-run 运行。
  6. 浏览器集成:keepassxc-proxy 已随包提供;首次在 KeePassXC 中启用浏览器扩展时,
    原生消息清单会自动写入对应浏览器的配置目录。
  7. 请直接运行 .AppImage 单文件:不要先 --appimage-extract 再从解包目录运行,
    否则会丢失 AppImage 环境,浏览器集成清单会指向解包目录、密钥交换失败(见 Q8)。

九、常见问题

Q1:运行 .AppImage 时报 FUSE 错误?
容器或精简环境没有 FUSE 设备。所有 AppImage 工具均可加参数运行:

./linuxdeploy-x86_64.AppImage --appimage-extract-and-run ...
./appimagetool-x86_64.AppImage --appimage-extract-and-run AppDir out.AppImage

Q2:GitHub 下载缓慢或证书报错?
GitHub 在国内访问不稳定,且部分环境(如 hosts 屏蔽或本地代理)会提示证书不可信,
可改用 curl 并跳过证书校验下载:

curl -kL -o linuxdeploy-x86_64.AppImage <下载地址>

Q3:apt 安装时个别包下载失败?
CDN 偶发中断时,重试并允许补下缺失文件:

sudo apt install -y --fix-missing <软件包...>

Q4:编译到一半中断了,要重来吗?
不需要。ninja 增量编译,直接再次执行即可从断点继续:

cd ~/000.develop/src/keepassxc-2.7.12/build && ninja && ninja install

Q5:只想重新打包,不重新编译?

DO_APT=0 DO_TOOLS=0 DO_QT=0 DO_SRC=0 DO_BUILD=0 bash build-keepassxc-appimage.sh

Q6:想清理中间产物重来?

rm -rf ~/000.develop/appimage/AppDir ~/000.develop/src/keepassxc-2.7.12/build

Q7:解包 AppImage 后只有 keepassxc,没有 keepassxc-cli / keepassxc-proxy?
linuxdeploy 只打包 --executable 显式指定的文件,不会拷贝整个 usr/bin。
三个可执行文件都必须以 --executable 方式交给 linuxdeploy(见第七节 1) 步),
这样它们才会被修正 RPATH($ORIGIN/../lib);单纯 cp 进去的二进制在未安装
libbotan 的目标机上会找不到运行库。用脚本时重跑打包步骤即可:

DO_APT=0 DO_TOOLS=0 DO_QT=0 DO_SRC=0 DO_BUILD=0 bash build-keepassxc-appimage.sh

Q8:KeePassXC-Browser 报“密钥交换未成功”,且代理报找不到 libbotan-2.so.18?
典型原因:从 --appimage-extract 解包后的目录里运行了 KeePassXC。解包运行会
丢失 AppImage 环境(APPIMAGE 变量),KeePassXC 会按“本机安装”模式生成原生消息清单,
把主机指向解包目录里的 keepassxc-proxy,而该文件的 RPATH 若未被修正就无法找到
包内库。解决:删除旧清单、直接运行 .AppImage 单文件,重新启用浏览器集成并重启
Firefox:

rm -f ~/.mozilla/native-messaging-hosts/org.keepassxc.keepassxc_browser.json
~/000.develop/appimage/KeePassXC-v2.7.12-fcitx5-x86_64.AppImage

十、一键脚本

配套脚本 build-keepassxc-appimage.sh 与本指南同目录,把上面所有步骤封装为一条命令:

bash build-keepassxc-appimage.sh

脚本特性:

  • 六个步骤按顺序自动执行,日志分段清晰
  • 已下载的文件、已编译的目标自动跳过,支持断点续跑
  • 各步骤可用 DO_APT=0、DO_QT=0 等环境变量单独控制
  • 自动处理无 FUSE 环境、GitHub 证书容错、apt 补下缺失文件等情形
  • 路径基于当前登录用户自动生成,多用户环境无需改动

build-keepassxc-appimage.zip

KeePassXC-AppImage-构建指南.zip

Reply View the author