Android L Telecom进程初始化之目录分析

时间:2022-11-16 19:46:04

本文代码目录以高通平台Android 5.0为基础,可能与AOSP有不同之处。

概述

前面几篇学习文章是针对Phone进程初始化做的说明,坦诚的讲只说明了一个:
Phone进程是如何初始化自己的内容的,细节内容展开来说还是不少的。

但是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.telecom

  • coreApp="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>