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的设计思想以及代码架构。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值