深度桌面操作系统为例:
原链接:深度桌面操作系统的构架设计
Linux本身没有图形界面,Linux现在的图形界面的实现只是Linux下的应用程序实现的。
桌面环境简单来说,就是在内核和X Server之上,写一批程序让用户登录后就可以直觉性、流畅的使用桌面、任务栏、开始菜单、文件操作和系统设置。
X是协议,不是具体的某个软件就像是HTTP协议,IP协议一样,一个基于X的应用程序需要运行并显示内容时它就接到X服务器,开始用X协议和服务器交谈,比如X应用程序要在屏幕输出一个圆,X应用程序只负责告诉X服务器在屏幕什么地方用什么颜色画一个多圆,而具体的画的动作交给服务器。
一个完整的桌面系统从技术剖面看,从下到上主要分这几层:
当X Server启动以后,根据系统启动服务的顺序,显示管理器就在 X Server 之后启动,深度系统使用的是由Ubuntu开发的LightDM, 其他主流的显示管理器还有 Gnome 的 GDM 和 KDE 的 KDM, 使用LightDM的原因主要是 LightDM 非常的轻量,不绑定任何桌面环境,而且提供Gtk+、Qt、Html5等各种前端界面的定制接口,非常方便。
显示管理器主要是根据系统中安装的用户的权限对正在登录的用户提供权限认证和多用户切换功能,一旦认证通过后就从 greeter (LightDM 定制的配置接口)中执行下一步启动程序(通常是桌面环境的初始化程序),以显示桌面环境。
除了基本的用户认证、多用户切换、日期和关机功能以外,还会提供:
当显示管理器认证成功以后,就会调用 greeter 的 exec 参数,深度桌面环境就是 startdde, startdde 从名字看很容易理解,就是启动深度桌面环境的引导程序,为了让深度桌面环境可以正常启动和显示,startdde调用时会执行以下操作:
startdde 启动以后,首先会启动 dde-session-initializer 这个进程,这个进程的主要目的是提供给任务栏和启动器后台服务,主要包括:
dde-session-initializer 就相当于任务栏和启动器的后台守护进程,提供了任务栏和启动器的核心功能,如果没有这个程序,我们日常的应用图标点击、开机启动包括程序窗口的切换都无法进行。
dde-session-initializer 本来是 dde-session-daemon 的一部分,为了加快用户的登录到桌面的速度,从 dde-session-daemon 中分离出来,用以加速任务栏和启动器的显示。
dde-session-daemon 和 dde-system-daemon 就是整个桌面操作系统的后台守护程序,这两个进程维护了所有硬件的状态,包括前面说的网络、电源、磁盘、蓝牙、声音、打印、授权、共享文件、键盘鼠标等,相当于对资源管理器的各种守护进程进行了更高层次的代码封装,把面向底层硬件的状态的接口转换成面向用户设计导向的接口。
根据Linux的最小权限划分,又把所有的后台服务分成 dde-session-daemon 和 dde-system-daemon 两个进程,dde-session-daemon 只掌握那些不需要超级权限的功能模块,比如声音、键盘鼠标、日期时区等。dde-system-daemon 掌握那些需要超级权限的功能模块,比如电源、账户、文件操作、亮度等。通过超级权限的不同进程沙箱的划分,保证执行超级权限的进程被限制在最小化的范围,避免因系统权限传导而导致的很多安全事件。
dde-session-daemon 和 dde-system-daemon 做的事情我简单列举一下吧:
dde-sessin-initalizer、dde-session-daemon以及dde-system-daemon从功能上,相当于Gnome的 gnome-session-daemon 所做的事情,只不过深度团队根据用户的需要以及很多优化加速设计,用 Golang 重写了整个后台守护进程的代码。可以说 DDE 和 Gnome以及KDE一样,都是调用底层的库(network-manager、upower、udisk、bluez、pluseaudio、cups、polkitd、gvfsd) 对桌面环境和应用提供更为抽象和高级的服务。
在深度桌面环境的后台守护进程基础之上,桌面环境会对外提供一个API层,包括图形开发工具库、二进制工具和DBus API接口,供桌面环境和应用程序直接调用,而不用自己重头开发,其中DBus API部分都通过DBus总线在应用调用特定的接口时动态唤醒(默认不常驻内存),任何语言编写的应用都可以轻松调用,根据上面图所示,从左到右分别进行介绍。
DTK:
DTK (deepin tool kit) 是基于Qt5开发的一整套UI图形库,方便统一的编写深度桌面和深度系列应用,主要的功能有:
感兴趣的开发者自己看源代码吧: https://github.com/linuxdeepin/deepin-tool-kit , 基于我们的DTK比直接基于Qt5开发,能够更快的开发出美轮美奂的产品, 同时也欢迎社区开发者大神吐槽和提交补丁。)
dde-api binary utils:
这一层主要是 dde-session-daemon 和 dde-system-daemon 在开发过程中发展出来的二进制工具,方便深度桌面环境以外的应用可以直接使用这些工具,减少核心技术的重复开发:
udev
来获取电源状态以及电池信息x11 randr api
更高级的接口封装, 提供显示器的详细信息x11 xi/xi2 api
更高级的接口封装, 提供输入输出设备的属性获取及设置功能dde-daemon dbus API:
这一部分主要是由dde-session-daemon和dde-system-daemon提供的DBus接口给深度控制中心前端界面使用的,外部应用程序也可以直接使用这部分API来快速开发,而不用自己研究和编写与系统底层软硬件打交到的代码,简单的说几个功能,感兴趣的朋友可以直接查看深度控制中心的界面代码来玩(https://github.com/linuxdeepin/dde-control-center):
查询当前系统有几个屏幕,哪些屏幕是主屏,分辨率是多少?
查询当前系统的语言、亮度、音量等设置
查询当前系统的网络链接状态:连接的是无线还是有线,有没有开启VPN?
查询当前系统的日期时间、时区、键盘鼠标等外设的状态
只要控制中心界面显示的所有硬件状态,都可以通过dde-api提供的DBus接口服务查询到,而这些DBus API后面的源代码都是深度操作系统研发人员经过非常多的时间打磨好的,不用自己痛苦的去裸写底层库(network-manager、pluseaudio、bluez、upower、udisk等)代码,大大节约了应用开发者编写高级功能的时间和投入成本。
说到用户体验的一致性,包括右键菜单、对话框、认证密码框这些看是小的地方(也是90% linux开发者不屑的地方),给用户带来的体验是最深刻的,一个产品的质量不光是你大老远一看很美或者主题很美,很多小细节的地方做好,才能得到用户的尊重。用户用到这些小细节的时候,会知道后面是一群用心的人在做事情,而不仅仅只是写个功能丢在那里就完事。
深度桌面环境的最后一部分就是深度桌面环境的UI展示层,主要有:
深度应用商店从技术架构上,主要分为lastore-daemon、lastore-session-helper、deepin-appstore三个部分:
链接:https://github.com/linuxdeepin
方便的GO绑定代码,用于自动生成DBUS服务。
仓库链接:https://github.com/linuxdeepin/go-dbus-factory
Deepin GoLang 库是一个包含许多有用的 go 例程的库,用于 glib、gettext、存档、图形等。
仓库链接:https://github.com/linuxdeepin/go-lib
生成文档,在项目根目录执行
cmake -B build
(实验主题是否正确cmake -Bbuild -DBUILD_DOCS=1 -DBUILD_THEME=1)
cmake --build build --target doxygen
xdg-open build/docs/html/index.html
DTK (deepin tool kit) 是基于Qt5开发的一整套UI图形库,便于编写风格统一的深度桌面和深度系列应用,主要的功能有:
DTK链接:https://github.com/orgs/linuxdeepin/repositories?q=dtk
DTK核心仓库:
若要从源码编译、安装dtk组件,请按照dtkcore > dtkgui > dtkwidget的顺序编译,且保证dktcore、dtkgui、dtkwidget的版本一致。如果不参与开发,则推荐您切换到相应的 tag 版进行构建
更改源
# 更改源以获取 DTK 源码、相关依赖软件
sudo sed -i "s%#deb-src%deb-src%g" /etc/apt/sources.list
sudo apt update
从源码编译DTK组件,则需要首先安装基础环境,打开终端输入以下命令:
sudo apt install git build-essential cmake devscripts doxygen graphviz
尝试以openkylin安装,其中graphviz无法安装。
源码编译
dtkcore
git clone -b [tags] https://github.com/linuxdeepin/dtkcore.git
cd dtkcore
sudo apt build-dep ./
cmake -B build
cmake --build build -j$(nproc)
dtkgui
git clone -b [tags] https://github.com/linuxdeepin/dtkgui.git`
cd dtkgui
sudo apt build-dep ./
cmake -B build
cmake --build build -j$(nproc)
dtkwidget
git clone -b [tags] https://github.com/linuxdeepin/dtkwidget.git
cd dtkwidget
sudo apt build-dep ./
cmake -B build
cmake --build build -j$(nproc)
qt5integration
git clone -b [tags] https://github.com/linuxdeepin/qt5integration.git`
cd qt5integration
mkdir build && cd build
sudo apt build-dep ../
qmake ..
make
若编译完成后需要安装有两种可选方案:
debuild -us -uc -b #打包成deb包可分享给他人
sudo make install #源码安装
推荐使用debuild命令。
make install命令适用于打包调用,直接这种方式安装可能会破坏环境,风险自理。
脚本
#!/bin/sh
# DTK主要就是下面几个库
DTK_LIST="dtkcore dtkgui dtkwidget"
QT5INTEGRATION="qt5integration" # 因为qt5integration是qmake编译的单独写一个
# 1.更改源以获取 DTK 源码、相关依赖软件
sudo sed -i "s%#deb-src%deb-src%g" /etc/apt/sources.list
sudo apt update
# 2.安装 git、Qt、编译工具集
sudo apt -y install git qtcreator qt5-default qtdeclarative5-dev g++ cmake qttools5-dev build-essential
# 安装dtk模板(qtcreator新建项目的dtk模板)
sudo apt install -y qtcreator-template-dtk
# 3. 安装 DTK 编译环境
sudo apt -y build-dep $DTK_LIST
# 4.在桌面创建目录存放源码
WORK_SPACE=~/Desktop/DTK_SRC && mkdir -p $WORK_SPACE && cd $WORK_SPACE
# 5.下载代码
apt source $DTK_LIST
# 6.建立 build 目录并编译、安装
SRC_LIST=$(find . -maxdepth 1 -mindepth 1 -type d)
for proj in $SRC_LIST;
do
mkdir -p $proj/build && cd $proj/build;
cmake .. && make -j2 && sudo make install && cd $WORK_SPACE;
done;
# 7.创建目录存放qt5integration源码
QT5INTEGRATION_WORK_SPACE=~/Desktop/QT5INTEGRATION_SRC && mkdir -p $QT5INTEGRATION_WORK_SPACE && cd $QT5INTEGRATION_WORK_SPACE
apt source $QT5INTEGRATION
# 8.建立 build 目录并编译、安装
QT5INTEGRATION_SRC=$(find . -maxdepth 1 -mindepth 1 -type d)
mkdir -p $QT5INTEGRATION_SRC/build && cd $QT5INTEGRATION_SRC/build
qmake .. && make -j2 && sudo make install
echo "======================编译完成========================"
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。