android init.rc 总结

一、            init.rc 中包含的四种语法:

1、 动作(Action)

2、  命令(Commands)

3、  服务(Services)

4、  选项(Options)

 二、            init.rc 语法使用:

1、  Action 和 Commands 一起使用,形式如下

on <trigger>
<command>

<command>
<command>

其中trigger是触发条件,也就是说在满足触发条件的情况下执行1个或多个相应的命令,举例如下:

onproperty:persist.service.adb.enable=1
start adbd

 动作触发条件:

1) early-initInitearly-bootboot 

初始化开始(载入配置文件)的时候触发

 2)<name>=<value>

当名为<name>的属性(property)的值为<value>的时候触发。

只要属性一改变就会被触发,然后执行相应的命令:

所以如果在终端下输入:
setprop property:persist.service.adb.enable 1或者0
那么将会开启或者关闭adbd 程序。

 命令(Command)的形式

1) exec <path> [ <argument> ]*
复制(fork)和执行路径为<path>的应用程序,<argument>为该应用程序的参数,在该应用程序执行完前,此命令(Command)会屏蔽

2) export <name> <value>
声明名为<name>的环境变量的值为<value>,声明的环境变量是系统环境变量,启动后一直有效。

3) ifup <interface>
启动名为<interface>的网络接口

4) import <filename>
加入新的位置文件,扩展当前的配置。

5) hostname <name>
设置主机名

6)sysclktz<mins_west_of_gmt>

设置系统时区(GMT0)

7) class_start<serviceclass>
启动指定类别的所有服务

8) class_stop <serviceclass>
停止指定类别的所有服务

9) domainname <name>
设置域名

10) insmod <path>
加载路径为<path>的内核模块

11) mkdir <path>
创建路径为<path>目录

12) mount <type> <device> <dir> [<mountoption> ]*
挂载类型为<type>的设备<device>到目录<dir>,<mountoption>为挂载参数,举例如下:
mount ubifs ubi1_0/data nosuid nodev

13) setprop <name> <value>
设置名为<name>的系统属性的值为<value>

14) setrlimit <resource> <cur> <max>
设置资源限制,

15) start <service>
启动服务(如果服务未运行)

16) stop <service>
停止服务(如果服务正在运行)

17) symlink <target> <path>
创建一个从<path>指向<target>的符号链接,举例:
symlink /system/etc/etc

18) write <path> <string> [<string> ]*
打开路径为<path>的文件并将一个多这多个字符串写入到该文件中。

19)在代码中start/stop某个service

property_set("ctl.start",ServiceName);就是启动ServiceName服务(init.rc中定义)

property_set("ctl.stop",ServiceName)相对的是关闭ServiceName服务。

比如:开机动画就是在surfaceFlinger中启动的:

property_set("ctl.start","bootanim");

 2、  Services 和Options 一起使用,形式如下

service <name> <pathname> [<argument> ]*
<option>

<option>

 上面内容解释为:

service 服务名称 服务对应的命令的路径 命令的参数
选项
选项
...

举例如下:
service vold/system/bin/vold

socket vold stream0660 root mount

service bootsound/system/bin/playmp3
user media
group audio
oneshot

vold和bootsound分别是两个服务的名称,/system/bin/vold和/system /bin/playmp3分别是他们所对应的可执行程序。
socket
、user、group、oneshot就是配合服务使用的选项。其中oneshot选项表示该服务只启动一次,而如果没有oneshot选项,
这个可执行程序会一直存在--如果可执行程序被杀死,则会重新启动。

 选项是影响服务启动和运行的参数,主要的选项如下:

1)    disabled:禁用服务,此服务开机时不会自动启动,但是可以在应用程序中手动启动它。

2)    socket

socket <type> <name> <perm> [<user> [ <group> ] ]
套接字 类型 名称 权限 用户 组
创建一个名为/dev/socket/<name>,然后把它的fd传给启动程序
类型type的值为dgram或者stream
perm
表示该套接字的访问权限,user和group表示改套接字所属的用户和组,这两个参数默认都是0,因此可以不设置。

adbd服务:

service adbd /sbin/adbd

class core

socket adbd stream 660 system system

3)    user

user <username>
执行服务前切换到用户<username>,此选项默认是root,因此可以不设置。

4)    group

group <groupname> [ <groupname> ]*
执行服务前切换到组<groupname>,此选项默认是root,因此可以不设置

5)    oneshot

服务只启动一次,一旦关闭就不能再启动。

6)    class

class <name>
为服务指定一个类别,默认为"default",同一类别的服务必须一起启动和停止

7)    critical

 这是一个设备关键服务(device-critical service) . 如果它在4 分钟内退出超过4 次,设备将重启并进入恢复模式。
 

三、            init.rc 执行顺序:(参考 system/core/init/init.c 代码)

1、 on early-init

2、 init.c  queue_builtin_action()

wait_for_coldboot_done

keychord_init

console_init

3、 on init

4、 on early-fs

5、 on fs

6、 on post-fs

7、 on post-fs-data

8、 init.c queue_builtin_action()

property_service_init

signal_init

check_startup

9、 on early-boot

10、        on boot

四、init.rc 执行的关键动作

1、 执行on early-init

a)      write /proc/1/oom_adj -16   #设置oom_adj

b)     start ueventd

c)      mkdir /mnt 0775 root system

2、 执行on init

a)      sysclktz 0 #设置GMT(格林尼治时间),中国式GMT +8

b)     loglevel 3  #ERROR级别的输出,eclipse中的DDMS也可以调整

#define KLOG_ERROR(tag,x...)  klog_write(3, "<3>" tag ": " x)

#define KLOG_WARNING(tag,x...) klog_write(4,"<4>" tag ": " x)

#define KLOG_NOTICE(tag,x...) klog_write(5, "<5>" tag ": " x)

#define KLOG_INFO(tag,x...)   klog_write(6, "<6>" tag ": " x)

#define KLOG_DEBUG(tag,x...)  klog_write(7, "<7>" tag ": " x)

c)      export全局变量

d)     创建根目录文件夹

    mkdir/system

    mkdir/data 0771 system system

mkdir /cache 0770 system cache

3、 执行on fs

加载系统ko

insmod /system/lib/modules/***.ko

4、 执行on post-fs

Mount 文件系统

mount rootfs rootfs / shared rec

5、 执行on post-fs-data

初始化/data/分区目录结构

    chown system system /data

chmod 0771 /data

6、 执行on boot

启动 core/main类型的服务

class_start core

class_start main

7、 启动core类型service

1)     service ueventd /sbin/ueventd

2)     service console /system/bin/sh  #option disable:启动时不执行

3)     service adbd /sbin/adbd   #option disable:启动时不执行

4)     service servicemanager/system/bin/servicemanager

5)     service vold /system/bin/vold

8、 启动main类型 service

1)     service displayd /system/bin/displayd

2)     service netd /system/bin/netd

3)     service debuggerd /system/bin/debuggerd

4)     service surfaceflinger/system/bin/surfaceflinger

5)     service zygote /system/bin/app_process -Xzygote/system/bin --zygote --start-system-server

6)     service drm /system/bin/drmserver

7)     service media /system/bin/mediaserver

8)     service bootanim /system/bin/bootanimation

9)     service installd /system/bin/installd

10)   service flash_recovery/system/etc/install-recovery.sh

11)   service sshd /system/bin/start-ssh

 

参考:http://blog.csdn.net/zhenwenxian/article/details/7506392

http://blog.csdn.net/kickxxx/article/details/7590665

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值