应用中添加使用rc
0. 在Android.mk 同目录下新建文件haha.sh (文件名任意),执行shell 操作, 以下简单举例
#!/bin/sh
rm -rf /system/etc/xxx
- 在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
语法格式
service [ ]*
…
——表示service 的名字;
——表示service所在路径,此处的service是可执行文件,所以一定有存储路径;
——启动service所带的参数;
critical
这是十分关键的服务。如果在四分钟内退出超过四次,手机将会重启并进入recovery模式。
disabled
这种类型的服务不会自动启动。它必须明确的使用名字启动。
setenv
设置环境变量=在加载的进程中。
socket [ [ [ ] ] ]
创建一个名为/dev/socket/的UNIX域socket并将fd传递到加载的进程中。
必须是"dgram", “stream”, "seqpacket"中的一种。
和默认为0.
是 SELinux socket 安全上下文,默认为service安全级别,可以指定为seclabel或根据service的可执行文件的安全级别计算。
user
在执行该service前改变用户名,默认为root。如果你的进程请求Linux的特殊能力,就不要用这个命令。需以进入进程仍是root->请求特权->切换到你期望的uid来替换此法。
group [ ]*
在执行该service前改变组名。第一个以后的附加组名用于设定进程的附加组(通过setgroups())。当前默认是root。
seclabel
在执行服务之前改变安全级别。主要用于从rootfs执行服务,比如ueventd, adbd. 在system分区上可以用基于文件安全级别的策略定义的transition,如果没有指定且没有定义策略的transition,默认是init上下文。
oneshot
退出不重启服务(名副其实,一次性)。
class
为一service指定一个类名,所有有相同类名的service可以一同启动或停止。如果没有用class选项指定类名,该service属于"default"。
onrestart
在service重启的时候执行。
简介
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
命令 Command
服务 Service
选项 Option
Action和Service隐式定义了一个新的section(段),所有Command或Option属于最近定义的section。在第一个section之前的Command或Option将被忽略。
Action 和Services 都有唯一的名字,如果出现动作或者服务重名,则会被当做错误处理。
所有语句都是面向行的,以空格分割每行包含的若干token。C风格的反斜杠可以用于token中插入空格,双引号同样可以避免空格将文本分为多个token。反斜杠是一行的最后一个字符时,将用于续行。
以#开头的行(前面有空格也是允许的)是注释。
动作 Action
语法格式
on ##触发条件
##执行命令
##可以同时执行多个命令
Action是有名字的一系列的命令。Action有一个trigger(触发器),用于决定该Action应在何时执行。当一个事件发生并匹配了一个Action的trigger,相应的Action将被添加到即将执行(to-be-executed)队列的尾部(除非该Action存在与队列上了)。
每个action在队列中顺序排列,每个action中的command将会顺序执行。init在执行command的过程中同时会执行其他活动(设备节点的创建/销毁,属性设置,进程重启)。
init.rc中常见的trigger如下:
trigger Description
boot init程序启动后触发的第一个事件
= 当属性满足时触发
device-added/removed- 当设备节点添加/删除时触发此事件
sevice-exited- 当指定服务 存在时触发
下面列举两种常见的Action定义代码:
#当init被触发时执行
on init
…
#当属性sys.boot_completed被设置为1时执行
on property:sys.boot_completed=1
…
命令 Command
init.rc中常见的Commands有以下一些:
exec
创建和执行程序(
export
在全局环境变量中设在环境变量 为。(这将会被所有在这命令之后运行的进程所继承)
ifup
启动网络接口
import
解析一个init配置文件,扩展当前配置。
hostname
设置主机名。
chdir
改变工作目录。
chmod
更改文件访问权限。
chown
更改文件的所有者和组。
chroot
改变进程的根目录。
class_start
启动该类service所有尚未运行的服务。
class_stop
停止所有该类正在运行的service。
domainname
设置域名。
enable
改变一个disable的service为enabled。一般用于service在init.rc中被标记为disabled,这样的service是不会被启动的,当满足一定的触发条件时,可以同enable命令来将他变为enabled。示例:
on property:boot_completed=1
enable my_service_name
insmod
安装位于
mkdir
在
mount
尝试挂载到
restorecon
恢复名为
restorecon_recursive
递归的恢复
setcon
设置当前进程的security context为特定的字符串。这是典型的仅用于所有进程启动之前的early-init设置init context
setenforce 0|1
设置SELinux系统范围的enfoucing状态。0 is permissive (i.e. log but do not deny), 1 is enforcing.
setprop
设置系统属性为.
setrlimit
为特定资源设置rlimit
setsebool
设置SELinux的bool类型为。 may be 1|true|on or 0|false|off
start
启动一个服务(如果服务尚未启动)。
stop
停止服务(如果正在运行)。
symlink
创建一个符号连接,at
sysclktz <mins_west_of_gmt>
Set the system clock base (0 if system clock ticks in GMT)
trigger
触发一个事件。一个动作将另一动作排队。
wait
poll特定的
write
打开一个位于
————————————————
版权声明:本文为CSDN博主「yinhunzw」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yinhunzw/article/details/111661135