Android6.0 锁屏(Keyguard) 简介

         锁屏(Keyguard)是Android是一个非常重要的模块。包含的功能有:解锁(指纹、图案、PIN等)、锁屏通知显示、快速启动相机、快速拨号、显示日期/时间等。

        Keyguard的代码路径如下: \frameworks\base\packages\Keyguard

        Android系统中的各个功能模块、应用,都是根据各个模块下的Android.mk文件中的内容,在Android的编译环境下生成指定的静态库、动态库、APK文件等,那Keyguard模块下的Android.mk文件又是怎样的呢?到底会生成怎样的文件类型呢?那我们就看看Keyguard中的Android.mk文件吧

Keyguard中的Android.mk文件

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

LOCAL_SRC_FILES := $(call all-java-files-under, src) $(call all-subdir-Iaidl-files)

LOCAL_MODULE := Keyguard

LOCAL_CERTIFICATE := platform

LOCAL_JAVA_LIBRARIES := SettingsLib

LOCAL_PRIVILEGED_MODULE := true

LOCAL_PROGUARD_FLAG_FILES := proguard.flags

LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res

include $(BUILD_STATIC_JAVA_LIBRARY)

#include $(call all-makefiles-under,$(LOCAL_PATH))

        从Android.mk文件的描述的 include $(BUILD_STATIC_JAVA_LIBRARY),我们知道,Keyguard并没有被编译成一个APK文件,而是被编译成了一个Java静态库。既然Keyguard被编译成静态库,那这个静态库在哪里被使用呢?那我们去看看Keyguard中的AndroidManifest.xml中有没有线索呢?

Keyguard的AndroidManifest.xml


    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    

    

    

至此,可以看到,Keyguard的AndroidManifest.xml有两个地方比较特殊,如下:
  • android:sharedUserId="android.uid.systemui"
  • android:process="com.android.systemui"

这两句是什么意思呢?分别是:

  • Keyguard使用了共享的用户ID是android.uid.systemui。
  • Keyguard运行在com.android.systemui进程中,而不是运行在自己的运程中。

通过这两行的定义,都提到了SystemUI,那我们就到SystemUI中看看有没有关于Keyguard的信息呢?

我们还是先看看SystemUI工程目录下的Android.mk文件吧。

SystemUI的Android.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

在SystemUI的Android.mk文件中,我们可以到到,SystemUI使用了Keyguard的资源,定义如下:

LOCAL_STATIC_JAVA_LIBRARIES := Keyguard

LOCAL_RESOURCE_DIR := \
    frameworks/base/packages/Keyguard/res \


从上面的定义可以知道,SystemUI引入了Keyguard静态库和Keyguard模块下的res资源文件,最后,SystemUI被编译成了一个APK文件,作为一个单独的应用运行。


根据上面所介绍的,我们已经知道了Keyguard是依赖于SystemUI而存在的,且Keyguard的sharedUserId是android.uid.systemui,运行在com.android.systemui进程中,那我们再看看SystemUI的AndroidMenifest.xml的定义又是怎样的呢?会不会使用了和Keyguard相同的sharedUserId呢?SystemUI是不是也运行在了com.android.systemui进程中呢?

SystemUI的AndroidMenifest.xml



     ......

  

  ......
  

         SystemUI的AndroidMenifest.xml定义了很多权限、Activity、Service、Receiver相关的,在此省略掉了,我们只关心sharedUserId和process是怎样的。SystemUI的sharedUserId和process分别是android.uid.systemui、com.android.systemui,与Keyguard中定义的是一样的,而SystemUI的包名又是:com.android.systemui,从这也就说明了,SystemUI运行在自己的进程中,Keyguard也一起运行在SystemUI当前的运行进程中。

         总结:

         1. Keyguard被编译Java静态库。

         2. Keyguard编译成的Java静态库在SystemUI中引入,做为SystemUI的一部分了。

    


你可能感兴趣的:(Android)