原文地址:http://write.blog.csdn.net/postedit/9790677
开发板:samsung-exynos4412,android4.0.4
调试android设备驱动时经常需要修改init.rc和init.hardware.rc文件,init.rc经常修改,然而里面定义的trigger事件执行,谁先谁后一直没有特别在意,跟踪代码之后做个小结
文件路径:/system/core/init/*.*,里面有个readme.txt文件详细说明了Android init language的成员结构和使用方法。
提一句:Android init language不支持linux命令modprobe,只支持insmod
大致内容:
1. Init支持四种类型状态字:Actions,Commands,Services和Options。基本形式如下:
on <trigger> <command> <command> <command> service <name> <pathname> [<argument>]* <option> <option>
2. 所有Commands和Options专属于最近出现的Actions和Service
3. Actions和Services名字必须唯一,当重复时以先出现有效
具体有哪些Actions请参考readme文档!
该文档最后还有段注释:默认情况下init进程调用的service会把stdout和stderr重定向到/dev/null
可以通过logwrapper参数将log通过logcat输出,例如:
service akmd /system/bin/logwrapper /sbin/akmd
然后我们再看init.c文件,看看他解析rc文件的过程:
1. 首先为系统创建了/dev /proc /sys等根目录文件节点
2. 然后解析init.rc文件,将其中Actions和Services保存在一个单项循环链表中
3. import /proc/cmdline(这个文件没具体看什么时候生成的)到kernel_nv中,uboot启动方式charger还是power button就在import_kernel_nv函数中判断处理
4. 继续解析init.hardware.rc文件,将其中Actions和Services添加到单项循环链表队尾
5. 触发"early_init"事件
6. 等待/dev/.coldboot_done设备节点生成
7. load debault property : /default.prop
8. 其他初始化如keychord :/dev/keychord; console:/dev/tty0;import_kernel_nv的处理
9. 触发"init"事件
10. 触发"early-fs"事件
11. 触发"fs"事件
12. 触发"post-fs"事件
13. 触发"post-fs-data"事件
14. load /system/build.prop /system/default.prop /data/local/prop文件
15. 触发"early-boot"事件
16 触发"boot"事件
readme.txt中说on boot是init starts之后第一个触发的事件(init.conf加载之后),我理解是文件系统初始化之后的第一个事件。
有一个问题:Services何时启动,它和Actions有何顺序关系!
注意到rc文件中每一个service声明的时候紧跟着一行写得是:class xxxx 例如:
service buletoothd /system/bin/bluetoothd -d -n class main ..............
这个class可选值有:main,core,late_start,charger,这些参数被传递给command class_start
而command class_start在on boot触发时执行,代码在/root/init.rc中
on boot class_start core class_start main
根据前面的Actions触发顺序我们得知,Service是在最后才启动的,晚于on fs和on boot!
虽然class_start main位于init.rc中on boot之后,但是init.hardware.rc中on boot后面的command仍然在service start之前被执行
至于readme里面还有个on device-add-<path>这个触发条件比较特殊,我理解是on boot之后添加的devices才能被检测到
实际测试在on boot里面insmod一个模块,在里面注册一个devices设备检测不到,这个以后再分析原因了!