diff -pruN 5.5.32-1/archlinux/PKGBUILD 5.5.33-1/archlinux/PKGBUILD
--- 5.5.32-1/archlinux/PKGBUILD	1970-01-01 00:00:00.000000000 +0000
+++ 5.5.33-1/archlinux/PKGBUILD	2022-07-19 09:10:28.000000000 +0000
@@ -0,0 +1,30 @@
+# Maintainer: justforlxz <justforlxz@gmail.com>
+pkgname=dtkcore-git
+pkgver=5.5.23.r5.g74f86b0
+pkgrel=1
+pkgdesc='DTK core modules'
+arch=('x86_64' 'aarch64')
+url="https://github.com/linuxdeepin/dtkcore"
+license=('LGPL3')
+depends=('dconf' 'deepin-desktop-base-git' 'python' 'gsettings-qt' 'lshw')
+makedepends=('git' 'qt5-tools' 'gtest' 'dtkcommon-git')
+conflicts=('dtkcore')
+provides=('dtkcore')
+groups=('deepin-git')
+source=('source.tar.gz')
+sha512sums=('SKIP')
+
+prepare() {
+    cd $deepin_source_name
+}
+
+build() {
+  cd $deepin_source_name
+  qmake-qt5 PREFIX=/usr DTK_VERSION=$pkgver LIB_INSTALL_DIR=/usr/lib
+  make
+}
+
+package() {
+  cd $deepin_source_name
+  make INSTALL_ROOT="$pkgdir" install
+}
diff -pruN 5.5.32-1/CMakeLists.txt 5.5.33-1/CMakeLists.txt
--- 5.5.32-1/CMakeLists.txt	1970-01-01 00:00:00.000000000 +0000
+++ 5.5.33-1/CMakeLists.txt	2022-07-19 09:10:28.000000000 +0000
@@ -0,0 +1,16 @@
+cmake_minimum_required (VERSION 3.10)
+
+project (DtkCore
+	VERSION "${DTK_REPO_MODULE_VERSION}"
+	DESCRIPTION "DTK Core module"
+	HOMEPAGE_URL ""
+	LANGUAGES CXX C
+)
+
+find_package (Qt5 CONFIG REQUIRED COMPONENTS DBus Xml)
+
+set (BUILD_DOCS ON CACHE BOOL "Generate doxygen-based documentation")
+
+if (BUILD_DOCS)
+	add_subdirectory(doc)
+endif ()
diff -pruN 5.5.32-1/debian/changelog 5.5.33-1/debian/changelog
--- 5.5.32-1/debian/changelog	2022-06-15 17:26:45.000000000 +0000
+++ 5.5.33-1/debian/changelog	2022-08-02 05:14:06.000000000 +0000
@@ -1,3 +1,11 @@
+dtkcore (5.5.33-1) unstable; urgency=medium
+
+  * New upstream version 5.5.33.
+  * debian/libdtkcore5.shlibs: update version to 5.5.33.
+  * debian/rules: Add buildsystem=qmake.
+
+ -- Clay Stan <claystan97@gmail.com>  Tue, 02 Aug 2022 13:14:06 +0800
+
 dtkcore (5.5.32-1) unstable; urgency=medium
 
   * New upstream version.
diff -pruN 5.5.32-1/debian/libdtkcore5.shlibs 5.5.33-1/debian/libdtkcore5.shlibs
--- 5.5.32-1/debian/libdtkcore5.shlibs	2022-06-15 17:26:42.000000000 +0000
+++ 5.5.33-1/debian/libdtkcore5.shlibs	2022-08-02 05:14:06.000000000 +0000
@@ -1 +1 @@
-libdtkcore 5 libdtkcore5 (>= 5.5.32~)
+libdtkcore 5 libdtkcore5 (>= 5.5.33~)
diff -pruN 5.5.32-1/debian/rules 5.5.33-1/debian/rules
--- 5.5.32-1/debian/rules	2021-11-09 18:33:24.000000000 +0000
+++ 5.5.33-1/debian/rules	2022-08-02 05:14:06.000000000 +0000
@@ -18,7 +18,7 @@ include /usr/share/dpkg/architecture.mk
 include /usr/share/dpkg/default.mk
 
 %:
-	dh $@ --with pkgkde_symbolshelper
+	dh $@ --buildsystem=qmake --with pkgkde_symbolshelper
 
 override_dh_auto_configure:
 	dh_auto_configure -- LIB_INSTALL_DIR=/usr/lib/$(DEB_HOST_MULTIARCH) VERSION=$(DEB_VERSION_UPSTREAM)
diff -pruN 5.5.32-1/doc/CMakeLists.txt 5.5.33-1/doc/CMakeLists.txt
--- 5.5.32-1/doc/CMakeLists.txt	1970-01-01 00:00:00.000000000 +0000
+++ 5.5.33-1/doc/CMakeLists.txt	2022-07-19 09:10:28.000000000 +0000
@@ -0,0 +1,38 @@
+cmake_minimum_required (VERSION 3.10)
+
+find_package (Doxygen REQUIRED)
+
+set (QCH_INSTALL_DESTINATION ${CMAKE_INSTALLL_PREFIX}/share/DDE/dtk CACHE STRING "QCH install location")
+
+set (DOXYGEN_GENERATE_HTML "NO" CACHE STRING "Doxygen HTML output")
+set (DOXYGEN_GENERATE_XML "NO" CACHE STRING "Doxygen XML output")
+set (DOXYGEN_GENERATE_QHP "YES" CACHE STRING "Doxygen QHP output")
+set (DOXYGEN_FILE_PATTERNS *.cpp *.h *.md *.zh_CN.dox CACHE STRING "Doxygen File Patterns")
+set (DOXYGEN_PROJECT_NUMBER ${CMAKE_PROJECT_VERSION} CACHE STRING "") # Should be the same as this project is using.
+set (DOXYGEN_EXTRACT_STATIC YES)
+set (DOXYGEN_OUTPUT_LANGUAGE "Chinese")
+set (DOXYGEN_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/docs/)
+set (DOXYGEN_QHG_LOCATION "qhelpgenerator")
+set (DOXYGEN_QHP_NAMESPACE "org.deepin.dtk.core")
+set (DOXYGEN_QCH_FILE "dtkcore.qch")
+set (DOXYGEN_QHP_VIRTUAL_FOLDER "dtkcore")
+set (DOXYGEN_HTML_EXTRA_STYLESHEET "" CACHE STRING "Doxygen custom stylesheet for HTML output")
+set (DOXYGEN_TAGFILES "qtcore.tags=qthelp://org.qt-project.qtcore/qtcore/" CACHE STRING "Doxygen tag files")
+
+set (DOXYGEN_PREDEFINED
+    "\"DCORE_BEGIN_NAMESPACE=namespace Dtk { namespace Core {\""
+    "\"DCORE_END_NAMESPACE=}}\""
+    "\"DCORE_USE_NAMESPACE=using Dtk::Core\""
+)
+set (DOXYGEN_MACRO_EXPANSION "YES")
+set (DOXYGEN_EXPAND_ONLY_PREDEF "YES")
+
+doxygen_add_docs (doxygen
+    ${PROJECT_SOURCE_DIR}/src
+    ${PROJECT_SOURCE_DIR}/doc
+    ALL
+    WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
+    COMMENT "Generate documentation via Doxygen"
+)
+
+install (FILES ${PROJECT_BINARY_DIR}/docs/html/dtkcore.qch DESTINATION ${QCH_INSTALL_DESTINATION})
diff -pruN 5.5.32-1/.github/workflows/call-clacheck.yml 5.5.33-1/.github/workflows/call-clacheck.yml
--- 5.5.32-1/.github/workflows/call-clacheck.yml	1970-01-01 00:00:00.000000000 +0000
+++ 5.5.33-1/.github/workflows/call-clacheck.yml	2022-07-19 09:10:28.000000000 +0000
@@ -0,0 +1,16 @@
+name: Call CLA check
+on:
+  issue_comment:
+    types: [created]
+  pull_request_target:
+    types: [opened, closed, synchronize]
+
+concurrency:
+  group: ${{ github.workflow }}-pull/${{ github.event.number }}
+  cancel-in-progress: true
+
+jobs:
+  clacheck:
+    uses: linuxdeepin/.github/.github/workflows/cla-check.yml@master
+    secrets:
+      APP_PRIVATE_KEY: ${{ secrets.APP_PRIVATE_KEY }}
diff -pruN 5.5.32-1/src/dconfig.cpp 5.5.33-1/src/dconfig.cpp
--- 5.5.32-1/src/dconfig.cpp	2022-05-25 07:33:48.000000000 +0000
+++ 5.5.33-1/src/dconfig.cpp	2022-07-19 09:10:28.000000000 +0000
@@ -341,9 +341,13 @@ public:
 
     virtual QVariant value(const QString &key, const QVariant &fallback) const override
     {
-        const QDBusVariant &dv = config->value(key);
-        const QVariant &v = dv.variant();
-        return v.isValid() ? decodeQDBusArgument(v) : fallback;
+        auto reply = config->value(key);
+        reply.waitForFinished();
+        if (reply.isError()) {
+            qWarning() << "value error key:" << key << ", error message:" << reply.error().message();
+            return fallback;
+        }
+        return decodeQDBusArgument(reply.value().variant());
     }
 
     virtual void setValue(const QString &key, const QVariant &value) override
diff -pruN 5.5.32-1/src/dconfigfile.cpp 5.5.33-1/src/dconfigfile.cpp
--- 5.5.32-1/src/dconfigfile.cpp	2022-05-25 07:33:48.000000000 +0000
+++ 5.5.33-1/src/dconfigfile.cpp	2022-07-19 09:10:28.000000000 +0000
@@ -386,14 +386,18 @@ public:
         values.remove(key);
     }
 
-    inline void update(const QString &key, const QVariantHash &value)
+    inline bool update(const QString &key, const QVariantHash &value)
     {
+        if (!value.contains("value")) {
+            return false;
+        }
         values[key] = value;
+        return true;
     }
 
-    inline void updateValue(const QString &key, const QJsonValue &value)
+    inline bool updateValue(const QString &key, const QJsonValue &value)
     {
-        overrideValue(key, "value", value);
+        return overrideValue(key, "value", value);
     }
 
     inline void updateSerial(const QString &key, const QJsonValue &value)
@@ -415,11 +419,15 @@ public:
         return contents;
     }
 private:
-    void overrideValue(const QString &key, const QString &subkey, const QJsonValue &from) {
+    bool overrideValue(const QString &key, const QString &subkey, const QJsonValue &from) {
         const QJsonValue &v = from[subkey];
 
-        if (!v.isUndefined())
-            values[key][subkey] = v.toVariant();
+        if (v.isUndefined()) {
+            return false;
+        }
+
+        values[key][subkey] = v.toVariant();
+        return true;
     }
 
     QHash<QString, QVariantHash> values;
@@ -698,14 +706,15 @@ public:
 
             // 初始化原始值
             for (; i != contents.constEnd(); ++i) {
-                values.update(i.key(), i.value().toObject().toVariantHash());
+                if (!values.update(i.key(), i.value().toObject().toVariantHash())) {
+                    qWarning() << "key:" << i.key() << "has no value";
+                    return false;
+                }
             }
         }
-
         // for override
         Q_FOREACH(auto override, overrides) {
             const QJsonDocument &doc = loadJsonFile(override);
-
             if (doc.isObject()) {
                 const QJsonObject &root = doc.object();
                 if (!checkMagic(root, MAGIC_OVERRIDE)) {
@@ -734,7 +743,10 @@ public:
                     if (values.flags(i.key()) & DConfigFile::NoOverride)
                         continue;
 
-                    values.updateValue(i.key(), i.value());
+                    if (!values.updateValue(i.key(), i.value())) {
+                        qWarning() << "key (override):" << i.key() << "has no value";
+                        return false;
+                    }
                     values.updateSerial(i.key(), i.value());
                     values.updatePermissions(i.key(), i.value());
                 }
diff -pruN 5.5.32-1/src/dsysinfo.cpp 5.5.33-1/src/dsysinfo.cpp
--- 5.5.32-1/src/dsysinfo.cpp	2022-05-25 07:33:48.000000000 +0000
+++ 5.5.33-1/src/dsysinfo.cpp	2022-07-19 09:10:28.000000000 +0000
@@ -250,10 +250,10 @@ bool DSysInfoPrivate::ensureOsVersion()
     D_ASSET_EXIT(entry.status() == DDesktopEntry::NoError, entry.status());
 
     // 先获取版本信息
-    // ABCDE.xyz
+    // ABCDE.xyz.abc
     QString osb = entry.stringValue("OsBuild", "Version");
     QStringList osbs = osb.split(".");
-    ok = (osbs.size() == 2 && osbs.value(0).size() == 5);
+    ok = (osbs.size() >= 2 && osbs.value(0).size() == 5);
     D_ASSET_EXIT(ok, "OsBuild version invalid!");
 
     const QStringList &left = osbs.value(0).split(QString(), QString::SkipEmptyParts);
@@ -261,19 +261,19 @@ bool DSysInfoPrivate::ensureOsVersion()
 
     int idx = 0;
     osBuild.A = left.value(idx++, "0").toUInt(&ok);
-    D_ASSET_EXIT(ok, "OsBuild version(a) invalid!");
+    D_ASSET_EXIT(ok, "OsBuild version(A) invalid!");
     osBuild.B = left.value(idx++, "0").toUInt(&ok);
-    D_ASSET_EXIT(ok, "OsBuild version(b) invalid!");
+    D_ASSET_EXIT(ok, "OsBuild version(B) invalid!");
     osBuild.C = left.value(idx++, "0").toUInt(&ok);
     if (!ok) {
         auto c = left.value(idx-1, "0").toLatin1();
-        D_ASSET_EXIT(c.size()>0, "OsBuild version(c) invalid!");
+        D_ASSET_EXIT(c.size()>0, "OsBuild version(C) invalid!");
         osBuild.C = uint(c.at(0));
     }
     osBuild.D = left.value(idx++, "0").toUInt(&ok);
-    D_ASSET_EXIT(ok, "OsBuild version(d) invalid!");
+    D_ASSET_EXIT(ok, "OsBuild version(D) invalid!");
     osBuild.E = left.value(idx++, "0").toUInt(&ok);
-    D_ASSET_EXIT(ok, "OsBuild version(e) invalid!");
+    D_ASSET_EXIT(ok, "OsBuild version(E) invalid!");
 
     // xyz
     osBuild.xyz = osbs.value(1).trimmed().toUInt(&ok);
@@ -802,8 +802,9 @@ QString DSysInfo::minorVersion()
  */
 QString DSysInfo::buildVersion()
 {
-    siGlobal->ensureOsVersion();
-    return QString::number(siGlobal->osBuild.xyz);
+    DDesktopEntry entry(OS_VERSION_FILE);
+    QString osb = entry.stringValue("OsBuild", "Version");
+    return osb.mid(6).trimmed();
 }
 #endif
 
diff -pruN 5.5.32-1/tests/ut_dutil.cpp 5.5.33-1/tests/ut_dutil.cpp
--- 5.5.32-1/tests/ut_dutil.cpp	2022-05-25 07:33:48.000000000 +0000
+++ 5.5.33-1/tests/ut_dutil.cpp	2022-07-19 09:10:28.000000000 +0000
@@ -309,7 +309,7 @@ TEST_F(ut_DUtil, testOsVersion)
     entry.setStringValue("专业版", "EditionName[zh_CN]", "Version");
     entry.setStringValue("20", "MajorVersion", "Version");
     entry.setStringValue("100A", "MinorVersion", "Version");
-    entry.setStringValue("11Z18.107", "OsBuild", "Version");
+    entry.setStringValue("11Z18.107.109", "OsBuild", "Version");
     ASSERT_TRUE(entry.save());
 
     ASSERT_TRUE(DSysInfo::uosSystemName(QLocale("C")) == "UnionTech OS Desktop");
@@ -320,7 +320,7 @@ TEST_F(ut_DUtil, testOsVersion)
     ASSERT_TRUE(DSysInfo::uosEditionName(QLocale("C")) == "Professional");
     ASSERT_TRUE(DSysInfo::majorVersion() == "20");
     ASSERT_TRUE(DSysInfo::minorVersion() == "100A");
-    ASSERT_TRUE(DSysInfo::buildVersion() == "107");
+    ASSERT_TRUE(DSysInfo::buildVersion() == "107.109");
 
     // test minVersion.BC SP1….SP99
     for (int i = 0; i < 100; ++i) {
