天天看点

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

继续阅读