ScreenLockDetector/docs/DEB_PACKAGE.md

460 lines
9.4 KiB
Markdown
Raw Permalink Normal View History

2025-11-07 14:57:13 +08:00
# DEB 打包说明文档
本文档说明如何将 Qt Screen Lock Demo 打包成 DEB 安装包。
## 目录
- [打包准备](#打包准备)
- [快速打包](#快速打包)
- [完整打包](#完整打包)
- [打包原理](#打包原理)
- [测试安装](#测试安装)
- [常见问题](#常见问题)
---
## 打包准备
### 1. 必需工具
确保以下工具已安装:
```bash
# 安装打包工具
sudo apt-get install dpkg-dev debhelper
# 检查 linuxdeployqt 工具
ls -lh $HOME/dev/sunvpack-py/bin/linuxdeployqt
```
### 2. 环境要求
- **Qt 5.15.2** 安装在 `$HOME/sdk/qt-5.15.2`
- **linuxdeployqt** 工具在 `$HOME/dev/sunvpack-py/bin/linuxdeployqt`
- **编译好的程序** 或可以运行 `./build.sh` 编译
### 3. 文件清单
打包相关文件:
```
qt_screan_lock/
├── build_deb.sh # 完整打包脚本(推荐)
├── make_deb.sh # 快速打包脚本
├── screenlockdemo.desktop # 桌面快捷方式
├── debian/ # Debian 打包配置
│ ├── control # 包信息
│ ├── copyright # 版权信息
│ ├── changelog # 更新日志
│ ├── rules # 构建规则
│ └── compat # 兼容性版本
└── DEB_PACKAGE.md # 本文档
```
---
## 快速打包
如果你想快速生成一个 DEB 包,使用 `make_deb.sh`
### 步骤 1赋予执行权限
```bash
chmod +x make_deb.sh
```
### 步骤 2运行打包脚本
```bash
./make_deb.sh
```
### 步骤 3等待完成
脚本会自动完成以下步骤:
1. ✓ 清理目录
2. ✓ 编译项目(如需要)
3. ✓ 创建 AppDir
4. ✓ 使用 linuxdeployqt 收集依赖
5. ✓ 创建 DEB 包结构
6. ✓ 构建 DEB 包
### 输出结果
打包完成后会生成:
```
deb_package/
├── screenlockdemo_1.0.0_amd64.deb # DEB 安装包
└── AppDir/ # 临时目录
```
DEB 包路径:`deb_package/screenlockdemo_1.0.0_amd64.deb`
---
## 完整打包
使用 `build_deb.sh` 可以获得更详细的日志和更完整的打包过程:
### 步骤 1赋予执行权限
```bash
chmod +x build_deb.sh
```
### 步骤 2运行打包脚本
```bash
./build_deb.sh
```
### 特点
- 彩色输出,更易读
- 详细的步骤说明
- 完整的错误检查
- 自动生成安装/卸载脚本
- 更详细的包信息
### 输出结果
```
package/
├── screenlockdemo_1.0.0_amd64.deb # DEB 安装包
├── AppDir/ # 临时目录
└── screenlockdemo_1.0.0_amd64/ # DEB 源目录
```
DEB 包路径:`package/screenlockdemo_1.0.0_amd64.deb`
---
## 打包原理
### linuxdeployqt 的作用
`linuxdeployqt` 是一个自动化工具,用于:
1. **扫描可执行文件** 的动态链接依赖
2. **复制所有 Qt 库** 到打包目录
3. **复制 Qt 插件** (platforms, imageformats 等)
4. **复制系统库** (如果需要)
5. **设置正确的 RPATH**
### DEB 包结构
最终的 DEB 包包含:
```
/opt/screenlockdemo/ # 应用程序安装目录
├── bin/
│ └── ScreenLockDemo # 主程序
├── lib/ # Qt 和依赖库
│ ├── libQt5Core.so.5
│ ├── libQt5Gui.so.5
│ ├── libQt5Widgets.so.5
│ ├── libQt5DBus.so.5
│ └── ... # 其他依赖库
├── plugins/ # Qt 插件
│ ├── platforms/
│ │ └── libqxcb.so
│ └── ...
└── screenlockdemo.sh # 启动包装脚本
/usr/bin/
└── screenlockdemo # 系统命令链接
/usr/share/applications/
└── screenlockdemo.desktop # 桌面快捷方式
/usr/share/icons/
└── hicolor/256x256/apps/
└── screenlockdemo.png # 应用图标
```
### 为什么这样打包?
1. **隔离依赖**:所有 Qt 库打包在 `/opt` 下,不影响系统库
2. **避免冲突**:不依赖系统 Qt 版本
3. **易于部署**:一个包包含所有依赖
4. **跨版本兼容**:可在不同 Ubuntu 版本上运行
### 启动包装脚本
`screenlockdemo.sh` 的作用:
```bash
#!/bin/bash
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
export LD_LIBRARY_PATH="${SCRIPT_DIR}/lib:$LD_LIBRARY_PATH"
export QT_PLUGIN_PATH="${SCRIPT_DIR}/plugins"
exec "${SCRIPT_DIR}/bin/ScreenLockDemo" "$@"
```
- 设置 `LD_LIBRARY_PATH` 指向打包的库
- 设置 `QT_PLUGIN_PATH` 指向打包的插件
- 确保程序使用打包的 Qt而非系统 Qt
---
## 测试安装
### 1. 查看包信息
```bash
# 查看包的详细信息
dpkg -I deb_package/screenlockdemo_1.0.0_amd64.deb
# 查看包内文件列表
dpkg -c deb_package/screenlockdemo_1.0.0_amd64.deb
```
### 2. 安装包
```bash
sudo dpkg -i deb_package/screenlockdemo_1.0.0_amd64.deb
```
如果有依赖问题:
```bash
sudo apt-get install -f
```
### 3. 运行程序
**方法 1命令行运行**
```bash
screenlockdemo
```
**方法 2应用菜单**
在应用程序菜单中搜索 "Screen Lock Demo"
**方法 3直接执行**
```bash
/opt/screenlockdemo/screenlockdemo.sh
```
### 4. 验证依赖
检查程序是否使用打包的库:
```bash
# 查看程序链接的库
ldd /opt/screenlockdemo/bin/ScreenLockDemo
# 应该看到库路径指向 /opt/screenlockdemo/lib/
```
### 5. 卸载包
```bash
sudo dpkg -r screenlockdemo
```
或完全清除(包括配置):
```bash
sudo dpkg -P screenlockdemo
```
---
## 常见问题
### Q1: linuxdeployqt 报错 "ERROR: Desktop file missing"
**原因**:缺少 `.desktop` 文件
**解决**:确保 `screenlockdemo.desktop` 文件存在且格式正确
### Q2: 打包后的程序无法启动
**诊断**
```bash
# 直接运行二进制文件查看错误
/opt/screenlockdemo/bin/ScreenLockDemo
# 检查库依赖
ldd /opt/screenlockdemo/bin/ScreenLockDemo
```
**常见原因**
- 缺少某些系统库libGL, libX11 等)
- Qt 插件未正确复制
- 权限问题
**解决**
- 安装缺失的系统库:`sudo apt-get install libgl1 libx11-6`
- 检查 `plugins/platforms/libqxcb.so` 是否存在
- 检查文件权限:`chmod +x /opt/screenlockdemo/bin/ScreenLockDemo`
### Q3: 图标不显示
**原因**:图标文件缺失或路径错误
**解决**
1. 检查 `/usr/share/icons/hicolor/256x256/apps/screenlockdemo.png` 是否存在
2. 更新图标缓存:`sudo gtk-update-icon-cache -f /usr/share/icons/hicolor`
3. 替换为真实图标文件
### Q4: Qt 平台插件错误
**错误信息**
```
qt.qpa.plugin: Could not load the Qt platform plugin "xcb"
```
**解决**
```bash
# 检查插件是否存在
ls /opt/screenlockdemo/plugins/platforms/libqxcb.so
# 检查插件依赖
ldd /opt/screenlockdemo/plugins/platforms/libqxcb.so
# 安装缺失的依赖
sudo apt-get install libxcb-xinerama0 libxcb-icccm4 libxcb-image0 libxcb-keysyms1 libxcb-render-util0
```
### Q5: DBus 服务连接失败
**原因**DBus 系统服务未运行
**解决**
```bash
# 检查 DBus 服务
systemctl status dbus
# 启动 DBus 服务
sudo systemctl start dbus
```
### Q6: 想修改包版本号
编辑脚本中的版本号:
```bash
# 在 make_deb.sh 或 build_deb.sh 中修改
VERSION="1.0.1" # 改为新版本号
```
### Q7: 想修改安装路径
默认安装到 `/opt/screenlockdemo`,如需修改:
1. 修改脚本中的 `PACKAGE_NAME`
2. 修改 DEB 目录结构创建部分
3. 修改 desktop 文件中的 `Exec` 路径
### Q8: 如何添加真实图标?
1. 准备一个 256x256 的 PNG 图标文件
2. 命名为 `icon.png` 放在项目根目录
3. 重新运行打包脚本
或者直接替换:
```bash
cp your_icon.png screenlockdemo.png
```
然后在打包脚本中复制此图标。
---
## 高级定制
### 自定义包信息
编辑 `debian/control` 文件:
- **Maintainer**:维护者信息
- **Description**:包描述
- **Depends**:依赖包列表
- **Section**软件分类utils, games, graphics 等)
### 添加安装后脚本
编辑 `DEBIAN/postinst`
```bash
#!/bin/bash
set -e
# 在这里添加安装后要执行的命令
# 例如:创建配置文件、启动服务等
exit 0
```
### 添加卸载前脚本
创建 `DEBIAN/prerm`
```bash
#!/bin/bash
set -e
# 在这里添加卸载前要执行的命令
# 例如:停止服务、备份数据等
exit 0
```
### 减小包体积
1. **不包含调试符号**:在打包脚本中运行 `strip` 命令
2. **排除不需要的插件**:修改 linuxdeployqt 参数
3. **使用 UPX 压缩**:压缩可执行文件(可能影响兼容性)
```bash
# 压缩可执行文件
strip "${DEB_DIR}/opt/${PACKAGE_NAME}/bin/${APP_NAME}"
# 压缩所有 .so 库
find "${DEB_DIR}/opt/${PACKAGE_NAME}/lib" -name "*.so*" -exec strip {} \;
```
---
## 发布检查清单
在发布 DEB 包之前,确保:
- [ ] 包可以正常安装
- [ ] 程序可以正常启动和运行
- [ ] 所有功能正常工作(锁屏检测、动画等)
- [ ] 桌面快捷方式可用
- [ ] 命令行启动可用
- [ ] 图标正确显示
- [ ] 可以正常卸载
- [ ] 在不同 Ubuntu 版本上测试
- [ ] 文档和帮助信息完整
- [ ] 版本号正确
---
## 参考资源
- [Debian 打包指南](https://www.debian.org/doc/manuals/maint-guide/)
- [linuxdeployqt GitHub](https://github.com/probonopd/linuxdeployqt)
- [Qt 部署指南](https://doc.qt.io/qt-5/linux-deployment.html)
- [dpkg 手册](https://man7.org/linux/man-pages/man1/dpkg.1.html)
---
## 联系与支持
如有问题或建议,欢迎反馈!
**祝打包顺利!** 🎉