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。

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := optional

LOCAL_SRC_FILES := $(call all-java-files-under, src) \
    src/com/android/systemui/EventLogTags.logtags

LOCAL_STATIC_JAVA_LIBRARIES := Keyguard
LOCAL_JAVA_LIBRARIES := telephony-common

LOCAL_PACKAGE_NAME := SystemUI
LOCAL_CERTIFICATE := platform
LOCAL_PRIVILEGED_MODULE := true

LOCAL_PROGUARD_FLAG_FILES := proguard.flags

LOCAL_RESOURCE_DIR := \
    frameworks/base/packages/Keyguard/res \
    $(LOCAL_PATH)/res
LOCAL_AAPT_FLAGS := --auto-add-overlay --extra-packages com.android.keyguard

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

include frameworks/base/packages/SettingsLib/common.mk

include $(BUILD_PACKAGE)

ifeq ($(EXCLUDE_SYSTEMUI_TESTS),)
    include $(call all-makefiles-under,$(LOCAL_PATH))
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的设计思想以及代码架构。

    原文作者:Android源码分析
    原文地址: https://blog.csdn.net/zhudaozhuan/article/details/50816086
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞