android init中的service _Android, Python及开发编程讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Android, Python及开发编程讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 2045 | 回复: 0   主题: android init中的service         下一篇 
lei.zhou
注册用户
等级:少尉
经验:326
发帖:2
精华:0
注册:2012-11-12
状态:离线
发送短消息息给lei.zhou 加好友    发送短消息息给lei.zhou 发消息
发表于: IP:您无权察看 2015-7-15 9:42:56 | [全部帖] [楼主帖] 楼主

android的init进程初始化的时候,除了对系统作一些必要的初始化外,就是启动service了。而service是定义在init脚本中的,故很有必要了解一下,init中对service的处理。

struct service


该数据结构保存了和service相关的信息。service下可以定义option,这些option被保存在这个结构体中;除此之外还保存了service的运行时管理信息,具体如下:

struct service {
      /* list of all services */
      struct listnode slist;
      constchar *name; // 名称
      constchar *classname; // 类别: default
      unsigned flags; // 选项,参见init.h中SVC_宏定义


      pid_t pid; // service所在进程的pid


      time_t time_started; /* time of last start */
      time_t time_crashed; /* first crash within inspection window */
      int nr_crashed; /* number of times crashed within window */
      uid_t uid; // effective user ID
      gid_t gid; // effective group ID
      gid_t supp_gids[NR_SVC_SUPP_GIDS]; // supplementary group IDs
      size_t nr_supp_gids; // supp_gids的大小
      struct socketinfo *sockets; // 为service创建的sockets
      struct svcenvinfo *envvars; // 为service设置的环境变量
      struct action onrestart; /* Actions to execute on restart. */
      /* keycodes for triggering this service via /dev/keychord */
      int *keycodes;
      int nkeycodes;
      int keychord_id;
      int ioprio_class; // io优先级
      int ioprio_pri;
      int nargs; // 参数个数,参见下面的说明
      /* "MUST BE AT THE END OF THE STRUCT" */
      char *args[1]; // service [service name] [args] NULL # 包含了service的参数的个数+1
}; /* ^-------'args' MUST be at the end of this struct! */


·解析service节
定义service:service <name> <parthname> [ <argument> ]*。pathname代表启动service时用到的命令。

开始解析service节的函数为parse_service()。该函数的主要功能是:创建service对象,解析定义service的行,然后设置service的默认的class为default。

·解析service的option
解析service的option位于函数parse_line_service()中,该函数中支持的option如下:

capability # 暂时未实现
class <name> # 设置名称为name的类别,感觉有点像开机启动service的优先级,默认的class名称为default
console # 需要在android屏幕上打开控制台
disabled # 设置后,不能自动的通过class名称启动,必须显式的通过service名称启动
ioprio <rt|be|idle> <0-7> # 设置io优先级
group <groupname> [ <groupname> ]* # 设置服务进程的effective group ID(第一个参数)和supplementary group IDs(第二个到最后)
keycodes <keycodes> [ <keycodes> ]* # keycodes相关
oneshot # 服务退出时,不再启动,但可以通过名称启动
onrestart # 服务重启时,执行的命令,可能是服务的重启的时候,需要作一些额外的工作
critical # 是device-critical service,在4分钟内退出超过4次,那么设备会重启到recover模式下
setenv <name> <value> # 设置服务的环境变量
socket <name> <type> <perm> [ <user> [ <group> ]  ] # 为服务创建socket,可以创建多个
user <effectuserid> # 设置服务进程的effective user ID


·启动service

启动service的函数为service_start(struct service *svc, const char *dynamic_args)。dynamic_args只有当service的option中有oneshot是才会用到,此时会通过替换掉启动服务的命令参数启动服务。

service的option会记录在struct service中,故启动service时,考虑到这些选项即可。同时,会记录下service的pid、状态等。

在init进程中,启动service可以有以下的方式:

1.action下面添加和启动服务相关的command即可。action中和操作服务相关的命令有:

class_start <serviceclass> # 启动所有指定class的服务
class_stop <serviceclass> # 停止所有指定class的服务,后续没法通过class_start启动
class_reset <serviceclass> # 停止服务,后续可以通过class_start启动
restart <servicename> # 重启指定名称的服务,先stop,再start
start <servicename> # 启动指定名称的服务
stop <servicename> # 停止指定名称的服务


2.restart_processes()函数中。该函数位于init的主线程循环中,用来查看有没有需要重新启动的service。具体参考init.c

3.handle_property_set_fd()函数中。通过向socket名称为property_service的属性服务,发送控制的消息可以进入到该函数中。

4.handle_keychord()函数中。该函数和chorded keyboard有关。

·init.rc中的service

按照service的class来分的话,可以分为两大类:class core和class main。其中,class core中包含如下service:

1.ueventd /sbin/ueventd # 处理内核的uevent消息

2.console /system/bin/sh # 控制台服务

3.adbd /sbin/adbd # adb调试的服务端

4.servicemanager /system/bin/servicemanager # 管理服务的服务,被管理的服务通常是供应用程序使用的

5.vold /system/bin/vold # 管理存储设备

class main的service包括:

1.netd /system/bin/netd # 网络管理器

2.debuggerd /system/bin/debuggerd # 可以在logcat中输出调试信息

3.ril-deamon /system/bin/rild # 打电话的服务

4.surfaceflinger /system/bin/surfacefliger # 合成framebuffer的服务

5.zygote /system/bin/app_process # 孵化java应用进程的服务

6.drm /system/bin/drmserver # DRM服务,frameworks/base/drm

7.media /system/bin/mediaserver # 多媒体服务

8.bootanim /system/bin/bootanimation # 开机动画服务

9.dbus /system/bin/dbus-daemon # 用于进程间通讯的服务

10.bluetoothd /system/bin/bluetoothd # 蓝牙
11.installd /system/bin/installd # apk安装的服务
12.flash_recovery /system/etc/install-recovery.sh # recover recovery分区
13.racoon /system/bin/racoon # key management daemon
14.mtpd /system/bin/mtpd # MTP(Media Transfer Protocol) daemon
15.keystore /system/bin/keystore # 应用签名
16.dumpstate /system/bin/dumpstate # 性能测试工具


--转自 北京联动北方科技有限公司




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论