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

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.android.keyguard"
    android:sharedUserId="android.uid.systemui"
    coreApp="true">
    <uses-sdk android:minSdkVersion="10" android:targetSdkVersion="17"/>
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
    <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.STATUS_BAR" />
    <uses-permission android:name="android.permission.DEVICE_POWER" />
    <uses-permission android:name="android.permission.MANAGE_USERS" />
    <uses-permission android:name="android.permission.MANAGE_APP_TOKENS" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />
    <uses-permission android:name="android.permission.BIND_APPWIDGET" />
    <uses-permission android:name="android.permission.INTERNAL_SYSTEM_WINDOW" />
    <uses-permission android:name="android.permission.BIND_DEVICE_ADMIN" />
    <uses-permission android:name="android.permission.CHANGE_COMPONENT_ENABLED_STATE" />
    <uses-permission android:name="android.permission.MEDIA_CONTENT_CONTROL" />
    <uses-permission android:name="android.permission.ACCESS_KEYGUARD_SECURE_STORAGE" />
    <uses-permission android:name="android.permission.TRUST_LISTENER" />
    <uses-permission android:name="android.permission.USE_FINGERPRINT" />

    <application android:label="@string/app_name"
        android:process="com.android.systemui"
        android:persistent="true"
        android:supportsRtl="true">

    </application>
</manifest>

至此,可以看到,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

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
        package="com.android.systemui"
        android:sharedUserId="android.uid.systemui"
        coreApp="true">

     ......

  <application
        android:name=".SystemUIApplication"
        android:persistent="true"
        android:allowClearUserData="false"
        android:allowBackup="false"
        android:hardwareAccelerated="true"
        android:label="@string/app_label"
        android:icon="@drawable/icon"
        android:process="com.android.systemui"
        android:supportsRtl="true"
        android:theme="@style/systemui_theme">

  ......
  </application>
</manifest>

         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的一部分了。

    


  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值