深度桌面操作系统架构设计
Deepin
2017-02-02 18427字

今天就结合深度桌面操作系统给大家讲讲桌面操作系统的架构设计和原理细节,一来向外界讲讲深度这么多年都做了哪些工作,二来希望通过客观公正的事实向中国新一代的开源爱好者讲述怎么用正确的三观去贡献自己的力量。

什么是桌面操作系统?

简而言之,桌面操作系统就是大家平常个人电脑里面用的操作系统。 桌面操作系统应该是所有操作系统类型中最为复杂、研发技术难度最高的一种操作系统了。 世界上非常优秀的桌面操作系统有微软的Windows和苹果的Mac OS,其他的Linux桌面操作系统,比如Fedora、Suse、Ubuntu包括我们自己的deepin操作系统,虽然这十几年取得了长足的进步,但是相对于Windows和Mac OS,不论技术先进性、交互设计还是产品质量方面都还有非常大的差距。

桌面操作系统都有哪些部分组成?

一个普通用户使用的桌面操作系统的组成部分主要包括:

桌面操作系统所用编程语言介绍

桌面操作系统都需要那些编程语言呢? 就以深度桌面操作系统为例:

深度在2014年之前,自己做了一个WebKit/Html5的本地渲染引擎,可以直接用CoffeeScript像网页开发一样来编写桌面环境的界面,但是最后因为WebKit对于常驻性的桌面环境进程来并不适合,长时间不关机非常容易引起内存泄露和性能问题。包括2014年之前,采用的Python/QML来开发的应用都全部由 QtWidget/C++ 替换掉,主要是因为Python在国产CPU平台(龙芯、申威)上运行很慢,QML的解释特性和默认OpenGL渲染的机制都导致软件实际运行的性能不好。

深度这么多年几乎把所有的界面编程语言(Python、C、C++、CoffeeScript/JS、Golang)和几乎所有的图形界面库(wx、GTK+、Qt、WebKit、QML)都折腾过了。 最后停留在 Golang、C++、QtWidget 的技术选型上,因为这些技术不论从稳定性、兼容性还是性能都非常好。

什么是桌面环境?

桌面环境简单来说,就是在内核和X Server之上,写一批程序让用户登录后就可以直觉性、流畅的使用桌面、任务栏、开始菜单、文件操作和系统设置。

这个世界上从功能完整性和产品质量来看主要有四个桌面环境:

其他轻量型的桌面环境,比如LXDE、XFCE、Enlightenment虽然性能极佳,但是从桌面环境的功能完整性和交互设计的精致性上都不够,比较适合有一定技术深度,追求性能和自己配置多于开箱即用的技术型用户。

剩下的就是一堆平铺类窗口管理器,比如大家熟知的:awesome, i3, xmonad, dwm, stumpwm等等,这些窗口管理器型的桌面环境有300多个,我曾经为了研究所有桌面环境的特性,把这些窗口管理器都用过,最喜欢的是xmonad。这类窗口管理器的可以把个人的工作环境内存和性能消耗降到极低,而且可定制性极强,甚至可以通过编程来打造自己独一无二的工作环境。这类窗口管理器型的桌面环境比较适合开发人员和黑客,当然也不乏国内一大批装X用户。 ;)

桌面环境和那些换主题的工作差别在哪里?

可以说,桌面操作系统的核心技术和产品功力都聚焦在桌面环境上。 只有掌握了桌面环境这个古老而又深奥的核心技术,才能说在桌面操作系统上可以任意修改和改进,才能给用户带来更好的用户体验。

因为桌面环境强调的是从上至下全栈技术攻克,不论技术深度、技术全面性和代码工程量来说都是巨大的,开发一个功能完备的桌面环境需要20+人以上的团队工作最少2年以上才能打造出来,而且桌面环境的技术核心全部都依赖一批古老的协议,比如:x11、xcb、composite等基础技术,互联网上几乎没有文档教你怎么一步一步的构建桌面环境,现成的桌面环境因为发展多年,代码已经非常复杂,最多只能从核心代码片段有所学习。一个人要自上而下框架式的学习桌面环境核心技术并实现一套功能完备的桌面环境几乎不可能。

所以,大部分的Linux发行版都是基于Gnome、KDE改的,大多数都是在网上找一批主题(Gtk+主题、图标主题、光标主题、窗口边框主题、DM主题、锁屏主题)再配上一张好看的壁纸就可以做一套自己DIY的桌面环境。很多Linux社区的用户说,你看我自己都可以做桌面环境,甚至很多国内的Linux发行版厂商也是拿着社区的桌面环境然后换一套皮肤就去骗政府的钱,说自己是自主研发的操作系统(很可悲,这个世界上骗子永远比正直的人多)。

既然换套主题也可以很好,那么桌面环境和那些换主题的工作差别在哪里? 在我看来,主要在几个方面:

深度桌面环境是怎么构建的?

在说怎么构建桌面环境之前,先放三张深度桌面环境的图:

深度截图20170202162735.png

094325u3k3lym0yu034nc1.png

launcher5.jpg

是不是美哭了? 这就是自己从头构建桌面环境和只换皮肤主题的差别。

好了,前方专业技术高能, 请各位抓紧扶好,我要开始讲桌面环境架构了。 讲之前先放一张架构图:

深度桌面操作系统架构设计 (3).png

一个完整的桌面系统从技术剖面看,从下到上主要分这几层:

简单来说,桌面环境的设计和实现就是把所有底层抽象的硬件、库和各种各样的状态进行管理,最后通过界面的方式和合理的交互设计与用户进行交互,让用户可以自然、流畅的使用各种应用完成自己的工作。

这一章我只讲桌面环境的细节,像内核以及X Server的技术又是一个非常长的历史和篇幅, 请看官们自行Google内核以及X Server (X11、XCB)相关的文章来看,我就不展开叙述了。

关于应用商店和应用后面会详细讲, 所以这里我们就向大家详细描述一下从显示管理器到桌面环境都做了哪些事情?为了方便大家理解,全程不讲源代码,有开发经验的朋友可以直接去 github 上面查看我们的代码: https://github.com/linuxdeepin/ , 深度所有项目的源代码都是按照 GPL3 许可证实时开源的(只要内部代码审查机器人通过代码质量审查以后就会由机器人自动推送到 github )

深度截图20170202165633.png 首先看一下显示管理器,当X Server启动以后,根据系统启动服务的顺序,显示管理器就在 X Server 之后启动,深度系统使用的是由Ubuntu开发的LightDM, 其他主流的显示管理器还有 Gnome 的 GDM 和 KDE 的 KDM, 使用LightDM的原因主要是 LightDM 非常的轻量,不绑定任何桌面环境,而且提供Gtk+、Qt、Html5等各种前端界面的定制接口,非常方便。 显示管理器主要是根据系统中安装的用户的权限对正在登录的用户提供权限认证和多用户切换功能,一旦认证通过后就从 greeter (LightDM 定制的配置接口)中执行下一步启动程序(通常是桌面环境的初始化程序),以显示桌面环境。 Deepin 开发了一个基于Qt5的前端界面程序, deepin-greeter 主要长这样:

深度截图20170202170531.png

除了基本的用户认证、多用户切换、日期和关机功能以外,还会提供:

深度截图20170202170942.png 当显示管理器认证成功以后,就会调用 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) 对桌面环境和应用提供更为抽象和高级的服务。

备注: 很多社区的开发者经常质疑DDE就是基于Gnome的UI壳,没有自己的核心技术,希望懂编程的朋友查看深度的源代码 https://github.com/linuxdeepin/dde-daemon , 看看是否只是一个 Gnome 的壳。我非常尊重每一位技术开发者,但是真的对于那些完全不基于调查,只是简简单单基于对国内开发团队鄙视而轻言下结论的人感到痛心,这也是我今天写这篇文章的原因之一,希望国人基于事实支持好的产品和团队,停止一切不实的攻击和乱喷。

深度截图20170203103240.png

在深度桌面环境的后台守护进程基础之上,桌面环境会对外提供一个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 在开发过程中发展出来的二进制工具,方便深度桌面环境以外的应用可以直接使用这些工具,减少核心技术的重复开发:

dde-daemon dbus API: 这一部分主要是由dde-session-daemon和dde-system-daemon提供的DBus接口给深度控制中心前端界面使用的,外部应用程序也可以直接使用这部分API来快速开发,而不用自己研究和编写与系统底层软硬件打交到的代码,简单的说几个功能,感兴趣的朋友可以直接查看深度控制中心的界面代码来玩(https://github.com/linuxdeepin/dde-control-center):

说到用户体验的一致性,包括右键菜单、对话框、认证密码框这些看是小的地方(也是90% linux开发者不屑的地方),给用户带来的体验是最深刻的,一个产品的质量不光是你大老远一看很美或者主题很美,很多小细节的地方做好,才能得到用户的尊重。用户用到这些小细节的时候,会知道后面是一群用心的人在做事情,而不仅仅只是写个功能丢在那里就完事。

深度截图20170203101157.png

深度桌面环境的最后一部分就是深度桌面环境的UI展示层,主要有:

174415o3zi1puiuz1ede2i.png

深度截图20170202180050.png

深度截图20170202162735.png

launcher5.jpg

深度截图20170203104130.png

为什么要自己写桌面环境?

很多人都在问我, 为什么深度要自己写桌面环境,其实回答很简单:

  • 我希望给用户提供交互细节最简洁的操作体验,傻瓜式操作,不需要长时间学习
  • 我希望用户会因为UI细节精致的Wow一声, 就像第一次看到iPhone一样
  • 我希望用户看到很多贴心的小细节时,会觉得操作系统后面有一群人关心他们,贴心的功能会让他们会心一笑,而不是面对一台冰冷冷的机器

如果不自己写桌面环境,就达不到这些严苛的要求:

  • 我要能改每一像素,只要用户觉得不爽,一切都是用户为向导,而不是以开发者的个人喜好为导向
  • 快速改进,很多社区开发者都说你应该给Gnome或KDE提交补丁,对不起,明明可以10分钟做一个用户喜欢的功能的时候, 却要和各种专家开发者讨论1个月才合并补丁或者上游开发者根本就不理,Linux桌面就死在改一个功能慢的要死,最后大多数用户失去耐心,不陪你玩无奈的离开了
  • 统一的交互体验,统一的设计语言, 不要拼装,很多linux老用户除了宣扬开源文化和民主的决策(其实每个项目都是由创建者独裁)外,甚至拿着一大堆各式各样的社区demo作品美曰“社区协作”,深度只想系统和所有应用是能够堪比Windows/Mac的产品质量的艺术品

当很多社区开发者数以十年的只赞扬开源文化和协作的时候,我真想说,世界要让更多普通用户接触和认可Linux的情况下,开源文化才能更快更广泛的推广, 而不是偏执的自虐以后,自欺欺人拿着质量参差不齐的应用去洗脑那些不认同的普通用户,洗脑不行就开始鄙视和嘲讽。

其实做一个简单的类比,如果有人让你买一部丑到爆,难用到要死的手机,但是告诉你这手机里的每行代码都开源的,有多少人会真正买?我想大多数开源爱好者自己都不会买

很多时候,往往简单的换位思考就会认清开源社区的种种问题…

深度桌面环境的交互细节以及横向对比

下面我只简单的举一些深度桌面的小细节来说明为什么做桌面环境的必要性,以下这些特性不是什么黑科技,也不是深度才独有的,但都是研发团队通过用心思考,研究用户的痛点,通过简单的设计就能解决用户的问题,而不是浪费用户几小时甚至几天的时间去“忍受”系统。

2LTt1RD0Hv0IXlhD.jpeg

像这种贴心的设置,在深度桌面环境中随处可见,而这些交互细节的背后需要的是对用户场景的思考、换位思考理解用户痛苦以及完全掌控所有代码才能做到。 我一直都相信:好的系统是让用户觉得不多不少,刚刚好,而且很贴心。而不是堆砌满屏的开关选项,让用户看着就头疼,再天书文案纠结半天都不知道怎么做。

深度商店

深度商店是Linux下第一款有产品质量和交互体验优秀的应用商店,以前的社区的都只能叫软件管理工具。 这里你可以看到的所有高质量的软件都可以搜索,一键安装使用,再也不用自己折腾 myeclipse、sublime、 shadowsocks-qt5、迅雷、RTX等各种应用,所有软件都默认打包好放到软件仓库,也不用担心添加了哪个质量不佳的ppa把系统搞死了,所有的依赖默认就调好了,装完就用。

除了支持深度系列应用, 还通过 deepin-wine 支持50+多款Windows应用,通过内置 Android runtime支持200+多款Android应用(比如愤怒小鸟,各种视频客户端),通过和Intel合作开发 deepin-xwalk 直接支持html5应用(比如Gliffy等)还可以自己记住窗口大小(而不是打开一个贼大的浏览器)

所有deepin对Wine上游的代码级贡献大家都可以在 https://www.google.com.hk/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#newwindow=1&safe=strict&q=deepin.com+site:winehq.org 和 http://source.winehq.org/git/wine.git/?a=search&h=HEAD&st=commit&s=deepin 公开查询到 很多社区开发者说,我们用社区的Wine也能跑QQ, 为啥要用Deepin? 我只能说的是,社区版的Wine如果没有deepin这几年的贡献,你啥都跑不了,不管你换什么linux发行版。

这么多年deepin自己开发了几百万行GPL3的源代码,向上游贡献了无数的 commit, 我们更在意用户体验和功能更新,不想去比什么commit刷屏,但是一次又一次的被喷子们用各种逻辑瞎喷,希望这些喷子看看我们的代码再来喷我们。

深度截图20170203101553.png

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

深度造了哪些应用?

除了深度桌面环境和应用商店,我们自己截止到2017年1月,深度自己还造了15个精品应用和3款厂商联合开发应用,下面我只说每个应用的关键亮点,更多的细节只能感兴趣的用户自己体会了 https://www.deepin.org/original/ :

深度安装器:

w5lHLhyRd1IgMUL1.png

EkpcTsDu8vE3doxo.png

bk4SJmc6hHwbQPHQ.png

深度启动盘制作工具

深度启动盘制作工具

深度文件管理器

深度显卡管理工具

1.png

2.png

Linux 的私有显卡驱动如果安装失败,会导致图形环境直接崩溃,无法输入密码进入桌面,如果不是Linux技术专家,普通的用户完全没法正常卸载私有驱动和清理内核动态模块,甚至还需要修改一些Xorg配置才能修复好系统重新进入桌面。

深度显卡管理工具的做了几个核心的功能:

深度演示助手

deepin-presentation-assistant-cn1.png

deepin-presentation-assistant-cn2.png

deepin-presentation-assistant-cn3.png

深度备份还原工具

1-1.png

2 (1).png

深度截图工具

project-screenshot-1.png

深度录屏工具

deepin-screen-recorder2_zh.jpg

深度录音工具

2-cn.jpg

深度影院 deepin-movie-1.png

深度音乐

project-music-3.png

深度看图

deepin-imageviewer-3.png

深度终端

deepin-terminal-1.png

深度系统监视器

5957-85f90ad9b3de39b2.png

更多关于深度系统监视器的技术细节可以查看:http://www.jianshu.com/p/deb0ed35c1c2

深度远程协助

project-remoteassistance-1.png

project-remoteassistance-2.png

深度手册

deepin-manual2.png

深度云打印/深度云扫描


![project-cloudscan-2.png](//manateelazycat.github.io/pics/dde/5957-309a61d3871ab835.png)

深度取色器

01-255x150.jpg

02-255x150.jpg

深度开源字体

deepin-opensymbol1.jpg

deepin-emacs

deepin-emacs2-1.png

f60d05d0-8c1e-11e3-98c7-a14fa75e3ff7.png

对上游社区的贡献

深度操作系统的发展是站在上游社区的基础之上才能走到今天,除了我们自己开发了数百万行代码的原创开源项目外,我们深知只有秉承 “取之于开源,回馈予开源” 的开源理念,才能将我们自己的代码和功能改进回馈予上游开源社区,才能更好的推动全世界的开源运动向前不断发展。

深度团队对于上游社区,比如Wine、Emacs、Gtk+、Miracast都做了非常多的贡献,比如Miracast电脑向电视投射的功能就是Deepin团队主导开发的。

更多对上游社区的代码贡献可以查看https://www.deepin.org/developer-community/community-contributions/ 所有代码都是在GPL3的协议下进行贡献。

国内生态应用

推动国内开源社区的发展,光靠自己开发系统和应用远远不够,还要联合国内顶尖的软件厂商开发Linux版应用才是未来,下面举一下deepin在应用生态的贡献:

11293849zi444azmi33e9g.jpg

7fe698e9d1c9f041fc1bc9b8c899fb60_b.png

开发这些应用,深度投入了巨大的财力人力不求回报,只求国内的linux用户能够更加幸福一点,我们未来会联合国内的厂商开发更多的Linux应用,我们坚信Linux生态普及的那一天。

为什么开源的轮子不能用?

深度造了那么多轮子,为什么不用社区的?

  • 社区技术大拿很多,但是技术强大的同时能把一个应用的UI和交互细节做好的开发者鲜有
  • 社区大部分软件都是面向开发者,功能确实强大,但是对于小白用户来说太复杂了
  • 深度希望十年之内解决linux桌面的问题,我们内部每天几百个commit的快速迭代,社区主导开发完了花都谢了
  • 希望做出来再吹牛,不想天天在社区打嘴泡

十几年开源社区为什么做不好桌面?

  • 主要用户群体是开发者,大多数开发者喜欢黑客般的各种功能堆在一起,而普通用户只需要简单易用的产品
  • 太过于碎片化:大家不齐心,每个人都造半成品互相打压,没有形成合力,最后社区除了大量的半成品,并没有多少应用能够比Windows软件更好(真正能和Windows平台堪比的应用不超过50个)
  • 鄙视小白的氛围不好,技术稍微好一点的人就打击小白用户,大量真正的桌面小白用户走了以后,最后导致大家都不关心桌面的细节体验
  • 做的太少,说的太多,有行动,10年就是翻天覆地变化,而不是大家时间长了都失望了

开源社区擅长什么?

  • 开源社区适合做远程协助,碎片化的事情,比如文档和翻译,深度社区全世界的翻译贡献者就超过300多名: https://www.transifex.com/linuxdeepin/public/ , 曾经创造西班牙语一星期就翻译完整个系统的奇迹
  • 开源社区适合吐槽, 我说的是客观的吐槽,https://bbs.deepin.org/ 各种用户帮助开发团队发现更多测试版的bug和非常非常好的反馈建议
  • 开源社区适合打包移植, https://www.deepin.org/dde/desktop-transplantation/ 目前深度桌面已经移植到 Arch, Manjaro, SparkyLinux, openSuse, Ubuntu, Gentoo, Fedora 等发行版

国内技术圈偏见

我在开源社区十几年看到国内技术圈很多偏见,最主要的有几个:

前途漫漫,还需努力

深度从2004年到现在已经努力了13年了,未来还有很长路要走,希望最终的努力可以达到两个目标:

希望对中国的开源社区做出更多贡献

希望大家看了我的文章,好好努力,多多为开源社区做力所能及的贡献!