概述

deepin 是一个基于 Linux 的用户友好的发行版本。本文将从架构设计角度阐述当前版本的 deepin 操作系统的整体设计以及主要模块的设计理念,方便开发者了解 deepin 系统的技术方向。

系统架构

deepin 的主要组件可以分为 7 层 11 模块:

其中各个层次的主要内容包括:

层名称 主要功能
硬件层 运行操作系统的各类硬件,包括 CPU、内存、显卡、安全芯片以及硬件上集成的固件程序。
内核层 包括 Bootloader 和 Linux 内核。Bootloader 主要用于启动不同的操作系统或操作系统的不同版本,目前 deepin 使用 bootloader 为 grub2。Linux 内核用于管理各类硬件,如 CPU,内存、磁盘以及各类外设(网卡、显卡、声卡、摄像头、传感器)的核内驱动。
基础层 支撑最小系统运行的组件。基础层可以支撑 Busybox/Docker 等系统运行,包含对文件系统操作的相关工具。
服务层 支持系统运行的各个服务,目前 deepin 系统已经和 systemd 进行了较为紧密的绑定,很多底层系统功能都由 systemd 进行管理和提供。显示管理服务也是由该层提供。
SDK 层 包含应用程序运行的主要运行库以及相关开发工具。在设计上,一般通过本地的 C/S 模型来完成对资源访问,不建议设计上直接允许应用管理设备资源,而是需要将设备的使用和设备的管理进行分离设计。
SDK 层一般还包括开发工具,如 debug 符号,构建工具,打包工具等。deepin 的主要开发工具库 DTK 也是在这一层提供。
桌面环境层 在操作系统中也称为 shell 层,deepin 系统的 shell 层更加关注图形界面上的用户交互,这一层主要组件包括桌面/启动器/任务栏/文件管理器等。
应用层 包含应用商店和其他应用。应用商店主要提供系统的软件安装、卸载、升级等操作,保证用户可以安全方便的进行软件管理,同时提供了商店的评论和评分等功能。其他应用程序主要包括深度开发的系列应用、合作开发的国内应用、Android 应用、Windows 应用和网页应用。

DTK

DTK:Develop Tool Kit,是基于 Qt5 开发的一整套 UI 图形库,方便统一的编写深度桌面环境和深度系列应用。从2015年开始进行第一个版本开发,最初项目名称为dui,直到2016年改名为DTK,这个阶段为DTK1.0时代。之后到2017年时,按功能角色拆分为多个模块(dtkcore、dtkwidget等:https://github.com/martyr-deepin/deepin-tool-kit/issues/8),这个阶段为DTK2.0时代。2019年伴随着deepin V20版本的开发,DTK也迎来了有史以来的最大改动,从此开始了DTK5.0时代。

DTK主要分为以下模块:

模块 简介
dtkcommon 提供DTK各模块通用的编译配置
dtkcore 提供应用程序开发中的工具类,如程序日志管理、文件系统监控、格式转换等工具
dtkgui 包含了开发图形用户界面程序所需的基础功能,主要是控制窗口的主题和行为,如窗口边框修饰样式
dtkwidget 提供各种风格统一的UI控件
qt5platform-plugins Qt platform 插件
qt5integration Qt 其它插件的集合,包含 platformtheme 插件以及各类图片格式解码插件

DTK其实是多个项目的总称,它按功能角色划分了不同的模块,dtkcommon是所有模块的基础,它主要提供qmake相关的pri/prf文件,因为每个模块项目的目录结构都有许多共同点,比如都分了src、tools、tests这些子目录,并且都需求在编译期自动生成一些文件,还会定义一些文件的安装路径,为了方便统一的管理这些行为,遂将这些通用的与qmake构建相关的实现都放到了dtkcommon中实现,以便在其它模块编译时统一引用。

dtkcore包含了所有与图形不相关的实现,它的定位与Qt5的QtCore类似,提供了获取系统信息、监听文件系统、日志框架等功能。

dtkgui的定位是用来实现与图形相关且与具体的UI控件无关的基础功能,提供了如图形环境的主题读写功能,可以获取和设置鼠标光标的闪动速度、当前环境的文字大小等配置。在这之外还封装了与窗口管理器交互的功能,比如获取窗口管理器的名称、为某个窗口设置开启背景模糊的功能,这些功能在DDE桌面环境中被大量使用。此外还提供一些与图形相关的工具类,此处不再详细展开。

dtkwidget建立在dtkgui之上,它主要包含两大部分内容,一是对Qt已有控件提供符合deepin设计的样式,在这个实现中,没有使用任何qss代码,而是对Qt更底层的部分进行覆盖,这样做的好处是:不影响使用DTK开发的程序使用qss来进行二次定义,对于一个开发库来说,这有非常大的意义。另一方面,因为Qt已有的控件已经设计了很多年,对于现代化的应用程序来说,它缺少新鲜血液的注入,缺乏新控件,无法满足新型的现代化程序的开发,所以DTK还增加了一些新控件,比如“标签编辑框”、“窗口内部的消息通知”、“开关式切换按钮”等。此外对所有的控件(Qt中已有的和DTK中新增的),都统一了字体和颜色管理系统,使用dtkwidget开发的应用,都可以自动跟随图形环境的“亮色”和“暗色”主题设置,可以统一的响应系统字体大小改变,不用重启应用也可以实时看到效果。

qt5integration和qt5platform-plugins是为Qt编写的插件,为程序提供了对操作系统能力的封装,比如调用系统提供的文件选择对话框、为窗口自定义标题栏、设置窗口的圆角大小等功能。这两个模块不会被应用程序直接使用,它们所提供的所有能力皆已经在dtkgui和dtkwidget中进行了封装,所以很好的屏蔽掉了程序对底层系统的强制依赖,使得DTK开发的程序可以轻松的迁移到其它平台。

DDE

DDE: deepin Desktop Environment, deepin 系统默认的桌面环境。DDE 包括前端界面以及后台服务组成。

DDE 前台界面

DDE 环境的前端界面提供用户友好的图形化系统,由多个提供特定功能的组件组成,其主要功能如下:

  • 任务栏

对应于 dde-dock项目 ,提供应用的图标驻留、应用快捷启动图标、托盘插件等功能,对打开的应用图标、应用快捷启动图标、托盘等进行管理,是各类界面操作的最直接入口。应用快捷启动图标会和正在运行的应用程序的图标进行融合,在界面样式上会进行一定程度的区分。托盘插件区域提供了丰富的接口,提供了插件扩展支持,可以显示各类快捷操作

  • 桌面

对应于 dde-desktop 项目,提供桌面目录文件管理视图,支持多种桌面图标排列方式,支持对桌面文件夹的内容进行简单的管理。支持插件系统对功能进行扩展,例如桌面图标角标插件,文件图标预览插件等。

  • 启动器

对应于 dde-launcher 项目,提供系统和用户安装的全部应用列表及启动入口,可以方便的搜索系统已经安装的应用,并提供应用启动管理入口。提供两种不同大小界面,不同的界面类型有不一样的侧重点。

  • 文件管理器

对应于 dde-file-manager 项目提供文件、目录的管理和设备的访问功能,提供对系统的文件,U 盘等设备进行管理的友好界面。支持简单的设备文件系统格式化。支持插件系统,可以对文件的图标角标、内容预览进行插件支持。

DDE 后台服务

DDE 后台服务采用模块化的设计风格,通过接口约束模块,通过注册管理服务对模块进行管理,然后由注册管理服务根据依赖关系启动模块。

DDE 后台服务要求模块通过 DBus 对外提供接口,实现进程间通信。

DDE 后台服务包括系统级别服务和用户级别服务。系统级别服务为 dde-system-daemon,由 systemd 启动。用户级别服务由 dde-session-daemon 提供,由 startdde 启动。

dde-system-daemon 主要提供系统级服务,即需要 root 权限的和与用户无关的接口,包含的主要模块如下:

  • accounts:提供用户管理的功能和接口。
  • apps:提供应用信息启动次数,系统中应用变更监听的功能和接口。
  • fprintd:对 fprintd 接口的封装,提供开源的指纹接口。
  • gesture:使用 libinput 的接口监听触摸板和触摸屏的事件,发送触摸板手势信号和触摸板长按信号。
  • network:提供一些需要 root 权限操作的网络接口。
  • power:提供电池的信息的功能和接口,以及一些通用的电源接口。
  • timedated:时间日期管理的服务和接口。
  • airplane_mode:飞行模式的接口。

dde-session-daemon 用户级的服务接口,据 Linux 的最小权限划分,只包含不需要超级权限的功能模块,主要提供的模块包括:

  • dock:提供任务栏管理的功能和接口。
  • trayicon:提供托盘应用管理的功能和接口。
  • audio:提供声音管理的功能和接口。
  • screensaver:基于 org.freedesktop.Screensaver 标准实现的接口,主要提供idle、屏保等功能管理的接口。
  • sessionwatcher:提供桌面会话监听功能,随着会话的变更更改会话的状态。
  • power:提供电源计划管理功能。
  • launcher:提供启动器管理功能和接口,包括应用列表、应用排序、应用卸载等功能。
  • keybinding:快捷键管理模块,提供快捷键更改、自定义快捷键等功能
  • appearance:主题、字体和高分屏等功能的管理接口
  • inputdevices:输入输出设备的管理模块,提供鼠标、键盘、触摸板、数位板等设备配置的功能。
  • housekeeping:磁盘空间检查模块,自动检查空间是否充足,并在不足时提示用户。

应用商店

应用商店是 Linux 下第一款有产品质量和交互体验优秀的应用商店。除了支持深度系列应用, 还通过 deepin-wine 支持 50+多款 Windows 应用,通过内置 Android runtime 支持 2000 多款 Android 应用(比如愤怒小鸟,各种视频客户端)。

应用商店从技术架构上,主要分为 lastore-daemon、lastore-session-helper、deepin-home-app-store 三个部分:

  • lastore-daemon:应用商店的核心部分,主要负责所有软件的安装程序的下载、哈希安全校验、依赖分析、本地缓存管理、软件安装、软件卸载和软件升级等工作,这个守护进程会和深度的软件仓库智能的通信,在后台保障整个操作系统应用的更新和安全守护。lastore-daemon 同时会在 apt/dpkg 程序中加入钩子,不论用户是从应用商店还是终端中安装的程序都会被商店守护进程管理和保护,避免一些高级用户从终端安装以后把系统的依赖弄坏。
  • lastore-session-helper:上面说的 lastore-daemon 默认就会有超级权限以进行软件包的管理,但是一些普通的用户会话级的操作,比如安装成功以后通过右上角通知提醒用户,本地化管理这些操作都是不需要超级权限的,为了最小化超级权限代码的执行范围,最大程度保证用户安装软件的安全,开发者就从  lastore-daemon 中剥离了这部分代码放到 lastore-session-helper 中以普通权限来执行。
  • deepin-home-app-store:主要包含商店客户端部分代码,商店的服务器一旦更新了新的软件后,就会通知 deepin-home-app-store进行页面刷新。还包括评论、评分等操作的界面接口。