原文地址: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设备检测不到,这个以后再分析原因了!

更多相关文章

  1. android 实用sax 读取xml文件内容 附源码
  2. android遍历sd卡中的所有文件
  3. Android 事件触发机制的深入学习
  4. Android 实现多个Audio文件的顺序播放
  5. 解决 Android 下载中文文件名问题
  6. Android ViewGroup 触摸屏事件派发机制和源码分析
  7. Android触摸事件的传递(四-1)--输入系统-InputReader
  8. maven 学习笔记(五)-创建简单的eclipse+android+maven工程(打包为aa

随机推荐

  1. Android的Button监听
  2. cocoscreator构建的android工程报错
  3. Android设置StatusBar颜色
  4. android 设置progressbar的背景颜色
  5. android studio release版本下打印输出日
  6. Android(Java):Android(安卓)jni学习(二)
  7. Android(安卓)中compiledSDKVersion,minS
  8. ADT-abundle-使用过程中不断出现的错误
  9. 2015.01.16 Android错误集(1)
  10. android apk源码