ScreenLockDetector/DEB_PACKAGE.md

460 lines
9.4 KiB
Markdown
Raw 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.

# 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)
---
## 联系与支持
如有问题或建议,欢迎反馈!
**祝打包顺利!** 🎉