android 6.0 SystemUI 소스 분석 (1) - SystemUI 소개

1. SystemUI 소개
SystemUI 는
1) 배터리, 와이파이 신호, 3G/4G 등 icon 디스플레이와 같은 상태 표시줄 정보 표시
2) 알림 패널, 예를 들어 시스템 메시지, 제3자 응용 메시지는 모두 알림 패널에 표시된다.
3) 최근 작업 표시줄에 패널이 표시됩니다.예를 들어 홈 페이지나 최근 퀘스트 단축키를 길게 누르면 최근에 사용한 앱을 표시할 수 있다.
4) 캡처 서비스를 제공한다.예를 들어 전원+음량을 더하면 캡처할 수 있다.
5) 벽지 서비스 제공.예를 들어 벽지의 표시.
6) 병풍 서비스를 제공한다.
7) 시스템 UI 가 표시됩니다.예를 들어 시스템 이벤트가 발생하면 시스템 UI 프롬프트가 표시됩니다.
SystemUI 소스 경로:
frameworks\base\packages\SystemUI
2.Android.소개
frameworks\base\packages\SystemUI\Android.mk
시스템 UI는 시스템 apk에 속하며android에서 컴파일하여 생성됩니다. 시스템 UI 원본을 배우기 전에 안드로이드를 알아야 합니다.mk, 소스 코드에 대해 더 잘 알 수 있습니다.
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

이상 안드로이드에서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 및 LOCALJACK_ENABLED의 설명은 다음과 같습니다.(예약 @@)
3 AndroidManifest.xml 소개
안드로이드 분석 완료.mk 이후 안드로이드 매니페스트를 분석합니다.xml.AndroidManifest.xml은 apk의 설정 파일입니다. apk가 필요로 하는 권한, 특징, 그리고 4대 구성 요소가 모두 여기에 설정되어 있습니다.
또한 구성 요소의 차원 구조도 대략적으로 볼 수 있어 우리가 원본 코드에 대한 분석에 편리하다.
안드로이드 매니페스트에서.xml에서 볼 수 있는 것은 다음과 같다.
1) SystemUI는 시스템 apk에 속함
android:sharedUserId="android.uid.systemui"
2) SystemUI는 Core apk에 속함
coreApp="true"
3) SystemUI 는 KILL 에 의해 자동으로 재부팅되지 않습니다.
 android:persistent="true"
여기 킬은 로미모리 킬러한테 안 죽는다고 하잖아요.
4) 프로세스 이름은com입니다.android.systemui
 android:process="com.android.systemui"
5) 개방형 서비스는 주로 다음과 같습니다.
              android:exported="true"
/>
                  android:exported="true"/>
                android:permission="android.permission.BIND_WALLPAPER"
                android:exported="true"/>
              android:name=".keyguard.KeyguardService"
            android:exported="true"
            android:enabled="@bool/config_enableKeyguardService"/>
비교적 의외인 것은 캡처 서비스가 대외적으로 개방되지 않았다는 것이다. 보아하니 시스템 프로세스만 이 서비스를 시작하고 사용할 수 있을 것 같다
       
                    android:process=":screenshot"
            android:exported="false"/>
6) 주요 Activity는 다음과 같습니다.
최근 작업 표시줄:
 
                          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">
           
               
           
       
usb debug와 관련된Activity, 예를 들어 핸드폰이 컴퓨터에 삽입되고 핸드폰에 있는 알림 상자;adb connect에서 핸드폰, 핸드폰 권한 수여 알림 상자 등.
       
                    android:exported="true"
            android:permission="android.permission.MANAGE_USB"
            android:theme="@style/Theme.SystemUI.Dialog.Alert"
            android:finishOnCloseSystemDialogs="true"
            android:excludeFromRecents="true">
       
       
                    android:exported="true"
            android:permission="android.permission.MANAGE_USB"
            android:theme="@style/Theme.SystemUI.Dialog.Alert"
            android:finishOnCloseSystemDialogs="true"
            android:excludeFromRecents="true">
       
       
                    android:exported="true"
            android:permission="android.permission.MANAGE_USB"
            android:theme="@style/Theme.SystemUI.Dialog.Alert"
            android:finishOnCloseSystemDialogs="true"
            android:excludeFromRecents="true">
       
       
                    android:exported="true"
            android:permission="android.permission.MANAGE_USB"
            android:theme="@style/Theme.SystemUI.Dialog.Alert"
            android:finishOnCloseSystemDialogs="true"
            android:excludeFromRecents="true">
       
       
                    android:permission="android.permission.MANAGE_USB"
            android:theme="@style/Theme.SystemUI.Dialog.Alert"
            android:finishOnCloseSystemDialogs="true"
            android:excludeFromRecents="true">
       
                    android:theme="@style/Theme.SystemUI.Dialog.Alert"
            android:finishOnCloseSystemDialogs="true"
            android:excludeFromRecents="true">
       
밝기 조절 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">
           
               
               
           
       
SystemUI의 기본적인 내용에 대해 대략적으로 설명한 바와 같이 소스를 읽고 SystemUI의 주요 기능, 그리고 주요 서비스와Activity를 분석하며 Google의 디자인 사상과 코드 구조를 잘 알고 있습니다.

좋은 웹페이지 즐겨찾기