framework启动流程<二> init.rc 执行过程与解析 init.rc 简介: 由init进程解析并运行, init.rc由许多的Action和Service组成。每一个语句占据一行,并且各个关键字被空格分开.
init.rc 导入的其他rc文件: import /init.environ.rc import /init.usb.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