Android的启动脚本–init.rc

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


我们可以通过修改init.rc脚本来修改启动过程。但是,一般情况下,我们不直接修改init.rc,而是在文件init.%PRODUCT%.rc文件中添加或修改我们需要的额外的初始化配置。因为init.c中的main函数在解析完init.rc以后会继续解析init.%PRODUCT%.rc文件。要特别强调的是,init.rc文件和init.%PRODUCT%.rc文件都是用Android
Init Language语言来编写的。

Android Init
Language由四种类别的语句组成:Actions、Commands、Services、Options。


–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>

–Options–

Options是Services的修饰,它们影响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权限,owner为root,group为root创建。


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

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


setkey
暂时没有。

setprop <name> <value>
设置系统property
<name>的值<value>。

setrlimit <resource> <cur>
<max>
设置resource的rlimit。

start <service>

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

stop <service>
停止一个正在运行的服务。

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


sysclktz <mins_west_of_gmt>
设置系统时区(GMT为0)。

trigger
<event>
触发一个事件。用于调用其它action。

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

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

–Properties–

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

init.action

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

init.command
被执行的命令,如果没有则为”"。


init.svc.<name>

时间: 2024-10-17 14:45:58

Android的启动脚本–init.rc的相关文章

Android启动脚本init.rc(2)

在Android中使用启动脚本init.rc,可以在系统的初始化中进行简单的操作. init.rc启动脚本路径:system/core/rootdir/init.rc 内容: Commands:命令 Actions:动作 Triggers:触发条件 Services:服务 Options:选项 Properties:属性 Commands是一些基本操作.如: mkdir /system    mkdir /data 0771 system system    mkdir /persist 077

init进程 &amp;&amp; 解析Android启动脚本init.rc &amp;&amp; 修改它使不启动android &amp;&amp; init.rc中启动一个sh文件

Android启动后,系统执行的第一个进程是一个名称为init 的可执行程序.提供了以下的功能:设备管理.解析启动脚本.执行基本的功能.启动各种服务.代码的路径:system/core/init,编译的结果是一个可执行文件:init.这个init 的可执行文件是系统运行的第一个用户空间的程序,它以守护进程的方式运行.启动脚本则就是下面要讲的Init.rc. ======================================================================

Android启动过程——init.rc,Zygote,SystemServer

一.Android设备启动经历的三个阶段:Boot Loader:Linux Kernel:Android系统服务:每个阶段都有自己的启动画面. 1.Android中第一个被启动的进程--init,init进程的PID为0,其他的服务都由其进行创建.它是通过解析init.rc脚本来构建出系统的初始运行状态的.init进程是在系统启动启动过程中启动的. 2.init.rc语法规则: 1)Actions动作 一个Action实际上就是相应某个事件的过程.下面给出boot事件的脚本 /* \syste

服务器启动脚本 /etc/rc.local

/home/www/php/sbin/php-fpm /home/www/mysql/bin/mysqld_safe --defaults-file=/home/www/mysql/conf/my.cnf --ledir=/home/www/mysql/bin/ /home/www/se/bin/xs-ctl.sh start /home/www/lighttpd/sbin/lighttpd -f /home/www/lighttpd/conf//lighttpd.conf svnserve -

Android init.rc解析【转】

转自:http://www.linuxidc.com/Linux/2014-10/108438.htm 本文主要来自$Android_SOURCE/system/init/readme.txt的翻译. 1 简述 Android init.rc文件由系统第一个启动的init程序解析,此文件由语句组成,主要包含了四种类型的语句:Action,Commands,Services,Options.在init.rc文件中一条语句通常是占据一行.单词之间是通过空格符来相隔的.如果需要在单词内使用空格,那么得

Linux启动脚本rc.local 不执行的解决方法

目录 1./etc/rc.local是/etc/rc.d/rc.local的软链接 2.看看/etc/rc.d/rc.local的权限 3.修改/etc/rc.d/rc.local的可执行权限 4.重启解决 5.版权声明 如果Linux启动脚本/etc/rc.local文件没有被执行,可能是因为rc.loca文件没有可执行权限,按以下步骤解决这个问题. 1./etc/rc.local是/etc/rc.d/rc.local的软链接 执行ls -l /etc/rc.local看看. 2.看看/etc

android L 启动流程

android启动流程文章已经概述了android的启动流程,而andoird 5.0的流程其实也差不多,少数不同而已. 如下图: 整个启动流程与之前的一样,唯一不同的是android L支持64位的app,所以又起一个Zygote64来专门负责64位APK的孵化. 而且创建Zygote进程脚本在init.zygoteXX.rc里. 如下: system/core/rootdir/init.zygote64_32.rc system/core/rootdir/init.zygote64.rc s

Android白话启动篇(Android booting process)

今天我们将深入Android的启动流程,从用户按下开机键到Android界面的过程.在谷歌上搜索"Android boot process"会得到很多很好英文文章,讲解Android启动这一过程,每个人讲述的角度不一样,通过阅读,对于Android的理解将会更加深刻.下面是链接,打不开的请翻墙!谢谢! https://www.google.com.hk/search?q=The+Android+Booting+process&oq=The+Android+Booting+pro

Android使用init.rc触发脚本实现隐藏内置应用

[实现逻辑] 通过在property_service.c中设置标志位,在设置中实现接口改变标志位, 使用init.rc中声明的服务来侦听标志位的变化,显式启动声明的服务,执行对应的脚本,把应用后缀从apk重命名为bak,从而实现隐藏(显示逻辑相反). [实现步骤]以隐藏Google Play Store(system/priv-app/Phonesky.apk)为例: 1.首先在system/core/init/property_service.c中声明并初始化标志位,0为隐藏,1为显示,默认隐