Qt 热更新的核心思路是将主程序编译为动态库,主程序只需负责动态库的加载和更新逻辑。

前言

我开发的项目 智能题卡 的用户群体主要是高中生。在 Windows 平台,更新操作相对繁琐;而在 Android 端,即使实现了自动更新功能,仍然需要用户手动确认安装,影响了使用体验。为了解决这些问题,我尝试实现了热更新功能。

实现步骤

以下内容可参考我的项目 智能题卡 的热更新分支。

主程序的动态库化

将主程序的 main 函数改造为动态库的导出函数。

原代码:

1
2
3
4
5
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
// 程序逻辑
}

修改后:

1
2
3
4
extern "C" Q_DECL_EXPORT int run(QApplication *a)
{
// 程序逻辑
}

此外,需要提供一个返回版本号的函数并将其导出,以便更新程序判断版本信息。例如:

1
2
3
4
extern "C" Q_DECL_EXPORT const char *getVersion()
{
return APP_VERSION;
}

启动器的实现

启动器的主要职责是加载动态库和检查更新:

  1. 检查更新
    检查指定目录下是否存在新版本的动态库文件。如果存在,则替换旧版本。

  2. 加载动态库
    使用 QLibrary 加载动态库,并调用其导出的 run 函数启动主程序。

  3. 异步更新
    在程序运行时,启动器异步检查更新,并在后台下载新的动态库文件,确保用户能够持续使用。


这样设计能够在不干扰用户使用的情况下完成程序更新,提升整体体验。