因為最近在進行一些 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 的主要控制界面是怎麼樣生效的,其中包含了哪些關鍵功能。