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

294 阅读3分钟

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

init.rc 导入的其他rc文件: import /init.environ.rc import /init.usb.rc import /init.ro.hardware.rcimport/init.usb.configfs.rcimport/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 - 归为main 类,同个class名的所有service可以同时开始,同时停止。默认是default socket rild stream 660 root radio - 创建一个unix domain的socket, /dev/socket/ , 通过adb命令可以查看。 - socket [ [ [ ] ] ] - 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 - stop 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