本文代码目录以高通平台Android 5.0为基础,可能与AOSP有不同之处。
概述
前面几篇学习文章是针对Phone进程初始化做的说明,坦诚的讲只说明了一个:
Phone进程是如何初始化自己的内容的,细节内容展开来说还是不少的。
其中需要知道Android L Phone进程模型。
Android L Phone的目录结构与进程模型Phone中的内部Call.State 和Phone State的含义以及 在CallManager眼中的分类。
Android L Phone进程初始化_02
但是Android L Phone模块新增了Telecomm目录,在进程中也增加了进程 com.android.server.telecom (以下简称Telecom)
接下来的2 ~ 3篇会以Telecom进程作为学习的对象,来分析这个新增的内容。
目标
文件目录 android/packages/services/Telecomm/
- Android.mk
- AndroidManifest.xml
Telecomm的 Android.mk
LOCAL_PATH:= $(call my-dir)
# Build the Telecom service.
include $(CLEAR_VARS)
#需要依赖telephone-common, 这个jar包是由 android/frameworks/opt/telephony 生成
LOCAL_JAVA_LIBRARIES := telephony-common
LOCAL_STATIC_JAVA_LIBRARIES := \
guava \
LOCAL_SRC_FILES := $(call all-java-files-under, src)
##生成Telecom.apk
LOCAL_PACKAGE_NAME := Telecom
LOCAL_CERTIFICATE := platform
LOCAL_PRIVILEGED_MODULE := true
LOCAL_PROGUARD_ENABLED := optimization
# Workaround for "local variable type mismatch" error.
LOCAL_DX_FLAGS += --no-locals
include $(BUILD_PACKAGE)
# Build the test package.
include $(call all-makefiles-under,$(LOCAL_PATH))
Android.mk文件描述了该apk 所需要的依赖,以及编译生成的类型。
LOCAL_MODULE := telephony-common是编译后jar包的名称;
LOCAL_PACKAGE_NAME := Telecom 是编译package的名称
Telecomm的mk文件比较简单,仅仅是说明了,我依赖什么, 我编译成什么。
makefile也是一个很大很深的坑,我也是略懂。感兴趣的可以参考网上的资料。
Telecomm的 AndroidManifest.xml
AndroidManifest.xml不论是源码应用还是纯apk开发都是需要的,但是Android.mk在纯apk开发中是没有的。这个是工具环境已经弄好了,无需我们再写。
还是先来看看Telecomm中的 AndroidManifest.xml 开头部分
AndroidManifest开头表述信息
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
package="com.android.server.telecom"
coreApp="true"
android:sharedUserId="android.uid.phone">
说明:
package="com.android.server.telecom"
标明该apk的进程名称是 com.android.server.telecomcoreApp="true"
说明该apk是核心应用,并不是代表该APP具有系统权限。
coreApp=true属性及android4.2下多用户进程启动说明
这篇文章讲解了关于coreApp的问题。android:sharedUserId="android.uid.phone"
这说明Telecom进程具有radio权限,在访问RIL时会进行此权限的检测。
参考这篇文章:Android相关权限的概念http://www.cnblogs.com/bastard/archive/2013/04/10/3011959.html)
其中说道 Android权限的实现有三种形式:
- 第一层:由应用设置,修改AndroidManifest.xml,形如:
<uses-permission android:name=”android.permission.INTERNET”/>
- 第二层:框架层,权限对应组,frameworks/base/data/etc/platform.xml,形如:
<permission name=”android.permission.INTERNET”>
<group gid=inet” />
</permission>
- 第三层:系统层,系统的权限, system/core/include/private/android_filesystem_config.h 形如:
40 #define AID_ROOT 0 /* traditional unix root user */
42 #define AID_SYSTEM 1000 /* system server */
44 #define AID_RADIO 1001 /* telephony subsystem, RIL */
45 #define AID_BLUETOOTH 1002 /* bluetooth subsystem */
46 #define AID_GRAPHICS 1003 /* graphics devices */
47 #define AID_INPUT 1004 /* input devices */
48 #define AID_AUDIO 1005 /* audio devices */
49 #define AID_CAMERA 1006 /* camera devices */
50 #define AID_LOG 1007 /* log devices */
... ...
86 /* The 3000 series are intended for use as supplemental group id's only.
87 * They indicate special Android capabilities that the kernel is aware of. */
88 #define AID_NET_BT_ADMIN 3001 /* bluetooth: create any socket */
89 #define AID_NET_BT 3002 /* bluetooth: create sco, rfcomm or l2cap sockets */
90 #define AID_INET 3003 /* can create AF_INET and AF_INET6 sockets */
91 #define AID_NET_RAW 3004 /* can create raw INET sockets */
92 #define AID_NET_ADMIN 3005 /* can configure interfaces and routing tables. */
... ...
121 static const struct android_id_info android_ids[] = {
122 { "root", AID_ROOT, },
123
124 { "system", AID_SYSTEM, },
125
126 { "radio", AID_RADIO, },
127 { "bluetooth", AID_BLUETOOTH, },
128 { "graphics", AID_GRAPHICS, },
129 { "input", AID_INPUT, },
130 { "audio", AID_AUDIO, },
... ...
}
查看系统权限的 命令使用:
adb shell pm list permissions
All Permissions:
permission:android.permission.BIND_ACCESSIBILITY_SERVICE
permission:android.permission.ACCESS_INPUT_FLINGER
permission:cyanogenmod.permission.PROTECTED_APP
permission:android.permission.CRYPT_KEEPER
permission:android.permission.BIND_TEXT_SERVICE
... ...
Telecomm的 进程
USER PID PPID VSIZE RSS WCHAN PC NAME
radio 1369 293 1231840 32596 ffffffff 00000000 S com.android.server.telecom
和它相关的phone进程
USER PID PPID VSIZE RSS WCHAN PC NAME
radio 1396 293 1287116 53776 ffffffff 00000000 S com.android.phone
注意其中的radio,跟上文说到的
android:sharedUserId="android.uid.phone" 相关喏。
小结
本文仅仅是从Android.mk 以及AndroidManifest.xml 从外围大概的说了下Telecom是什么东西。
这里提几个小命令吧。
adb shell ps ==> 查看所有的进程信息
adb shell ps | findstr phone ==> 查找关键字为phone的进程 window环境
adb shell ps | grep “phone” ==> 查找关键字为phone的进程 Linux环境
如果你在windows cmd环境下执行了某些cmd,想快速查看保存的文件怎么办呢?
如下例子:
Microsoft Windows [版本 6.1.7601]
版权所有 (c) 2009 Microsoft Corporation。保留所有权利。
C:\Users\dell>adb shell ps > ps.log
C:\Users\dell>explorer .&
C:\Users\dell>