簡單說下 systemui


簡單說下 systemui

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

systemui 是什么?

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

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

  • google AOSP 里的一篇介紹車載系統 systemui 怎樣重寫的指導,其中粗略地設計了部分 systemui 的知識。鏈接
  • 鄧凡平老師的《深入理解 Android 卷 3》里有一章專門借助源碼介紹 systemui 。書里使用的源碼是比較早期的 Android 版本的代碼,和最新的 AOSP 源碼的很多類結構都有不同,但是主要功能類之間的關系、關鍵方法都是沒變的,可以用來做參考學習的。
  • 百度搜索 "systemui" 可以搜到一些相關的資料,其中有一些也說得很不錯。

筆者水平有限,所以本篇只是簡單描述下這個 systemui 可以做什么,並不進行深入的原理剖析。

按各個模塊簡單說下systemui

systemui 的功能簡單描述

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

  • 是一個 apk , 而不是在構建 Android 系統 ROM 的時候打進去的代碼。在 Android 系統啟動的時候,通過 SystemServer 啟動該應用。
  • 負責了 Android 系統最基本的操作的實現,因為沒有 systemui 的話就無法進行 UI 交互,所以筆者覺得這個可以說是 Android 系統最基本的視圖部分了。

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

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

system 的功能拆分說明

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

  • 狀態欄

    狀態欄不光只有一般所理解的頂部包含時間、信號強度圖標等信息的一個長帶狀的“狀態欄”。除了這個長條狀態欄外,同時還包含了

    • 從頂部下拉出現的 QS(QuickSettings,也就是我們下拉出現的 ”打開關閉 wifi“ 、”打開關閉藍牙“ 、”打開關閉飛行模式“ 等的快捷操作)
    • 通知欄的展示以及相關操作
  • 導航欄

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

  • 鎖屏

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

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

  • 功能交互

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

  • 繪制以及手勢判斷

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

小結

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM