安卓 rc 文件

init.rc文件由系统第一个启动的init程序解析。是启动系统服务使用的文件。
解析.rc的过程就是识别一个个section的过程,将各个section的信息保存下来,然后在init.c的main()中去执行一个个命令。android采用双向链表来存储section的信息,解析完成之后,会得到三个双向链表action_list、service_list、import_list来分别存储三种section的信息上。
  1. Action
  2. Commands
  3. Services
  4. Options.
service hxrlog /system/bin/logcat -b all -v threadtime -f /data/misc/hxrlog/log.txt -r 20,480‬ -n 200
//service类型的section表示一个可执行程序,  hxrlog 名字标识了这个service, /system/bin/logcat 表示可执行文件的位置
     class main                             //给服务指定一个类属,这样方便操作多个服务同时启动或停止
     user system                              //在执行此服务之前先切换用户名
     group system log                
     disabled                                 //服务不会自动运行
     oneshot                                 //当此服务退出时不会自动重启
当有事件触发一个Action后,这个action的command自上而下依次执行。
Action的tigger有如下几种:
2
3
4
5
6
7
8
9
10
11
12
on boot                     #系统启动触发
on early-init               #在初始化之前触发
on init                     #在初始化时触发(在启动配置文件/init.conf被装载之后)
on late-init                #在初始化晚期阶段触发
on charger                  #当充电时触发
on property:<key>=<value>   #当属性值满足条件时触发
on post-fs                  #挂载文件系统
on post-fs-data             #挂载data
on device-added-<path>      #在指定设备被添加时触发
on device-removed-<path>    #在指定设备被移除时触发
on service-exited-<name>    #在指定service退出时触发
on <name>=<value>           #当属性<name>等于<value>时触发
触发后命令(commands)
chdir <dirc>                                                  更改工作目录为<dirc>
chmod <octal-mode> <path>                     更改文件访问权限
chown <owner> <group> <path>                  更改文件所有者和组群
chroot <direc>                                                更改根目录位置
class_start <serviceclass>                                如果它们不在运行状态的话,启动由<serviceclass>类名指定的所有相关服务
class_stop <serviceclass>                             如果它们在运行状态的话,停止
domainname <name>                                 设置域名
exec <path> [ <argument> ]*                   fork并执行一个程序,其路径为<path>,这条命令将阻塞直到该程序启动完成,因此它有可能造成init程序在某个节点不停地等待
export <name> <value>                             设置某个环境变量<name>的值为<value>,这是对全局有效的,即其后所有进程都将继承这个变量
hostname <name>                                   设置主机名
ifup <interface>                                          使网络接口<interface>成功连接
import <filename>                                     引入一个名为<filename>的文件
insmod <path>                                             在<path>路径上安装一个模块
mkdir <path> [mode] [owner] [group]           在<path>路径上新建一个目录
mount <type> <device> <dir> [<mountoption>]*      尝试在指定路径上挂载一个设备
setprop <name> <value>                                            设置系统属性<name>的值为<value>
setrlinit <resource> <cur> <max>                      设置一种资源的使用限制。这个概念亦存在于Linux系统中,<cur>表示软限制,<max>表示硬限制
start <service>                                           启动一个服务
stop <service>                                            停止一个服务
symlink <target> <path>                           创建一个<path>路径的软链接,目标为<target>
sysclk <mins_west_of_gmt>                         设置基准时间,如果当前时间时GMT,这个值是0
trigger <event>                                   触发一个事件
write <path> <string> [<string>]*                 打开一个文件,并写入字符串
import 类型的section表示引入另外一个.rc文件
java 通过 SystemProperties.set("ctl.start", "logd-reinit");
C++ 通过 property_set(“ctl.start”, service_xx) 来启动 init.rc 中的service  
属性“ ctrl.start ”和“ ctrl.stop ”是用来启动和停止服务。每一项服务必须在/init.rc中定义。

init.target.rc
device/qcom/kona/init.target.rc
机器文件目录:/init.rc
在Android源代码中,`init.target.rc`是一个重要的文件,它是Android系统的引导过程中的关键脚本之一。该文件定义了系统启动时要执行的一系列操作和服务。
`init.target.rc`位于Android系统的`/init`目录下。当Android设备启动时,内核会首先运行init进程,init进程会读取`init.rc`文件,并根据其中的指令加载和启动各种系统服务。`init.target.rc`则是`init.rc`文件中的一个重要组成部分,它包含了针对特定启动目标的配置和命令。
`init.target.rc`文件中的指令可以包括以下内容: 
- 启动和停止系统服务(如SurfaceFlinger、Zygote等)
- 指定系统属性(如设置系统语言、时区等)
- 挂载文件系统(如挂载系统分区、数据分区等)
- 运行各种初始化脚本和命令。 
通过编辑和修改`init.target.rc`文件,开发人员可以自定义系统启动时的行为。这对于进行系统级别的修改和定制非常有用,例如添加自定义服务、修改系统属性、修改文件系统挂载点(添加文件夹)等。 
需要注意的是,修改`init.target.rc`文件需要具备系统级别的权限,因此在进行修改之前,请确保你拥有足够的权限并了解相关的系统知识,以避免对设备造成不可逆的损坏
e.g. 修改权限配置
chown system system /sys/devices/platform/soc/soc:aw8646_step/aw8646_step/ipd_scale
chmod 0664 /sys/devices/platform/soc/894000.spi/spi_master/spi0/spi0.0/ctpower

qvrd.rc
在代码中的位置     vendor/qcom/proprietary/prebuild_HY11/target/product/qssi/system/etc/init/qvrd.rc
在设备中的位置      system/etc/init/qvrd.rc

logcatd.rc
这段代码是一个 `logcatd` 服务的初始化脚本,用于持久记录日志。这些配置用于管理 Android 系统中的日志记录服务,包括启动、停止、清空日志等操作
涉及到的属性
logd.logpersistd                 (stop; clear; logcatd; "")
logd.logpersistd.enable     (true; false)
persist.logd.logpersistd     (logcatd; "")
涉及到的属性行为关系 
persist.logd.logpersistd=logcatd  --> logd.logpersistd=logcatd
load_persist_props_action --> logd.logpersistd.enable=true
logd.logpersistd.enable=true &&  logd.logpersistd=logcatd --> start logcatd
logd.logpersistd.enable=true && logd.logpersistd=clear  --> persist.logd.logpersistd="" && stop logcatd && logd.logpersistd=""  && logcat -c -f /data/misc/logd/logcat
logd.logpersistd=stop --> persist.logd.logpersistd="" && stop logcatd && logd.logpersistd=""
logd.logpersistd.enable=false --> stop logcatd
当属性 `persist.logd.logpersistd` 的值为 "logcatd" 时,
设置属性 `logd.logpersistd` 的值为 "logcatd"。
on property:persist.logd.logpersistd=logcatd 
    setprop logd.logpersistd logcatd
当加载持久属性操作时,
设置属性 `logd.logpersistd.enable` 为 "true"
# enable, prep and start logcatd service
on load_persist_props_action
    setprop logd.logpersistd.enable true
当属性 `logd.logpersistd.enable` 为 "true" 并且属性 `logd.logpersistd` 为 "logcatd" 时, 
创建目录 `/data/misc/logd`,权限为 `0700`,所有者为 `logd` 用户,所属组为 `log` 组。 
启动 logcatd 服务
on property:logd.logpersistd.enable=true && property:logd.logpersistd=logcatd
    # all exec/services are called with umask(077), so no gain beyond 0700
    mkdir /data/misc/logd 0700 logd log
    start logcatd
# stop logcatd service and clear data
on property:logd.logpersistd.enable=true && property:logd.logpersistd=clear                                // 当属性 `logd.logpersistd.enable` 为 "true" 并且属性 `logd.logpersistd` 为 "clear" 时,
    setprop persist.logd.logpersistd ""                                                                    // 清空属性 `persist.logd.logpersistd` 的值。
    stop logcatd                                                                                           // 停止 logcatd 服务。
    # logd for clear of only our files in /data/misc/logd                                                  
    exec - logd log -- /system/bin/logcat -c -f /data/misc/logd/logcat -n ${logd.logpersistd.size:-256}    // 使用指定参数执行 logcat 命令,清空 `/data/misc/logd/logcat` 中的内容。
    setprop logd.logpersistd ""                                                                            // 清空属性 `logd.logpersistd` 的值。
当属性 `logd.logpersistd` 的值为 "stop" 时,  清空属性 `persist.logd.logpersistd` 的值。 
停止 logcatd 服务。
清空属性 `logd.logpersistd` 的值。
# stop logcatd service
on property:logd.logpersistd=stop
    setprop persist.logd.logpersistd ""
    stop logcatd
    setprop logd.logpersistd ""
当属性 `logd.logpersistd.enable` 的值为 "false" 时 停止 logcatd 服务。
on property:logd.logpersistd.enable=false
    stop logcatd
服务具体实现
# logcatd service
service logcatd /system/bin/logcatd -L -b ${logd.logpersistd.buffer:-all} -v threadtime -v usec -v printable -D -f /data/misc/logd/logcat -r 1024 -n ${logd.logpersistd.size:-256} --id=${ro.build.id}    //  定义名为 "logcatd" 的服务,指定了 logcatd 的启动参数
    class late_start                                                                // 服务类别为 "late_start"
    disabled                                                                        // 初始状态为禁用。
    # logd for write to /data/misc/logd, log group for read from log daemon         
    user logd                                                                       // 服务运行时使用 `logd` 用户
    group log                                                                       // 服务运行时属于 `log` 组
    writepid /dev/cpuset/system-background/tasks                                    // 将进程ID写入 cpuset 分组,属于 system-background
    oom_score_adjust -600                                                           // 置 OOM 分数调整值
logtagd.rc
#
# logtagd event log tag service (debug only)
#
on post-fs-data
    mkdir /data/misc/logd 0700 logd log                // 创建目录 `/data/misc/logd`,设置权限为 `0700`,所有者是 `logd` 用户,所属组是 `log` 组。
    write /data/misc/logd/event-log-tags ""            // 在 `/data/misc/logd/event-log-tags` 文件中写入空字符串。可能是为了清空或初始化该文件
    chown logd log /data/misc/logd/event-log-tags      // 修改文件 `/data/misc/logd/event-log-tags` 的所有者为 `logd` 用户,所属组为 `log` 组。
    chmod 0600 /data/misc/logd/event-log-tags          // 修改文件 `/data/misc/logd/event-log-tags` 的权限为 `0600`,即只有所有者具有读写权限,其他用户没有权限。
    restorecon /data/misc/logd/event-log-tags          // 恢复文件 `/data/misc/logd/event-log-tags` 的安全上下文,以确保它与系统策略一致。
保持文件和目录的安全上下文与系统策略一致是为了确保系统的安全性和稳定性。在类Unix操作系统中,包括Android,每个文件和目录都有一个称为"安全上下文"的标识符,用于确定文件的访问权限和访问级别。 
系统会根据文件的安全上下文来控制进程和用户对文件的访问权限。如果文件的安全上下文与系统策略不一致,可能会导致以下问题: 
1. **安全性问题:** 文件被赋予了不恰当的权限,可能导致未经授权的用户或进程访问敏感信息或进行恶意操作。
2. **系统稳定性问题:** 系统策略通常会在文件系统中设置合适的安全上下文,以确保操作系统和应用程序的正常运行。如果文件的安全上下文与策略不匹配,可能导致应用程序崩溃、权限问题和其他异常行为。 
3. **访问问题:** 错误的安全上下文可能会阻止合法用户或进程访问文件,从而导致功能无法正常运作。 
通过使用 `restorecon` 命令, 将文件的安全上下文恢复到与系统策略一致的状态,从而避免潜在的安全和稳定性问题。这有助于确保系统的一致性、可预测性和正常运行。
/data/misc/logd 目录安全上下文
drwx------  2 logd   log  u:object_r:misc_logd_file:s0      3488 2023-08-17 13:25 .
drwxrwx--t 49 system misc u:object_r:system_data_file:s0    3488 1970-01-01 08:03 ..
-rw-------  1 logd   log  u:object_r:misc_logd_file:s0         0 1970-01-01 08:23 event-log-tags
-rw-------  1 logd   log  u:object_r:misc_logd_file:s0    831247 2023-08-17 13:41 logcat
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值