赞
踩
0. 在Android.mk 同目录下新建文件haha.sh (文件名任意),执行shell 操作, 以下简单举例
- #!/bin/sh
-
- rm -rf /system/etc/xxx
1. 在Android.mk 同目录下新建文件test.rc (文件名任意)
含义:当设置系统属性persist.vendor.test.haha=2时,启动服务,执行shell 脚本
- on property:persist.vendor.test.haha=2
- start haha-sh
-
- service haha-sh /vendor/bin/haha.sh
- class main
- user root
- group root
- disabled
- oneshot
2. 在Android.mk 中添加配置
LOCAL_INIT_RC := test.rc
3. 在型号添加配置模块的mk 文件中添加以下内容,将代码中的sh 文件copy 到vendor/bin 目录下
- PRODUCT_COPY_FILES += \
- vendor/apps/TestApp/haha.sh:$(TARGET_COPY_OUT_VENDOR)/bin/haha.sh \
- service <name> <pathname> [ <argument> ]*
- <option>
- <option>
- ...
<name>
——表示service 的名字;<pathname>
——表示service所在路径,此处的service是可执行文件,所以一定有存储路径;<argument>
——启动service所带的参数;<option>
——对此service的约束选项,后面将详细讲解;Option用来定义Service的行为,决定了Service将在何时启动,如何运行等。常用的Option有包括以下一些。
<name> <value>
<name>=<value>
在加载的进程中。<name> <type> <perm> [ <user> [ <group> [ <context> ] ] ]
/dev/socket/<name>
的UNIX域socket并将fd传递到加载的进程中。<type>
必须是"dgram", "stream", "seqpacket"中的一种。<user>
和<group>
默认为0.<context>
是 SELinux socket 安全上下文,默认为service安全级别,可以指定为seclabel或根据service的可执行文件的安全级别计算。
<username>
<groupname> [ <groupname> ]*
<securitycontext>
<name>
init进程是Android系统中用户空间的第一个进程,进程ID为1,源代码位于system/core/init
目录。作为Android系统的第一个进程,Init进程承担这很多重要的初始化任务,一般Init进程的初始化可以分为两部分,前半部分挂载文件系统,初始化属性系统和Klog, selinux的初始化等,后半部分重要通过解析init.rc来初始化系统daemon
服务进程,然后以epoll的监控属性文件,系统信号等。
init.rc则是init进程启动的配置脚本,这个脚本是用一种叫Android Init Language(Android初始化语言)的语言写的。在7.0以前,init进程只解析根目录下的init.rc文件,但是随着版本的迭代,init.rc越来越臃肿,在7.0以后,init.rc一些业务被拆分到/system/etc/init
, /vendor/etc/init
, /odm/etc/init
三个目录下。
init.rc包括四种类型的语句:
- Action和Service隐式定义了一个新的section(段),所有Command或Option属于最近定义的section。在第一个section之前的Command或Option将被忽略。
- Action 和Services 都有唯一的名字,如果出现动作或者服务重名,则会被当做错误处理。
- 所有语句都是面向行的,以空格分割每行包含的若干token。C风格的反斜杠可以用于token中插入空格,双引号同样可以避免空格将文本分为多个token。反斜杠是一行的最后一个字符时,将用于续行。
- 以#开头的行(前面有空格也是允许的)是注释。
语法格式
- on <trigger> ##触发条件
- <command1> ##执行命令
- <command2> ##可以同时执行多个命令
- <command3>
Action是有名字的一系列的命令。Action有一个trigger(触发器),用于决定该Action应在何时执行。当一个事件发生并匹配了一个Action的trigger,相应的Action将被添加到即将执行(to-be-executed)队列的尾部(除非该Action存在与队列上了)。
每个action在队列中顺序排列,每个action中的command将会顺序执行。init在执行command的过程中同时会执行其他活动(设备节点的创建/销毁,属性设置,进程重启)。
init.rc中常见的trigger如下:
trigger | Description |
---|---|
boot | init程序启动后触发的第一个事件 |
<name>=<value> | 当属性<name> 满足<value> 时触发 |
device-added/removed-<patch> | 当设备节点添加/删除时触发此事件 |
sevice-exited-<name> | 当指定服务<name> 存在时触发 |
下面列举两种常见的Action定义代码:
- #当init被触发时执行
- on init
- <command>
- ...
- #当属性sys.boot_completed被设置为1时执行
- on property:sys.boot_completed=1
- <command1>
- ...
init.rc中常见的Commands有以下一些:
<path> [ <argument> ]
*<name> <value>
<name>
为<value>
。(这将会被所有在这命令之后运行的进程所继承)<interface>
<interface>
<filename>
<name>
<directory>
<octal-mode> <path>
<owner> <group> <path>
<directory>
<serviceclass>
<serviceclass>
<name>
<servicename>
- on property:boot_completed=1
- enable my_service_name
<path>
<path>
的模块(PS:驱动)。<path>
[mode] [owner] [group]<path>
创建一个目录,(可选)使用给定的模式,所有者个组。如果没有提供,该目录将用755权限,所有者为root用户,组为root。<type> <device> <dir>[ <mountoption> ]*
<device>
到<dir>
,<device>
可能有mtd@name形式,以指定名为name的mtd块设备。 <mountoption>
包括 "ro", "rw", "remount", "noatime", ...<path> [ <path> ]*
<path>
的文件在file_contexts中配置的的安全级别。自动被init标记正确,不需要用init.rc创建的目录。<path> [ <path> ]*
<path>
指出的目录树中file_contexts配置指定的安全级别。 path不要用shell可写或app可写的目录,如/data/locla/temp
,/data/data
,或者有类似前缀的(目录)。 <securitycontext>
<name> <value>
<name>
为<value>
.<resource> <cur> <max>
<name> <value>
<name>
为<value>
。 <value>
may be 1|true|on or 0|false|off<service>
<service>
<target> <path>
<path>
with the value <target>
。<mins_west_of_gmt>
<event>
<path> [ <timeout> ]
<path>
,出现后返回,或timeout到达。如果timeout没有指定,默认为5秒。<path> <string>
<path>
的文件,写入(不是追加)字符串<string>
。赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。