概述

為了讓各位開發者更好的了解深度操作系統,本文將以圖文并茂的形式,講解深度桌面操作系統的架構設計和基本模塊的功能,幫助開發者縱觀全局,更好的理解設計理念和方向,代碼實現和模塊依賴細節在此忽略,詳細代碼請各位開發者以https://github.com/linuxdeepin中的代碼實現為準。

架構總覽

5957-197f374e850297eb (1)

一個完整的桌面系統從技術剖面看,從下到上主要分這幾層:

內核驅動層 主要用于驅動硬件,除了CPU、內存、磁盤外,最主要的要是要廣泛兼容不同的網卡、顯卡、聲卡和外設等硬件設備。
顯示服務層 從內核引導到plymouth(我們俗稱的開機動畫)后,只要你見到登錄界面輸入密碼的時候,這時候X Server已經起來了, X Server簡單來理解就是Linux系統中掌握著繪制圖形界面生殺大權的“天神”,所有程序要繪制圖形的時候都要發送消息到 X Server, X Server才會給你畫出來。同時X Server也是事件輸入(鍵盤鼠標)輸出(顯示器)的抽象層,開發者可以不用考慮底層驅動和顯卡驅動細節,直接就可以使用X11/XCB的API進行應用開發,只不過更多的開發者是使用Gtk+/Qt這些在X11/XCB更上層的API進行應用開發。
顯示管理器 簡單的理解就是你看到的登錄界面提示你輸入密碼的那個位置。
資源管理器 主要由一系列的底層守護程序來監控硬件的狀態,并匯報給上層的桌面環境和應用進一步操作,比如常見的就有網絡、電源、磁盤、藍牙、聲音、鍵盤、打印等。
桌面環境 以深度桌面環境為例,主要包括桌面環境后臺服務和守護進程、桌面環境對外提供圖形開發工具庫、二進制工具、DBus API服務和桌面環境UI界面層幾個部分組成的,后面我會詳細講每一個細節。
應用商店 主要提供系統的軟件安裝、卸載、升級等操作,保證用戶可以安全方便的進行軟件管理,同時提供了商店的評論和評分等功能。
應用程序 主要包括深度開發的系列應用、合作開發的國內應用、Android應用、Windows應用和網頁應用。

顯示管理器

首先看顯示管理器,當X Server啟動以后,根據系統啟動服務的順序,顯示管理器就在 X Server 之后啟動。

深度系統使用的是由Ubuntu開發的LightDM,其他主流的顯示管理器還有 Gnome 的 GDM 和 KDE 的 KDM,使用LightDM的原因主要是 LightDM 非常的輕量,不綁定任何桌面環境,而且提供Gtk+、Qt、Html5等各種前端界面的定制接口,非常方便。

顯示管理器主要是根據系統中已配置用戶的權限對正在登錄的用戶提供權限認證和多用戶切換功能,一旦認證通過后就從 greeter (LightDM 定制的配置接口)中執行下一步啟動程序(通常是桌面環境的初始化程序),以顯示桌面環境。

Deepin 開發了一個基于Qt5的前端界面程序, deepin-greeter 主要長這樣:

5957-208859ad50f88211 (1)

除了基本的用戶認證、多用戶切換、日期和關機功能以外,還會提供:

  • 多媒體的控制接口(右下角),方便用戶鎖屏和切換用戶的時候切換音樂和暫停音樂
  • 當系統使用多屏幕時,啟動和解鎖時,會根據用戶的鼠標位置切換鎖屏主界面
  • 在用戶輸入密碼的時候,就直接啟動一些系統級的服務,比如電源、賬戶、亮度等守護程序,這樣用戶輸入密碼的過程很多系統服務就加載好了,相對于其他桌面環境同等服務縮短30%以上的登錄時間。

DDE后臺服務

當顯示管理器認證成功以后,就會調用 greeter 的 exec 參數,深度桌面環境就是 startdde, startdde 從名字看很容易理解,就是啟動深度桌面環境的引導程序,為了讓深度桌面環境可以正常啟動和顯示,調用startdde時會執行以下操作:

  • 基本的桌面會話管理,比如大家熟知的注銷、重啟等操作;
  • 按照 xsettings 主題規范設置整個系統的主題,保證桌面環境以及桌面環境的應用,不論Gtk+還是Qt都可以正常的加載用戶設置的主題。屏幕DPI設置也是在這個階段初始化完成的;
  • 根據 freedesktop 的各種規范,規范應用程序的啟動方法, 包括執行 *.desktop 文件的命令,啟動提醒等;
  • 多屏的管理,保障桌面環境在多屏情況下,可以在正常的主屏顯示任務欄和桌面程序;
  • 開機啟動服務的順序管理,比如會優先啟動 dde 核心組件, 才運行啟動其他應用程序,防止所有開機程序在登錄的一瞬間同時啟動,而這時候往往很多系統服務(比如DBus) 都還沒準備好,大家一團亂搶CPU資源不但無法快速啟動,還會導致其他程序都無法啟動,想象一下3個人同時擠一個公交車門是什么狀態?這時候startdde 就是登錄后到dde守護進程啟動之前的裁判,只有它授權的程序才能啟動, 沒有授權的都進入暫緩狀態,直到更優先的程序啟動完畢;

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 做的事情舉例說明:

  • 提供用戶的創建、刪除和管理功能
  • 管理多個屏幕的不同狀態,包括位置、方向、分辨率和亮度等
  • 管理不同文件類型的默認程序和主題設置
  • 管理網絡的有線、無線、VPN、DSL等網絡設置
  • 管理藍牙、聲音、日期、時間時區等設置
  • 管理電源、鍵盤鼠標設置
  • 管理系統的升級和grub設置
  • 提供多點觸摸板手勢的服務

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 API

在深度桌面環境的后臺守護進程基礎之上,桌面環境會對外提供一個API層,包括圖形開發工具庫、二進制工具和DBus API接口,供桌面環境和應用程序直接調用,而不用自己重頭開發,其中DBus API部分都通過DBus總線在應用調用特定的接口時動態喚醒(默認不常駐內存),任何語言編寫的應用都可以輕松調用,根據上面圖所示,從左到右分別進行介紹。

DTK

DTK (Deepin Tool-Kit) 是基于Qt5開發的一整套UI圖形庫,方便統一的編寫深度桌面和深度系列應用,主要的功能有:

  • 提供單實例的接口,方便直接使用,不用造輪子
  • 提供XCB窗口移動、縮放等一系列函數,無邊框的窗口不用自己折騰幾大本X11/XCB 的書了,開發者全部都做好了
  • 提供一大票美觀的自繪控件,不用自己造Qt控件了,拉著直接用

感興趣的開發者查看源代碼:https://github.com/linuxdeepin/deepin-tool-kit,基于我們的DTK比直接基于Qt5開發,能夠更快的開發出美輪美奐的產品, 同時也歡迎社區開發者大神吐槽和提交補丁。

dde-api binary utils

主要是 dde-session-daemon 和 dde-system-daemon 在開發過程中發展出來的二進制工具,方便深度桌面環境以外的應用可以直接使用這些工具,減少核心技術的重復開發:

  • greeter-helper: 提供鎖屏界面的語言,鍵盤布局,主題等內容的設置接口
  • image-blur-helper: 提供壁紙模糊服務,你可以通過這個服務快速模糊一張圖片,而不需要自己編寫模糊算法,深度團隊做的模糊算法,即使在龍芯芯片上都只需30ms的時間,要遠遠快于社區的模糊代碼的性能
  • lunar-calendar: 提供日歷查詢服務
  • powersupply: 對電源接口的更高層封裝,使用 udev 來獲取電源狀態以及電池信息
  • soundutils: 提供了播放桌面音效的相關接口
  • validator: 用戶名正確驗證器,不用自己編寫一大堆正則表達式來做這件枯燥的事情
  • cursor-helper: 提供了光標主題的設置接口
  • drandr: 對 x11 randr api 更高級的接口封裝,提供顯示器的詳細信息
  • dxinput: 對 x11 xi/xi2 api 更高級的接口封裝,提供輸入輸出設備的屬性獲取及設置功能
  • 后面還有很多其他高級服務,都是由https://github.com/linuxdeepin/dde-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等)代碼,大大節約了應用開發者編寫高級功能的時間和投入成本。

DDE UI

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

dde-kwin 基于 KWin 實現,增加了對 DDE 和 gtk 應用程序的兼容性,支持了和deepin桌面環境中各個組件的交互,且在此基礎上實現了一套符合deepin設計的用戶界面。KWin 原生支持 2D/3D 模式切換,可直接代替 deepin-wm 和 deepin-metacity 兩個窗管的所有功能
dde-desktop 提供桌面基本的文件網格顯示和基本的文件操作,dde-desktop通過libdde-file-manager這個庫來保證所有的文件顯示和文件操作效果和深度文件管理器(dde-file-manager) 保持一致
dde-dock 主要提供圖形化的任務欄圖標管理和狀態維護、在屏幕中位置以及兩種風格的切換
dde-launcher 主要提供系統已經安裝應用的展示、搜索和啟動等功能
dde-control-center 提供對所有硬件資源控制的前端界面,包括賬戶、主題、網絡、藍牙、聲音、外設、默認設置程序、日期時間、電源以及系統升級等模塊
dde-osd 當按下音量、亮度等多媒體按鍵時在屏幕中間顯示快速提示
deepin-menu 統一所有軟件右鍵菜單的UI細節
deepin-notificaiton 通過右上角提供系統的通知服務,根據不同應用顯示不同的快速跳轉按鈕
deepin-policykit-agent 主要按照深度的UI設計規范做個了密碼認證對話框,保證所有程序,不論是Gtk+還是Qt寫的,在密碼驗證的時候都彈出UI細節一模一樣的對話框
deepin-icon-theme 世界上風格最統一,數量最多的圖標,包括應用商店上千款應用的圖標,具體請查看https://github.com/linuxdeepin/deepin-icon-theme/tree/master/deepin
deepin-gtk-theme 主要是針對深度自己的設計規范來重新制作的整套窗口主題(Gtk+2、Gtk+3、Qt4、Qt5)
deepin-default-settings 深度桌面環境默認的設置,比如默認的壁紙、圖標主題等默認設置
qt5-integration 給Gtk+和Qt源碼編寫了補丁,保證所有程序彈出的文件打開對話框都是完全一致的體驗,不論是Gtk+還是Qt編寫的程序,再也不用為不同圖形庫開發的程序彈出不同風格的文件打開對話框而煩惱

深度應用商店

深度商店是Linux下第一款有產品質量和交互體驗優秀的應用商店。

除了支持深度系列應用, 還通過 deepin-wine 支持50+多款Windows應用,通過內置 Android runtime支持200+多款Android應用(比如憤怒小鳥,各種視頻客戶端),通過和Intel合作開發 deepin-xwalk 直接支持html5應用(比如Gliffy等)還可以自己記住窗口大小(而不是打開一個賊大的瀏覽器)

5957-d8c6dd058a614f09 (1)

深度應用商店從技術架構上,主要分為lastore-daemon、lastore-session-helper、deepin-appstore三個部分:

  • lastore-daemon:應用商店的核心部分,主要負責所有軟件的安裝程序的下載、哈希安全校驗、依賴分析、本地緩存管理、軟件安裝、軟件卸載和軟件升級等工作,這個守護進程會和深度的軟件倉庫智能的通信,在后臺保障整個操作系統應用的更新和安全守護。lastore-daemon同時會在 apt/dpkg 程序中加入鉤子,不論用戶是從應用商店還是終端中安裝的程序都會被商店守護進程管理和保護,避免一些高級用戶從終端安裝以后把系統的依賴弄壞。
  • lastore-session-helper:上面說的lastore-daemon默認就會有超級權限以進行軟件包的管理,但是一些普通的用戶會話級的操作,比如安裝成功以后通過右上角通知提醒用戶,本地化管理這些操作都是不需要超級權限的,為了最小化超級權限代碼的執行范圍,最大程度保證用戶安裝軟件的安全,開發者就從 lastore-daemon 中剝離了這部分代碼放到lastore-session-helper中以普通權限來執行。
  • deepin-appstore:這個就是大家上面看到客戶端部分的代碼,簡單來說就是一個CEF框架基礎上構建的應用程序殼,處理客戶端本地的用戶交互然后嵌入一個網頁,商店的服務器一旦更新了新的軟件后,就會通知deepin-appstore進行頁面刷新。還包括評論、評分等操作的界面接口。從技術的角度來形容,deepin-appstore就是一個具有本地客戶端操作和樣子的簡易瀏覽器。