framework启动流程<二> init.rc 执行过程与解析

来源:互联网 发布:java poi svg 编辑:程序博客网 时间:2024/05/20 17:42

关注重点
     - ro.hardware 属性的设置
     - init.rc 执行了操作
     - init.rc 做了什么和RIL穷相关的操作
     - 如何控制socket 和rild进程的创建, 单卡双卡
尝试自己修改
     - 改变rild 以及socket 的启动数量
     - 加log debug rild 启动过程


http://www.cnblogs.com/nokiaguy/archive/2013/04/14/3020774.html


init.rc 简介:
     由init进程解析并运行,
init.rc由许多的Action和Service组成。每一个语句占据一行,并且各个关键字被空格分开.


init.rc 导入的其他rc文件:
import /init.environ.rc
import /init.usb.rc
import /init.${ro.hardware}.rc
import /init.usb.configfs.rc
import /init.${ro.zygote}.rc
import /init.trace.rc
import /init.rilcommon.rc
import /init.sec_debug.rc
import /init.container.rc
     ro.hardware = qcom , 所以init.${ro.hardware}.rc = init.qcom.rc
     这些文件都在手机的根目录, 使用adb 命令可以查看到       
     
     代码目录
          android/system/core/rootdir 
               init.trace.rc
               init.usb.configfs.rc
               init.${ro.zygote}.rc
               init.usb.rc
               init.environ.rc
          android/device/qcom/common/rootdir/etc/
               init.qcom.rc
          android/vendor/samsung/common/build/core
               init.container.rc
          android/vendor/samsung/common/data
               init.rilcommon.rc

在android根目录的那些rc文件
     init.carrier.rc
     init.contaier.rc
     init.environ.rc
     init.qcom.rc
     init.qcom.usb.rc
     init.rc
     init.rilchip.rc
     init.rilcommon.rc
     init.sec_debug.rc
     init.target.rc
     init.usb.rc
     init.usb.configfs.rc
     init.zygote32.rc
     init.zygote64_32.rc


ril 相关的路径
     init.rc -> init.rilcommon.rc-> init.rilcarrier.rc , init.rilchip.rc , init.rilepdg.rc

     init.rilchip.rc 
          service ril-daemon /system/bin/rild
    class main
    socket rild stream 660 root radio
    socket rild-debug stream 660 radio system
    socket rild-cas stream 660 casdrm mmb
    user root
    group radio cache inet misc audio log qcom_diag system drmrpc vpn system

          service ril-daemon1 /system/bin/rild -c 2
    class main
    socket rild2 stream 660 root radio
    socket rild-debug2 stream 660 radio system
    user root
    group radio cache inet misc audio log qcom_diag system drmrpc sdcard_r sdcard_rw shell
    disabled

     发现了有service同名的情况,猜测,只认第一次定义的service, 后面定义的同名service无效


init.rc 语法 Andoird Init Language
     解析文档android\system\core\init\readme.txt
翻译:
     android出事语言由4个部分组成, actions, commands , services, options
     他们都是面向行的,每个token由白色空格分隔。c语言风格的反斜杠,避免加入空格到一个符号.
     以#开始的行,是注释行。
     Action和services 隐性地申明了一个section 块。所有的commands 和 options 属于最近申明的section块。在section块之前的commands和options无效
     Action和services拥有唯一的名字,如果重复了会报错
     
     - Action
     ---------
          Action是commands序列 。 Actions 有一个触发器决定何时可以执行此action。当发生的event和触发器一致时,这个action会被添加到预执行队列的尾部
          执行队列上的action, 被inti 进程取出,然后执行
          Action 格式如下
              on <trigger>
             <command>
             <command>
             <command>
     - Services
     -----------
          Service规划哪些服务要被init进程加载或者重启。
          Service格式如下
              service <name> <pathname> [ <argument> ]*
                  <option>
                  <option>
                  ... 
     - Options
     --------- 
          Options 是services的修改器,他们影响init加载服务的时机与条件
          - critical
          - disabled
          - setenv <name> <value>         
          - socket <name> <type> <perm> [ <user> [ <group> [ <seclabel> ] ] ]
          - user <username>
          - group <groupname> [ <groupname> ]*
          - seclabel <seclabel>
          - oneshot
          - class <name>
          - onrestart
          - writepid <file...>

     - Triggers
      ---------- 
          触发器是字符串,当和事件匹配时,会触发action的执行
          - boot
          - <name>=<value>
          - 
     - Commands
       ------------- 
          - bootchart_init
          - chmod <octal-mode> <path>
          - chown <owner> <group> <path>
          - class_start <serviceclass>
          - class_stop <serviceclass>
          - class_reset <serviceclass>
          - copy <src> <dst>
          - domainname <name>
          - enable <servicename>
          - exec [ <seclabel> [ <user> [ <group> ]* ] ] -- <command> [ <argument> ]*
          - export <name> <value>
          - hostname <name>
          - ifup <interface>
          - import <filename>
          - insmod <path>
          - load_all_props
          - load_persist_props
          - loglevel <level>
          - mkdir <path> [mode] [owner] [group]
          - mount_all <fstab>
          - mount <type> <device> <dir> [ <flag> ]* [<options>]
          - powerctl
          - restart <service>
          - restorecon <path> [ <path> ]*
          - restorecon_recursive <path> [ <path> ]*
          - rm <path>
          - rmdir <path>
          - setprop <name> <value>
          - setrlimit <resource> <cur> <max>
          - start <service>
          - stop <service>
          - swapon_all <fstab>
          - symlink <target> <path>
          - sysclktz <mins_west_of_gmt>
          - trigger <event>
          - verity_load_state
          - verity_update_state <mount_point>
          - wait <path> [ <timeout> ]
          - write <path> <content>
  
ril相关init language: 
     init.rc
          import /init.${ro.hardware}.rc

service ril-daemon /system/bin/rild
    class main
    socket rild stream 660 root radio
    socket sap_uim_socket1 stream 660 bluetooth bluetooth
    socket rild-debug stream 660 radio system
    user root
    group radio cache inet misc audio log qcom_diag
     
     init.qcom.rc
service ril-daemon2 /system/bin/rild -c 2
    class main
    socket rild2 stream 660 root radio
    socket rild-debug2 stream 660 radio system
    user root
    disabled
    group radio cache inet misc audio sdcard_r sdcard_rw qcom_diag diag log
     解析:
     class main :
          - class <name>
          - 归为main 类,同个class名的所有service可以同时开始,同时停止。默认是default
     socket rild stream 660 root radio
          - 创建一个unix domain的socket, /dev/socket/<name> , 通过adb命令可以查看。
          - socket <name> <type> <perm> [ <user> [ <group> [ <seclabel> ] ] ]
               - name : rild
               - type : stream , 
               - perm : 660 
               - user : root , 访问这个socket所需要的用户名,root 是管理员账号
               - group : radio , 访问这个socket所需要的群组名
     user root 
          - 访问这个service所需要的用户名
     disabled
          - 这个service不能够根据class被启动,必须使用名字来启动
     group radio cache inet misc audio log qcom_diag
          - radio cache inet misc audio log qcom_diag 群组的可以调用这个服务


启动服务的方法:
     从log我们知道ril_daemon 默认是disable的, 那么如何启动这个服务
     1. 通过command命令在rc文件中启动
     Command:
          - start <service>
          - stop <service>
    2. 通过设置属性来启动
          property_set("ctl.start", service_xx); 


Wifi 型号关闭rild
     init.rilcommon.rc 监控noril的属性值,如果ril-daemon启动的话就会把ril关闭掉
     init.rilcommon.rc
          # for Wi-Fi only models
          on property:ro.radio.noril=yes
          stop ril-daemon
0 0
原创粉丝点击