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.rcimport /init.usb.rcimport /init.${ro.hardware}.rcimport /init.usb.configfs.rcimport /init.${ro.zygote}.rcimport /init.trace.rcimport /init.rilcommon.rcimport /init.sec_debug.rcimport /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 mainsocket rild stream 660 root radiosocket rild-debug stream 660 radio systemsocket rild-cas stream 660 casdrm mmbuser rootgroup radio cache inet misc audio log qcom_diag system drmrpc vpn system
service ril-daemon1 /system/bin/rild -c 2
class mainsocket rild2 stream 660 root radiosocket rild-debug2 stream 660 radio systemuser rootgroup radio cache inet misc audio log qcom_diag system drmrpc sdcard_r sdcard_rw shelldisabled
发现了有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/rildclass mainsocket rild stream 660 root radiosocket sap_uim_socket1 stream 660 bluetooth bluetoothsocket rild-debug stream 660 radio systemuser rootgroup radio cache inet misc audio log qcom_diag
init.qcom.rc
service ril-daemon2 /system/bin/rild -c 2class mainsocket rild2 stream 660 root radiosocket rild-debug2 stream 660 radio systemuser rootdisabledgroup 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=yesstop ril-daemon
0 0
- framework启动流程<二> init.rc 执行过程与解析
- Android的init过程:init.rc解析流程
- Android启动流程分析(七) init.rc的解析
- Android启动流程分析(八) 解析init.rc的action
- Android启动流程分析(九) 解析init.rc的service
- Framework启动流程(1) - init进程启动过程
- [原创]Android init.rc文件解析过程详解(二)
- Android init.rc文件解析过程详解(二)
- linux启动第一个应用程序init && init启动android过程解析 && init.rc与inittab的关系 && android property和linux 环境变量
- android init进程解析init.rc过程
- Android中init.rc文件的解析&&Android init进程启动过程分析
- Android的init过程(二):初始化语言(init.rc)解析
- Android的init过程(二):初始化语言(init.rc)解析
- Android的init过程(二):初始化语言(init.rc)解析
- Android的init过程(二):初始化语言(init.rc)解析
- Android的init过程(二):初始化语言(init.rc)解析
- Android的init过程(二):初始化语言(init.rc)解析
- Android的init过程(二):初始化语言(init.rc)解析
- oracle中varchar和varchar2区别
- Linux lsattr --显示档案隐藏属性
- [cocos2dx笔记017]cocos2dx 2.2.6 lua的类型转换
- spring3的properties文件的开发正式环境配置
- Java 通过httpClient Post方式提交xml,并从服务端返回数据
- framework启动流程<二> init.rc 执行过程与解析
- 分布式与集群的区别
- ubuntu解压命令全览(rar)
- HashMap的工作原理
- iOS集成环信SDK点击聊天图片无效问题
- Spring3 整合MyBatis3 配置多数据源 动态选择SqlSessionFactory
- Select * 与 Select 某几个字段,性能上有差异吗?
- java反射机制
- 'nodeName' 为空或不是对象的原因