Keyguard 和 SystemUI

来源:互联网 发布:淘宝无法用网银支付 编辑:程序博客网 时间:2024/06/05 02:15
锁屏(Keyguard)是Android是一个非常重要的模块。包含的功能有:解锁(指纹、图案、PIN等)、锁屏通知显示、快速启动相机、快速拨号、显示日期/时间等。

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

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

Keyguard中的Android.mk文件

[html] view plain copy print?在CODE上查看代码片派生到我的代码片
  1. LOCAL_PATH:= $(call my-dir)  
  2. include $(CLEAR_VARS)  
  3.   
  4. LOCAL_SRC_FILES := $(call all-java-files-under, src) $(call all-subdir-Iaidl-files)  
  5.   
  6. LOCAL_MODULE :Keyguard  
  7.   
  8. LOCAL_CERTIFICATE :platform  
  9.   
  10. LOCAL_JAVA_LIBRARIES :SettingsLib  
  11.   
  12. LOCAL_PRIVILEGED_MODULE :true  
  13.   
  14. LOCAL_PROGUARD_FLAG_FILES :proguard.flags  
  15.   
  16. LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res  
  17.   
  18. include $(BUILD_STATIC_JAVA_LIBRARY)  
  19.   
  20. #include $(call all-makefiles-under,$(LOCAL_PATH))  

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

Keyguard的AndroidManifest.xml

[html] view plain copy print?在CODE上查看代码片派生到我的代码片
  1. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     package="com.android.keyguard"  
  3.     android:sharedUserId="android.uid.systemui"  
  4.     coreApp="true">  
  5.     <uses-sdk android:minSdkVersion="10" android:targetSdkVersion="17"/>  
  6.     <uses-permission android:name="android.permission.VIBRATE" />  
  7.     <uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />  
  8.     <uses-permission android:name="android.permission.GET_ACCOUNTS" />  
  9.     <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />  
  10.     <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL" />  
  11.     <uses-permission android:name="android.permission.WAKE_LOCK" />  
  12.     <uses-permission android:name="android.permission.STATUS_BAR" />  
  13.     <uses-permission android:name="android.permission.DEVICE_POWER" />  
  14.     <uses-permission android:name="android.permission.MANAGE_USERS" />  
  15.     <uses-permission android:name="android.permission.MANAGE_APP_TOKENS" />  
  16.     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />  
  17.     <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />  
  18.     <uses-permission android:name="android.permission.BIND_APPWIDGET" />  
  19.     <uses-permission android:name="android.permission.INTERNAL_SYSTEM_WINDOW" />  
  20.     <uses-permission android:name="android.permission.BIND_DEVICE_ADMIN" />  
  21.     <uses-permission android:name="android.permission.CHANGE_COMPONENT_ENABLED_STATE" />  
  22.     <uses-permission android:name="android.permission.MEDIA_CONTENT_CONTROL" />  
  23.     <uses-permission android:name="android.permission.ACCESS_KEYGUARD_SECURE_STORAGE" />  
  24.     <uses-permission android:name="android.permission.TRUST_LISTENER" />  
  25.     <uses-permission android:name="android.permission.USE_FINGERPRINT" />  
  26.   
  27.     <application android:label="@string/app_name"  
  28.         android:process="com.android.systemui"  
  29.         android:persistent="true"  
  30.         android:supportsRtl="true">  
  31.   
  32.     </application>  
  33. </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

[html] view plain copy print?在CODE上查看代码片派生到我的代码片
  1. LOCAL_PATH:= $(call my-dir)  
  2. include $(CLEAR_VARS)  
  3.   
  4. LOCAL_MODULE_TAGS :optional  
  5.   
  6. LOCAL_SRC_FILES := $(call all-java-files-under, src) \  
  7.     src/com/android/systemui/EventLogTags.logtags  
  8.   
  9. LOCAL_STATIC_JAVA_LIBRARIES :Keyguard  
  10. LOCAL_JAVA_LIBRARIES :telephony-common  
  11.   
  12. LOCAL_PACKAGE_NAME :SystemUI  
  13. LOCAL_CERTIFICATE :platform  
  14. LOCAL_PRIVILEGED_MODULE :true  
  15.   
  16. LOCAL_PROGUARD_FLAG_FILES :proguard.flags  
  17.   
  18. LOCAL_RESOURCE_DIR := \  
  19.     frameworks/base/packages/Keyguard/res \  
  20.     $(LOCAL_PATH)/res  
  21. LOCAL_AAPT_FLAGS := --auto-add-overlay --extra-packages com.android.keyguard  
  22.   
  23. ifneq ($(SYSTEM_UI_INCREMENTAL_BUILDS),)  
  24.     LOCAL_PROGUARD_ENABLED :disabled  
  25.     LOCAL_JACK_ENABLED :incremental  
  26. endif  
  27.   
  28. include frameworks/base/packages/SettingsLib/common.mk  
  29.   
  30. include $(BUILD_PACKAGE)  
  31.   
  32. ifeq ($(EXCLUDE_SYSTEMUI_TESTS),)  
  33.     include $(call all-makefiles-under,$(LOCAL_PATH))  
  34. 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

[html] view plain copy print?在CODE上查看代码片派生到我的代码片
  1. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  2.         xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"  
  3.         package="com.android.systemui"  
  4.         android:sharedUserId="android.uid.systemui"  
  5.         coreApp="true">  
  6.   
  7.      ......  
  8.   
  9.   <application  
  10.         android:name=".SystemUIApplication"  
  11.         android:persistent="true"  
  12.         android:allowClearUserData="false"  
  13.         android:allowBackup="false"  
  14.         android:hardwareAccelerated="true"  
  15.         android:label="@string/app_label"  
  16.         android:icon="@drawable/icon"  
  17.         android:process="com.android.systemui"  
  18.         android:supportsRtl="true"  
  19.         android:theme="@style/systemui_theme">  
  20.   
  21.   ......  
  22.   </application>  
  23. </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的一部分了。

0 0
原创粉丝点击