Android rc 文件的使用

应用中添加使用rc

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

语法格式

service <name> <pathname> [ <argument> ]*
     <option>
     <option>
     ...
  • <name> ——表示service 的名字;
  • <pathname> ——表示service所在路径,此处的service是可执行文件,所以一定有存储路径;
  • <argument> ——启动service所带的参数;
  • <option> ——对此service的约束选项,后面将详细讲解;

选项 Option

Option用来定义Service的行为,决定了Service将在何时启动,如何运行等。常用的Option有包括以下一些。

  • critical
    这是十分关键的服务。如果在四分钟内退出超过四次,手机将会重启并进入recovery模式。
  • disabled
    这种类型的服务不会自动启动。它必须明确的使用名字启动。
  • setenv <name> <value>
    设置环境变量<name>=<value>在加载的进程中。
  • socket <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的可执行文件的安全级别计算。

  • user <username>
    在执行该service前改变用户名,默认为root。如果你的进程请求Linux的特殊能力,就不要用这个命令。需以进入进程仍是root->请求特权->切换到你期望的uid来替换此法。
  • group <groupname> [ <groupname> ]*
    在执行该service前改变组名。第一个以后的附加组名用于设定进程的附加组(通过setgroups())。当前默认是root。
  • seclabel <securitycontext>
    在执行服务之前改变安全级别。主要用于从rootfs执行服务,比如ueventd, adbd. 在system分区上可以用基于文件安全级别的策略定义的transition,如果没有指定且没有定义策略的transition,默认是init上下文。
  • oneshot
    退出不重启服务(名副其实,一次性)。
  • class <name>
    为一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
  1. Action和Service隐式定义了一个新的section(段),所有Command或Option属于最近定义的section。在第一个section之前的Command或Option将被忽略。
  2. Action 和Services 都有唯一的名字,如果出现动作或者服务重名,则会被当做错误处理。
  3. 所有语句都是面向行的,以空格分割每行包含的若干token。C风格的反斜杠可以用于token中插入空格,双引号同样可以避免空格将文本分为多个token。反斜杠是一行的最后一个字符时,将用于续行。
  4. 以#开头的行(前面有空格也是允许的)是注释。

动作 Action

语法格式

on <trigger>   ##触发条件
     <command1>  ##执行命令
     <command2>  ##可以同时执行多个命令
     <command3>

Action是有名字的一系列的命令。Action有一个trigger(触发器),用于决定该Action应在何时执行。当一个事件发生并匹配了一个Action的trigger,相应的Action将被添加到即将执行(to-be-executed)队列的尾部(除非该Action存在与队列上了)。

每个action在队列中顺序排列,每个action中的command将会顺序执行。init在执行command的过程中同时会执行其他活动(设备节点的创建/销毁,属性设置,进程重启)。

init.rc中常见的trigger如下:

triggerDescription
bootinit程序启动后触发的第一个事件
<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>
  ...

命令 Command

init.rc中常见的Commands有以下一些:

  • exec <path> [ <argument> ]*
    创建和执行程序(<path>). 这将会阻塞init,直到程序执行完成。由于它不是内置命令,应尽量避免使用exec,它可能会引起init卡死。
  • export <name> <value>
    在全局环境变量中设在环境变量 <name><value>。(这将会被所有在这命令之后运行的进程所继承)
  • ifup <interface>
    启动网络接口<interface>
  • import <filename>
    解析一个init配置文件,扩展当前配置。
  • hostname <name>
    设置主机名。
  • chdir<directory>
    改变工作目录。
  • chmod <octal-mode> <path>
    更改文件访问权限。
  • chown <owner> <group> <path>
    更改文件的所有者和组。
  • chroot <directory>
    改变进程的根目录。
  • class_start <serviceclass>
    启动该类service所有尚未运行的服务。
  • class_stop <serviceclass>
    停止所有该类正在运行的service。
  • domainname <name>
    设置域名。
  • enable <servicename>
    改变一个disable的service为enabled。一般用于service在init.rc中被标记为disabled,这样的service是不会被启动的,当满足一定的触发条件时,可以同enable命令来将他变为enabled。示例:
  on property:boot_completed=1
  enable my_service_name
  • insmod <path>
    安装位于<path>的模块(PS:驱动)。
  • mkdir <path> [mode] [owner] [group]
    <path>创建一个目录,(可选)使用给定的模式,所有者个组。如果没有提供,该目录将用755权限,所有者为root用户,组为root。
  • mount <type> <device> <dir>[ <mountoption> ]*
    尝试挂载<device><dir><device>可能有mtd@name形式,以指定名为name的mtd块设备。 <mountoption>包括 "ro", "rw", "remount", "noatime", ...
  • restorecon <path> [ <path> ]*
    恢复名为<path>的文件在file_contexts中配置的的安全级别。自动被init标记正确,不需要用init.rc创建的目录。
  • restorecon_recursive <path> [ <path> ]*
    递归的恢复<path>指出的目录树中file_contexts配置指定的安全级别。 path不要用shell可写或app可写的目录,如/data/locla/temp/data/data,或者有类似前缀的(目录)。
  • setcon <securitycontext>
    设置当前进程的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 <name> <value>
    设置系统属性<name><value>.
  • setrlimit <resource> <cur> <max>
    为特定资源设置rlimit
  • setsebool <name> <value>
    设置SELinux的bool类型<name><value>。 <value> may be 1|true|on or 0|false|off
  • start <service>
    启动一个服务(如果服务尚未启动)。
  • stop <service>
    停止服务(如果正在运行)。
  • symlink <target> <path>
    创建一个符号连接,at <path> with the value <target>
  • sysclktz <mins_west_of_gmt>
    Set the system clock base (0 if system clock ticks in GMT)
  • trigger <event>
    触发一个事件。一个动作将另一动作排队。
  • wait <path> [ <timeout> ]
    poll特定的<path>,出现后返回,或timeout到达。如果timeout没有指定,默认为5秒。
  • write <path> <string>
    打开一个位于<path>的文件,写入(不是追加)字符串<string>
  • 8
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
android文件架构详解 cache : 是缓存临时文件夹,据说是除了T-mobile的OTA更新外,别无用处。 红色标记的两个文件是debug模式下产生的 data : 存放用户安装的软件以及各种数据。 default.prop : 默认配置文件 dev : 设备节点文件的存放地 etc : 指向 /system/etc ,配置文件存放目录 init : 系统启动到文件系统的时候第一个运行的程序。 init.goldfish.rc : 初始化文件 init.rc : 初始化文件 proc : /proc文件系统下的多种文件提供的系统信息不是针对某个特定进程的,而是能够在整个系统范围的上下文中使用。 root : 为空 。 sbin: 只放了一个用於调试的adbd程序 sdcard: 是SD卡中的FAT32文件系统挂载的目录 sqlite_stmt_journals: 一个根目录下的tmpfs文件系统,用於存放临时文件数据。 sys : 用於挂载 sysfs文件系统。 在设备模型中,sysfs文件系统用来表示设备的结构.将设备的层次结构形象的反应到用户空间中.用户空间可以修改sysfs中的文件属性来修改设备的属性值 system :系统中的大部分东西都在这各目录下,很重要的一个目录文件 system目录是在Android文件系统占有及其重要的位置,基本上所有的工具和应用程序都在这个目录下,我看来是一个真正的rootfs。他在Android手机中存放在nandflash的 mtd3中,是一个yaffs2文件系统,在启动时被挂载在root的/system目录下,其中包含有: # ls -a -l /system drwxr-xr-x root 208 1970-01-01 08:00 xbin drwxr-xr-x root root 1970-01-01 08:00 modules drwxr-xr-x root root 2010-06-23 09:39 framework drwxr-xr-x root root 2010-06-23 09:39 fonts drwxr-xr-x root root 2010-06-23 09:39 etc -rw-r--r-- root root 2197 2010-06-23 09:39 build.prop drwxr-xr-x root root 2010-06-23 09:39 media drwxr-xr-x root shell 2010-06-23 09:39 bin drwxr-xr-x root root 2010-06-23 09:39 usr drwxr-xr-x root root 2010-06-23 09:39 app drwxr-xr-x root root 2010-06-23 09:39 lost+found drwxr-xr-x root root 2010-06-23 09:39 lib drwxr-xr-x root root 2010-06-23 09:39 sd -rw-r--r-- root root 1452010-06-23 09:39 init.rc # xbin :下放了很多系统管理工具,这些工具不是到toolbox的链接,每个都是可执行程序。如果你看到这些命令你会发现他们根本不常用,他们都是为系统管理员准备的,是一些系统管理和配置工具。这个文件夹的作用相当於标准Linux文件系统中的 /sbin。 modules:使用来存放内核模块(主要是fs和net)和模块配置文件的地方。 framework: 是JAVA平台的一些核心文件,属於JAVA平台系统框架文件。里面的文件都是.jar和.odex文件。 备注:什么是odex文件? odex是被优化过的JAVA程序文件,体积通常是.jar的4倍左右。执行效率比.jar高。 fonts :字体库文件的存放目录。 etc :这里存放了系统中几乎所有的配置文件,根目录下的/etc就链结於此。 build.prop :是一个属性文件,在Android系统中.prop文件很重要,记录了系统的设置和改变,类似於/etc中的文件。 media :里面主要是存放了系统的铃声的,分为 notifications(通知)、ui(界面)、alarms(警告)和ringtones(铃声),里面都是.ogg音频文件。 bin :是存放用户常用的工具程序的,其中大部分是到toolbox的链接(类似嵌入式Linux中的busybox)。toolbox应该是 google简化版的busybox。 usr :用户的配置文件,如键盘布局、共享、时区文件等等。您可以cat 来看看。 app :存放的是Android系统自带的JAVA应用程序。 lost+found :yaffs文件系统固有的,类似回收站的文件夹,只有是yaffs文件系统都会有。 lib :存放几乎所有的共享库(.so)文件。 sd :SD卡中的EXT2分区的挂载目录 init.rc :一个初始化脚本,用於将/system/modules和/system/xbin挂载为cramfs,避免系统被无意破坏
Android中,可以使用自定义的资源文件(Resource file)来定义应用程序的配置、布局、样式等。其中,rc文件(也称为文件)是其中一种类型的资源文件。 要创建和使用自定义的rc文件,可以按照以下步骤进行操作: 1. 在项目的`res`目录下创建一个新的目录,例如`res/raw`(如果目录已存在,则无需创建)。 2. 在该目录下创建一个新的rc文件,例如`custom.rc`。可以使用任意文本编辑器来创建和编辑该文件。 3. 在rc文件中,可以定义一些键值对,用于表示不同的资源。例如: ``` # custom.rc background_color = #FF0000 text_size = 14sp ``` 以上示例中,定义了两个资源:`background_color`和`text_size`。可以根据需要添加更多的资源。 4. 在代码中使用自定义的rc资源。可以通过调用`getResources().getIdentifier()`方法获取资源的ID,并使用`getResources().getString()`等方法获取资源的值。示例代码如下: ```java // 获取background_color资源的ID int backgroundColorId = getResources().getIdentifier("background_color", "color", getPackageName()); // 获取background_color资源的值 int backgroundColor = getResources().getColor(backgroundColorId); // 获取text_size资源的ID int textSizeId = getResources().getIdentifier("text_size", "dimen", getPackageName()); // 获取text_size资源的值 float textSize = getResources().getDimension(textSizeId); ``` 以上示例代码中,通过`getIdentifier()`方法获取资源的ID,然后使用对应的`getXXX()`方法获取资源的值。需要注意的是,`getIdentifier()`方法的第二个参数是资源的类型(如`color`、`dimen`等),第三个参数是应用程序的包名。 这样,就可以在Android应用程序中使用自定义的rc文件来定义和使用资源了。希望以上信息对你有所帮助!如果有任何疑问,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yinhunzw

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值