• android init.rc参数介绍


    参考system/core/init/readme.txt

    http://aospxref.com/android-11.0.0_r21/xref/system/core/init/

     1 struct service { 
     2         /* list of all services */ 
     3     struct listnode slist; 
     4  
     5     const char *name; // 名称 
     6     const char *classname; // 类别: default 
     7  
     8     unsigned flags; // 选项,参见init.h中SVC_宏定义 
     9     pid_t pid; // service所在进程的pid 
    10     time_t time_started;    /* time of last start */ 
    11     time_t time_crashed;    /* first crash within inspection window */ 
    12     int nr_crashed;         /* number of times crashed within window */ 
    13      
    14     uid_t uid; // effective user ID 
    15     gid_t gid; // effective group ID 
    16     gid_t supp_gids[NR_SVC_SUPP_GIDS]; // supplementary group IDs 
    17     size_t nr_supp_gids; // supp_gids的大小 
    18  
    19     struct socketinfo *sockets; // 为service创建的sockets 
    20     struct svcenvinfo
    21 *envvars; // 为service设置的环境变量 
    22  
    23     struct action onrestart;  /* Actions to execute on restart. */ 
    24      
    25     /* keycodes for triggering this service via /dev/keychord */ 
    26     int *keycodes; 
    27     int nkeycodes; 
    28     int keychord_id; 
    29  
    30     int ioprio_class; // io优先级 
    31     int ioprio_pri; 
    32  
    33     int nargs; // 参数个数,参见下面的说明 
    34     /* "MUST BE AT THE END OF THE STRUCT" */ 
    35     char *args[1]; // service [service name] [args] NULL # 包含了service的参数的个数+1 
    36 }; /*     ^-------'args' MUST be at the end of this struct! */ 

    定义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的属性服务,发送控制的消息可以进入到该函数中。具体可以参考property_service.c
    4.handle_keychord()函数中。该函数和chorded keyboard有关,可参阅相关信息

    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 management daemon
    mtpd /system/bin/mtpd # MTP(Media Transfer Protocol) daemon
    keystore /system/bin/keystore # 应用签名
    dumpstate /system/bin/dumpstate # 性能测试工具

  • 相关阅读:
    【NodeJs】Nodejs系列安装
    【webstrom+stylus】stylus在webstrom中的识别
    python基础:数据类型一
    python基础:流程控制案例:
    python基础:if判断与流程控制案例
    计算机基础与python入门
    Robot Framework-断言函数
    RF设置全局变量
    RF自定义系统关键字
    RF第二讲--Selenium2Library库的简单实用
  • 原文地址:https://www.cnblogs.com/SaraMoring/p/14520156.html
Copyright © 2020-2023  润新知