Android Service

来源:互联网 发布:软件开发工作计划表 编辑:程序博客网 时间:2024/06/05 18:35

一、Service分类

Android有3大类service, 处于android系统的不同框架层。

1、  init.rc中的service,系统集成工程师负责

service servicemanager/system/bin/servicemanager

   class core

   user system

   group system

   critical

   onrestart restart zygote

   onrestart restart media

   onrestart restart surfaceflinger

   onrestart restart drm

    这类service就是为了定义开启启动的程序,该类service的对象是一个可以执行的binary程序。把它定义为一种service是为了更好的描述该binary运行的属性,比如运行用户、组、启动一次(oneshot)还是不停启动(程序死掉后会再次启动)。更重要的是它还能描述各个程序之间的关系。比如onrestart restart drm,这个描述的意思是当drm程序重启时,该程序也要主动重启。    同时通过如下命令还可以运行时动态启动或者关闭某一service,当然要有root权限。

    property_set("ctl.start","servicemanager");property_set("ctl.stop","servicemanager");

    adb shell setprop ctl.start servicemanager;adbshell setprop ctl.stop servicemanager

2、 系统层service,framework系统工程师负责

    该类service和我们通常理解的service很接近,就是系统中提供服务的,该类service定义出服务接口,其他模块通过该接口即能使用该服务。该类服务的执行体可以是二进制代码,也可以是java代码。比如:

   c++类型的service:

       SurfaceFlinger,CameraManagerService, MediaPlayerService    

   java类型的service:

      ActivityManagerService,WindowManagerService,NetworkManagerService

    实现机制是该类service向上面提到的servicemanager注册它的服务,其他模块通过名字从servicemanager拿到service的接口。在shell通过命令 "service list"能列出系统中所有的该类service。

c++类型service相关接口:

    sp<IServiceManager> sm = defaultServiceManager(); 

    sm.addService(name, xx)/sm.getService(name)

java类型service相关接口:

    ServiceManager.getService(name)/addService(name,xx)

3、 SDK层service,android应用程序开发者

    不像前面两类service,它们是一类对象的总称,而该类service是开发者经常接触的一个很具体的java类android.app.Service.java。它是androidsdk暴露给第三方应用使用的。 它是和Activity对等的,是android四大组件之一(Activity,Service, Provider, BroadcastReceiver)。 

二、Service数据结构

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

 

struct service{         /* list of all services*/ 
    struct listnode slist; 
 
    const char *name; // 名称 
    const char *classname; // 类别:default 
 
    unsigned flags; // 选项,参见init.h中SVC_宏定义 
    pid_t pid; // service所在进程的pid 
    time_t time_started;   /* time of last start */ 
    time_ttime_crashed;    /* first crash within inspection window*/ 
    intnr_crashed;         /* number of timescrashed within window */ 
     
    uid_t uid; // effective userID 
    gid_t gid; // effective groupID 
    gid_tsupp_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 actiononrestart;  /* Actions to execute on restart. */ 
     
    /* keycodes for triggeringthis service via /dev/keychord */ 
    int *keycodes; 
    int nkeycodes; 
    int keychord_id; 
 
    int ioprio_class; // io优先级 
    int ioprio_pri; 
 
    int nargs; // 参数个数,参见下面的说明 
    /* "MUST BE AT THE ENDOF THE STRUCT" */ 
    char *args[1]; // service[service name] [args] NULL # 包含了service的参数的个数+1 
};

 

三、Service定义与解析

  • 定义

    service <name> <parthname> [<argument> ]*。

    pathname代表启动service时用到的命令。

  • 解析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(第一个参数)和supplementarygroup IDs(第二个到最后)

    keycodes <keycodes> [ <keycodes> ]*        //keycodes相关

    oneshot                                                        //服务退出时,不再启动,但可以通过名称启动

    onrestart                                                       //服务重启时,执行的命令,可能是服务的重启的时候,需要作一些额外的工作

    critical                                                           //是device-criticalservice,在4分钟内退出超过4次,那么设备会重启到recover模式下

    setenv <name> <value>                               //设置服务的环境变量

    socket <name> <type> <perm> [<user> [ <group> ]  ]      //为服务创建socket,可以创建多个

    user <effectuserid>                                       //设置服务进程的effectiveuser ID 

四、service启动

    启动service的函数为service_start(struct service *svc, constchar *dynamic_args)。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进程main函数:system/core/init/init.c

 

int main(){

  //挂载文件

      //解析配置文件:init.rc……

      //初始化action queue

…… for(;;){

           execute_one_command();

           restart_processes();

           for (i = 0; i < fd_count; i++)

                    { if (ufds[i].revents == POLLIN)

                               { if (ufds[i].fd ==get_property_set_fd())

                    handle_property_set_fd();

                                  else if (ufds[i].fd ==get_keychord_fd())

                    handle_keychord();

                               else if (ufds[i].fd ==get_signal_fd())

                    handle_signal();

               }

           }

          }

 

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

4. handle_keychord()函数中。该函数和chordedkeyboard有关,可参阅相关信息

 

五、init.rc中的service分类

    按照service的class来分的话,可以分为两大类:class core和class main。

class core的service包括:

    ueventd /sbin/ueventd # 处理内核的uevent消息
    console /system/bin/sh # 控制台服务
    adbd /sbin/adbd # adb调试的服务端
    servicemanager /system/bin/servicemanager # 管理服务的服务,被管理的服务通常是供应用程序使用的
    vold /system/bin/vold # 管理存储设备

class main的service包括:

    netd /system/bin/netd # 网络管理器
    debuggerd /system/bin/debuggerd # 可以在logcat中输出调试信息
    ril-deamon /system/bin/rild # 打电话的服务
    surfaceflinger /system/bin/surfacefliger # 合成framebuffer的服务
    zygote /system/bin/app_process # 孵化java应用进程的服务
    drm /system/bin/drmserver # DRM服务,frameworks/base/drm
    media /system/bin/mediaserver # 多媒体服务
    bootanim /system/bin/bootanimation # 开机动画服务
    dbus /system/bin/dbus-daemon # 用于进程间通讯的服务
    bluetoothd /system/bin/bluetoothd # 蓝牙
    installd /system/bin/installd # apk安装的服务
    flash_recovery /system/etc/install-recovery.sh #recover recovery分区
    racoon /system/bin/racoon # key managementdaemon
    mtpd /system/bin/mtpd # MTP(Media TransferProtocol) daemon
    keystore /system/bin/keystore # 应用签名
    dumpstate /system/bin/dumpstate # 性能测试工具

0 0
原创粉丝点击