Andoid init.c

在 Android中使用启动脚本init.rc,可以在系统的初始化过程中进行一些简单的初始化操作。这个脚本被直接安装到目标系统的根文件系统中,被 init可执行程序解析。 init.rc是在init启动后被执行的启动脚本,其语法主要包含了以下内容:

        Commands:命令
         Actions: 动作
        Triggers:触发条件
       Services:服务
       Options: 选项
        Propertise:属性

Actions

-------

Actions 是一系列命令的命名。Actions拥有一个触发器(trigger)用来决定 action何时执行。当一个 action 在符合触发条件被执行时,如果它还没被加入到待执行队列中的话,则加入到队列最后。

队列中的 action依次执行,action中的命令也依次执行。Init 在执行命令的中间处理其它活动(设备创建/ 销毁,property设置,进程重启)

Actions 表现形式为:

on <trigger>

   <command>

   <command>

   <command>

 

Services

--------

Services是由init启动 ,在它们退出时重启(可选)Service表现形式为:

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

   <option>

   <option>

   ...

      如果该服务选项中没有disabled定义,则在init.rc中解析到这个服务的时候,会马上执行这个服务。而如果在服务的选项中增加了disabled定义,则该服务不会在init.rc中启动,需要我们在代码中使用以下方法来启动:property_set("ctl.start", "wifi_dhcpcd");上句话的意思是,我要启动wifi_dhcpd这个服务了。


Options

-------

OptionsServices的修饰,它们影响 init何时、如何运行 service .

 

critical

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

 

disabled

     这个服务的级别将不会自动启动,它必须被依照服务名指定启动才可以启动。

 

setenv <name> <value>

     设置已启动的进程的环境变量<name>的值<value>

 

socket <name> <type> <perm> [ <user> [ <group> ] ]

     创建一个名为/dev/socket/<name>unix domin socket,并传送它的 fd 到已启动的进程。 <type> 必须为"dgram" "stream".用户和组默认为 0.

 

user <username>

     在执行服务前改变用户名。当前默认为root.如果你的进程需要linux能力,你不能使用这个命令。你必须在还是root时请求能力,并下降到你需要的uid.

 

group <groupname> [ <groupname> ]*

     在执行服务前改变组。在第一个组后的组将设为进程附加组(通过setgroups()).当前默认为 root.

 

oneshot

     在服务退出后不重启。

 

class <name>

     service 指定一个类别名。同样类名的所有的服务可以一起启动或停止。如果没有指定类别的服务默认为 "default" 类。

 

onrestart

       当服务重启时执行一个命令。

 

Triggers

--------

     Triggers(触发器)是一个字符串,可以用来匹配某种类型的事件并执行一个 action

 

boot

     这是当init开始后执行的第一个触发器(/init.conf 被加载 )

 

<name>=<value>

     property <name>被设为指定的值<value> 时触发。

 

device-added-<path>

device-removed-<path>

     当设备节点被添加或移除时触发。

 

service-exited-<name>

     当指定的服务存在时触发

 

 

Commands

--------

 

exec <path> [ <argument> ]*

     Fork 并执行一个程序(<path>).这将被block直到程序执行完毕。最好避免执行例如内建命令以外的程序,它可能会导致init被阻塞不动。

 

export <name> <value>

     设定全局环境变量<name>的值<value>,当这个命令执行后所有的进程都可以取得。

 

ifup <interface>

     使网络接口<interface>联机。

 

import <filename>

     解析一个init配置文件,扩展当前配置文件。

 

hostname <name>

     设置主机名

 

chmod <octal-mode> <path>

     改变文件访问权限

 

chown <owner> <group> <path>

     改变文件所属和组

 

class_start <serviceclass>

     当指定类别的服务没有运行,启动该类别所有的服务。

 

class_stop <serviceclass>

     当指定类别的服务正在运行,停止该类别所有的服务。

 

domainname <name>

     设置域名。

 

insmod <path>

     加载该路径<path>的模块

 

mkdir <path> [mode] [owner] [group]

     <path> 创建一个目录 , 可选选项 :mod,owner,group. 如果没有指定,目录以 755 权限, ownerroot,grouproot创建 .

 

mount <type> <device> <dir> [ <mountoption> ]*

     尝试 mount <device> 到目录 <dir>. <device> 可以用 mtd@name格式以命名指定一个mtd块设备。<mountoption>包含 "ro","rw","remount","noatime".

 

setkey

     暂时没有

 

setprop <name> <value>

     设置系统property <name>的值<value>.

 

setrlimit <resource> <cur> <max>

     设置resourcerlimit.

 

start <service>

     启动一个没有运行的服务。

 

stop <service>

    停止一个正在运行的服务

 

symlink <target> <path>

     创建一个 <path> 的符号链接到 <target>

 

sysclktz <mins_west_of_gmt>

     设置系统时区(GMT0)

 

trigger <event>

     触发一个事件。用于调用其它action

 

write <path> <string> [ <string> ]*

     打开 <path> 的文件并写入一个或多个字符串。

 

 

Properties

----------

Init 会更新一些系统property以提供查看它正在干嘛。

init.action

     当前正在执行的action,如果没有则为""

 

init.command

     被执行的命令,如果没有则为""

 

init.svc.<name>

     命名为 <name> 的服务的状态 ("stopped", "running", "restarting")


每个属性都有一个名称和值,他们都是字符串格式。属性被大量使用在Android系统中,用来记录系统设置或进程之间的信息交换。属性是在整个系统中全局可见的。每个进程可以get/set属性。
在系统初始化时,Android将分配一个共享内存区来存储的属性。这些是由“init”守护进程完成的,其源代码位于:device/system/init。“init”守护进程将启动一个属性服务。属性服务在“init”守护进程中运行。每一个客户端想要设置属性时,必须连接属性服务,再向其发送信息。属性服务将会在共享内存区中修改和创建属性。任何客户端想获得属性信息,可以从共享内存直接读取。这提高了读取性能。
客户端应用程序可以调用libcutils中的API函数以GET/SET属性信息。libcutils的源代码位于:device/libs/cutils。API函数是:
int property_get(const char *key, char *value, const char *default_value);
int property_set(const char *key, const char *value);
而libcutils又调用libc中的 __system_property_xxx 函数获得共享内存中的属性。libc的源代码位于:device/system/bionic。
属性服务调用libc中的__system_property_init函数来初始化属性系统的共享内存。当启动属性服务时,将从以下文件中加载默认属性:
/ default.prop
/system/build.prop
/system/default.prop
/data/local.prop
属性将会以上述顺序加载。后加载的属性将覆盖原先的值。这些属性加载之后,最后加载的属性会被保持在/data/property中。

 特别属性
如果属性名称以“ro.”开头,那么这个属性被视为只读属性。一旦设置,属性值不能改变。
如果属性名称以“persist.”开头,当设置这个属性时,其值也将写入/data/property。
如果属性名称以“net.”开头,当设置这个属性时,“net.change”属性将会自动设置,以加入到最后修改的属性名。(这是很巧妙的。 netresolve模块的使用这个属性来追踪在net.*属性上的任何变化。)
属性“ ctrl.start ”和“ ctrl.stop ”是用来启动和停止服务。每一项服务必须在/init.rc中定义.系统启动时,与init守护进程将解析init.rc和启动属性服务。一旦收到设置“ ctrl.start ”属性的请求,属性服务将使用该属性值作为服务名找到该服务,启动该服务。这项服务的启动结果将会放入“ init.svc.<服务名>“属性中 。客户端应用程序可以轮询那个属性值,以确定结果。

Android toolbox程序
Android toolbox程序提供了两个工具: setprop和getprop获取和设置属性。其使用方法:
getprop <属性名>
setprop <属性名><<属性值>

Java
在Java应用程序可以使用System.getProperty()和System.setProperty()函数获取和设置属性。

Action
默认情况下,设置属性只会使"init"守护程序写入共享内存,它不会执行任何脚本或二进制程序。但是,您可以将您的想要的实现的操作与init.rc中某个属性的变化相关联.例如,在默认的init.rc中有:

    # adbd on at boot in emulator
    on property:ro.kernel.qemu=1
       start adbd
    on property:persist.service.adb.enable=1
       start adbd
    on property:persist.service.adb.enable=0
       stop adbd

这样,如果你设置persist.service.adb.enable为1 ,"init"守护程序就知道需要采取行动:开启adbd服务。

 

 

共享内存就是Android特有的共享方式:ashmen

Ashmem是一个匿名共享内存(Anonymous SHaredMEMory)系统,该系统增加了接口因此进程间可以共享具名内存块。举一个例子,系统可以利用Ashmem存储图标,当绘制用户界面的时候多个进程也可以访问。Ashmem优于传统Linux共享内存表现在当共享内存块不再被用的时候,它为Kernel提供一种回收这些共享内存块的手段。如果一个程序尝试访问Kernel释放的一个共享内存块,它将会收到一个错误提示,然后重新分配内存并重载数据。




on init

//在init.c下

//action_for_each_trigger("init",action_add_queue_tail);

//drain_action_queue(); 

//执行on init下的action;

 

sysclktz 0

//设置系统时钟基准(0代表时钟滴答以格林威治平均时(GMT)为准)

 

loglevel 3

//设置loglevel中打印级别。

//依次执行do_loglevel()@builtins.c,  log_set_level()@util.c

//只有小于等于 loglevel才输出,参见log_write@util.c

//如果设置为3,也就是ERROR可以输出而INFO没有输出。

//#define ERROR(x...)  log_write(3, "<3>init: " x)

//#define INFO(x...) log_write(6, "<6>init: " x)

 

export PATH ......

//设置全局变量

 

symlink /system/etc  /etc

//symlink <target> <path>  :创建一个指向<path>的软连接<target>

 

mkdir ...

//  mkdir <path> [mode] [owner] [group]
//创建一个目录<path>,可以选择性地指定mode、owner以及group。如果没有指定,默认的权限为755,并属于root用户和root组。

 

mount ...

//mount <type> <device> <dir> [ <mountoption> ]*
//试图在目录<dir>挂载指定的设备。<device> 可以是以 mtd@name的形式指定一个mtd块设备。<mountoption>包括 //"ro"、"rw"、"remount"、"noatime"、 ...

 

write /proc/sys/kenel/panic_on_oops 1

//This file (new in Linux 2.5) controls the kernel's behaviour when anoops or BUG is encountered. If this file contains 0, then the systemtries to continueoperation. If it contains 1, then the system delays a few seconds (togive klogd time to record the oops output) and then panics. If the/proc/sys/kernel/panic file is also non-zero then the machine will be rebooted.

 

    write /proc/sys/kernel/sched_latency_ns 600000
    write /proc/sys/kernel/sched_wakeup_granularity_ns 2000000
    write /proc/sys/kernel/sched_compat_yield 1
    write /proc/sys/kernel/sched_child_runs_first 0
    write /proc/sys/kernel/sched_min_granularity_ns 400000
    write /proc/sys/kernel/sched_features 24188



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值