天天看點

簡單說下 systemui

因為最近在進行一些 systemui 的開發,是以想簡單地介紹一下筆者現在所認知的 systemui(目前的了解還是很淺的,希望高手們勿噴……)。

systemui 是一個 Android 的系統級别的 apk 應用,其中有系統的 狀态欄、導航欄、通知、鎖屏 等相關操作的實作。這通常是做 Android 系統開發的開發者會接觸的事情。而對于和筆者類似的一般安卓語言碼農,通常是沒有要求去接觸 systemui 的。

如果要學習 systemui 的話,網上的資料比較少。比較有用的資料是

google AOSP 裡的一篇介紹車載系統 systemui 怎樣重寫的指導,其中粗略地設計了部分 systemui 的知識。連結

鄧凡平老師的《深入了解 Android 卷 3》裡有一章專門借助源碼介紹 systemui 。書裡使用的源碼是比較早期的 Android 版本的代碼,和最新的 AOSP 源碼的很多類結構都有不同,但是主要功能類之間的關系、關鍵方法都是沒變的,可以用來做參考學習的。

百度搜尋 "systemui" 可以搜到一些相關的資料,其中有一些也說得很不錯。

筆者水準有限,是以本篇隻是簡單描述下這個 systemui 可以做什麼,并不進行深入的原理剖析。

上面提到了,systemui 的特征是:

是一個 apk , 而不是在建構 Android 系統 ROM 的時候打進去的代碼。在 Android 系統啟動的時候,通過 SystemServer 啟動該應用。

負責了 Android 系統最基本的操作的實作,因為沒有 systemui 的話就無法進行 UI 互動,是以筆者覺得這個可以說是 Android 系統最基本的視圖部分了。

這就說明,systemui 是一個單獨的 apk,這一點帶來的影響就是我們可以單獨開發 systemui ,而不需要每次修改完之後都重新打 ROM 刷機。隻需要通過 <code>adb push</code> 到裝置中,重新應用就行了。

筆者接下來簡單說下 systemui 裡面都做了什麼?修改 systemui 可以做到什麼?

主要負責的功能大概可以分為三部分:

狀态欄

狀态欄不光隻有一般所了解的頂部包含時間、信号強度圖示等資訊的一個長帶狀的“狀态欄”。除了這個長條狀态欄外,同時還包含了 從頂部下拉出現的 QS(QuickSettings,也就是我們下拉出現的 ”打開關閉 wifi“ 、”打開關閉藍牙“ 、”打開關閉飛行模式“ 等的快捷操作) 通知欄的展示以及相關操作

導航欄

即底部多按鈕導航欄的實作,以及 手勢導航欄 的實作。

鎖屏

鎖屏的實作和處理,這部分包含各種解鎖功能的展示。

這裡雖然分成了三部分,但是這三部分是有很緊密的關聯的,因為 systemui 包的功能很複雜(需要處理很多精美動畫效果以及點選事件的處理),是以代碼邏輯也十分複雜。其複雜表現在這幾個方面:

功能互動

雖然 AOSP 的高手開發者們已經盡量将代碼寫得健壯易讀,但是 systemui 要支援的需求是在太過複雜。是以其中 快接入口、通知欄、導航欄、鎖屏 都互相有互動,使得閱讀修改都極容易被新的問題帶偏。

繪制以及手勢判斷

systemui 裡的手勢觸摸極其複雜,大部分的 UI 元素都是 apk 自定義的 view 。是以 measure /layout / draw / touch 都做了很多自定義。這也導緻在閱讀這部分繪制-事件邏輯的時候很不容易看明白。

systemui 東西很複雜,筆者現在的水準不敢随便分析原理,隻能簡單說下,以期望讀者朋友們看到了可以大概知道 Android 的主要控制界面是怎麼樣生效的,其中包含了哪些關鍵功能。

繼續閱讀