简单说下 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 的主要控制界面是怎么样生效的,其中包含了哪些关键功能。

原文地址:https://www.cnblogs.com/wkmcyz/p/15631218.html