android 6.0 SystemUI源码分析(1)-SystemUI介绍 转

1. SystemUI介绍

SystemUI是一个系统应用,主要功能有:

1)状态栏信息显示,比如电池,wifi信号,3G/4G等icon显示

2)通知面板,比如系统消息,第三方应用消息,都是在通知面板显示。

3)近期任务栏显示面板。比如长按主页或近期任务快捷键,可以显示近期使用的应用。

4)提供截图服务。比如电源+音量加可以截图。

5)提供壁纸服务。比如壁纸的显示。

6)提供屏保服务。

7)系统UI显示。比如系统事件到来时,显示系统UI提示用户。

SystemUI源码路径:

frameworks\base\packages\SystemUI

2.Android.mk介绍

frameworks\base\packages\SystemUI\Android.mk

SystemUI属于系统apk,由android编译生成,在学习SystemUI源码前,需要了解其Android.mk,便于进一步熟悉source code。

[plain] view plain copy

  1. LOCAL_PATH:= $(call my-dir)
  2. include $(CLEAR_VARS)
  3. LOCAL_MODULE_TAGS := optional
  4. LOCAL_SRC_FILES := $(call all-java-files-under, src) \
  5. src/com/android/systemui/EventLogTags.logtags
  6. LOCAL_STATIC_JAVA_LIBRARIES := Keyguard
  7. LOCAL_JAVA_LIBRARIES := telephony-common
  8. LOCAL_PACKAGE_NAME := SystemUI
  9. LOCAL_CERTIFICATE := platform
  10. LOCAL_PRIVILEGED_MODULE := true
  11. LOCAL_PROGUARD_FLAG_FILES := proguard.flags
  12. LOCAL_RESOURCE_DIR := \
  13. frameworks/base/packages/Keyguard/res \
  14. $(LOCAL_PATH)/res
  15. LOCAL_AAPT_FLAGS := --auto-add-overlay --extra-packages com.android.keyguard
  16. ifneq ($(SYSTEM_UI_INCREMENTAL_BUILDS),)
  17. LOCAL_PROGUARD_ENABLED := disabled
  18. LOCAL_JACK_ENABLED := incremental
  19. endif
  20. include frameworks/base/packages/SettingsLib/common.mk
  21. include $(BUILD_PACKAGE)
  22. ifeq ($(EXCLUDE_SYSTEMUI_TESTS),)
  23. include $(call all-makefiles-under,$(LOCAL_PATH))
  24. endif

从以上Android.mk可以看出:

1)应用编译后的名称:SysemUI

LOCAL_PACKAGE_NAME := SystemUI

2)应用编译后系统路径:/system/pri-app/SystemUI

LOCAL_PRIVILEGED_MODULE := true

说明:

不添加此属性,编译后的路径为/system/app/SystemUI

在同样具有系统权限情况下,/system/pri-app下的apk权限比/system/app下大

3)可以选择性使用JACK编译器

ifneq ($(SYSTEM_UI_INCREMENTAL_BUILDS),)
    LOCAL_PROGUARD_ENABLED := disabled
    LOCAL_JACK_ENABLED := incremental
endif

关于LOCAL_PROGUARD_ENABLED和LOCAL_JACK_ENABLED的解释,可以看下面这篇文章。(计划中@@)

3 AndroidManifest.xml介绍

分析完Android.mk后,接下来进一步分析AndroidManifest.xml。AndroidManifest.xml是apk的配置文件,apk需要的权限,特征以及四大组件,都在这里进行配置。

并且组件的层次结构,也可以大概看出来,便于我们对于源代码的分析。

从AndroidManifest.xml我们可以看出:

1)SystemUI属于系统apk

android:sharedUserId="android.uid.systemui"

2)SystemUI属于核心apk

coreApp="true"

3)SystemUI不会被KILL,即被KILL后会自动重启

android:persistent="true"

这里的KILL主要指不会被low memory killer杀掉

4)进程名是com.android.systemui

android:process="com.android.systemui"

5)对外开放的Service主要有:

<service android:name="SystemUIService"
            android:exported="true"
/>

<service android:name=".LoadAverageService"
                android:exported="true" />
<service android:name=".ImageWallpaper"
                android:permission="android.permission.BIND_WALLPAPER"
                android:exported="true" />

<service
            android:name=".keyguard.KeyguardService"
            android:exported="true"
            android:enabled="@bool/config_enableKeyguardService" />

比较意外的是截图服务居然没有对外开放,看来只有系统进程才可以启动并使用这个服务

<!-- started from PhoneWindowManager
             TODO: Should have an android:permission attribute -->
        <service android:name=".screenshot.TakeScreenshotService"
            android:process=":screenshot"
            android:exported="false" />

6)主要的Activity有:

近期任务栏:

<!-- Alternate Recents -->
        <activity android:name=".recents.RecentsActivity"
                  android:label="@string/accessibility_desc_recent_apps"
                  android:exported="false"
                  android:launchMode="singleInstance"
                  android:excludeFromRecents="true"
                  android:stateNotNeeded="true"
                  android:resumeWhilePausing="true"
                  android:screenOrientation="behind"
                  android:theme="@style/config_recents_activity_theme">
            <intent-filter>
                <action android:name="com.android.systemui.recents.TOGGLE_RECENTS" />
            </intent-filter>
        </activity>

usb debug相关的Activity,比如手机在电脑上插入,手机上的提示框;adb connect到手机,手机授权提示框等。

<!-- started from UsbDeviceSettingsManager -->
        <activity android:name=".usb.UsbConfirmActivity"
            android:exported="true"
            android:permission="android.permission.MANAGE_USB"
            android:theme="@style/Theme.SystemUI.Dialog.Alert"
            android:finishOnCloseSystemDialogs="true"
            android:excludeFromRecents="true">
        </activity>

<!-- started from UsbDeviceSettingsManager -->
        <activity android:name=".usb.UsbPermissionActivity"
            android:exported="true"
            android:permission="android.permission.MANAGE_USB"
            android:theme="@style/Theme.SystemUI.Dialog.Alert"
            android:finishOnCloseSystemDialogs="true"
            android:excludeFromRecents="true">
        </activity>

<!-- started from UsbDeviceSettingsManager -->
        <activity android:name=".usb.UsbResolverActivity"
            android:exported="true"
            android:permission="android.permission.MANAGE_USB"
            android:theme="@style/Theme.SystemUI.Dialog.Alert"
            android:finishOnCloseSystemDialogs="true"
            android:excludeFromRecents="true">
        </activity>

<!-- started from UsbDeviceSettingsManager -->
        <activity android:name=".usb.UsbAccessoryUriActivity"
            android:exported="true"
            android:permission="android.permission.MANAGE_USB"
            android:theme="@style/Theme.SystemUI.Dialog.Alert"
            android:finishOnCloseSystemDialogs="true"
            android:excludeFromRecents="true">
        </activity>

<!-- started from UsbDebuggingManager -->
        <activity android:name=".usb.UsbDebuggingActivity"
            android:permission="android.permission.MANAGE_USB"
            android:theme="@style/Theme.SystemUI.Dialog.Alert"
            android:finishOnCloseSystemDialogs="true"
            android:excludeFromRecents="true">
        </activity>
        <activity android:name=".usb.UsbDebuggingSecondaryUserActivity"
            android:theme="@style/Theme.SystemUI.Dialog.Alert"
            android:finishOnCloseSystemDialogs="true"
            android:excludeFromRecents="true">
        </activity>

亮度调节Activity:

<activity
            android:name=".settings.BrightnessDialog"
            android:label="@string/quick_settings_brightness_dialog_title"
            android:theme="@android:style/Theme.DeviceDefault.Dialog"
            android:finishOnCloseSystemDialogs="true"
            android:launchMode="singleInstance"
            android:excludeFromRecents="true"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.SHOW_BRIGHTNESS_DIALOG" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>

上面大概介绍了SystemUI一些基本的东西,我们阅读源码,也是对SystemUI的主要功能,以及主要的service以及Activity进行分析,熟悉Google的设计思想以及代码架构。

时间: 2024-10-09 17:52:58

android 6.0 SystemUI源码分析(1)-SystemUI介绍 转的相关文章

Android 4.0 Launcher源码分析系列(一)

从今天起傻蛋打算做一个系列文章,对最新的Android 4.0 系统中的Launcher,也就是Android 4.0原生的桌面程序,进行一个深入浅出的分析,从而引领Android系统的编程爱好者对 Launcher的设计思想,实现方式来做一个研究,从而能够通过这个实例最掌握到目前世界领先的设计方法,同时在程序中加入我们的一些新的实现.众所周知,对一些优秀源代码的分析,是提高编程水平的一条便捷的方式,希望本系列文章能够给大家带来一定的启发,同时欢迎大家和作者一起讨论,作者的微博是:http://

【转】Android 4.0 Launcher2源码分析——启动过程分析

Android的应用程序的入口定义在AndroidManifest.xml文件中可以找出:[html] <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.android.launcher">  <original-package android:name="com.android.launcher2" /> .

Android消息处理机制(源码分析)

前言 虽然一直在做应用层开发,但是我们组是核心系统BSP,了解底层了解Android的运行机制还是很有必要的.就应用程序而言,Android系统中的Java应用程序和其他系统上相同,都是靠消息驱动来工作的,它们大致的工作原理如下: 1. 有一个消息队列,可以往这个消息队列中投递消息. 2. 有一个消息循环,不断从消息队列中取出消息,然后处理 . 为了更深入的理解Android的消息处理机制,这几天空闲时间,我结合<深入理解Android系统>看了Handler.Looper.Message这几

Android 上千实例源码分析以及开源分析

Android 上千实例源码分析以及开源分析(百度云分享) 要下载的直接翻到最后吧,项目实例有点多. 首先 介绍几本书籍(下载包中)吧. 01_Android系统概述 02_Android系统的开发综述 03_Android的Linux内核与驱动程序 04_Android的底层库和程序 05_Android的JAVA虚拟机和JAVA环境 06_Android的GUI系统 07_Android的Audio系统 08_Android的Video 输入输出系统 09_Android的多媒体系统 10_

深度理解Android InstantRun原理以及源码分析

深度理解Android InstantRun原理以及源码分析 @Author 莫川 Instant Run官方介绍 简单介绍一下Instant Run,它是Android Studio2.0以后新增的一个运行机制,能够显著减少你第二次及以后的构建和部署时间.简单通俗的解释就是,当你在Android Studio中改了你的代码,Instant Run可以很快的让你看到你修改的效果.而在没有Instant Run之前,你的一个小小的修改,都肯能需要几十秒甚至更长的等待才能看到修改后的效果. 传统的代

转载Aaron ---- jQuery 2.0.3 源码分析core - 选择器

jQuery 2.0.3 源码分析core - 选择器(02) 声明:本文为原创文章,如需转载,请注明来源并保留原文链接Aaron,谢谢! 打开jQuery源码,一眼看去到处都充斥着正则表达式,jQuery框架的基础就是查询了,查询文档元素对象,所以狭隘的说呢,jQuery就是一个选择器,并这个基础上构建和运行查询过滤器! 工欲善其事,必先利其器,所以先从正则入手 我们来分解一个表达式 // A simple way to check for HTML strings // Prioritize

MyVoix2.0.js 源码分析 WebSpeech与WebAudio篇

楔 子 随着移动互联网时代的开启,各种移动设备走进了我们的生活.无论是日常生活中人手一部的手机,还是夜跑者必备的各种智能腕带,亦或者是充满未来科技感的google glass云云,它们正渐渐改变着我们的生活习惯以及用户交互习惯.触摸屏取代了实体按键,Siri开始慢慢释放我们的双手,而leap motion之类的硬件更是让我们彻底不需要接触IT设备便能通过手势控制它们.在这样的大背景下,前端的交互将涉及越来越多元的交叉学科,我们正如十几年前人们经历Css的诞生一样,见证着一场带动整个行业乃至社会的

【转】Ubuntu 14.04.3上配置并成功编译Android 6.0 r1源码

http://www.linuxidc.com/Linux/2016-01/127292.htm 终于成功把Android 6.0 r1源码的源码编译.先上图,这是在Ubuntu中运行的Android模拟器: 由于我是在Win8中安装虚拟机VMware,然后在虚拟机中安装Ubuntu进行编译,所以遇到诸多麻烦.如果直接在Linux中编译,可能会更顺利. ------------------------------------------------------------------------

转载Aaron博客 ---- jQuery 2.0.3 源码分析core - 整体架构

jQuery 2.0.3 源码分析core - 整体架构 整体架构 拜读一个开源框架,最想学到的就是设计的思想和实现的技巧. 废话不多说,jquery这么多年了分析都写烂了,老早以前就拜读过, 不过这几年都是做移动端,一直御用zepto, 最近抽出点时间把jquery又给扫一遍 我也不会照本宣科的翻译源码,结合自己的实际经验一起拜读吧! github上最新是jquery-master,加入了AMD规范了,我就以官方最新2.0.3为准 整体架构 jQuery框架的核心就是从HTML文档中匹配元素并