Android Framework之RC文件入门浅析

193 阅读4分钟

Android AOSP中的RC文件,通常也被称为init脚本,其主要用于系统启动和服务管理过程相关。这些文件定义了设备启动过程时需要做的一些操作,比如定义权限、创建目录、启动服务以及结合启动过程完成一些自定义功能。

一、所在位置

rc文件通常位于源码的System 和device模块中,常见的有:

system/core/rootdir/init.rc

system/core/rootdir/init.usb.configfs.rc

system/core/rootdir/init.usb.rc

system/core/rootdir/init.zygote64.rc

device/mediatek/mt6768/init.mt6768.rc

......

二、作用:

  • 系统初始化:定义设备启动过程中需要执行的一些动作,例如启动内核、挂载文件系统、执行自定义操作;
  • 服务管理:启动和控制各种系统服务以及自定义服务,比如日志服务、网络服务等等;
  • 设备管理:配置设备硬件和软件参数,例如网卡、存储等;

三、加载流程

AOSP 的rc 文件主要是由 init 进程在系统启动的早期阶段加载并解析的。整个加载流程是一个从 ramdisk 启动 first_stage_init,然后执行主 init 进程,并由主 init 进程解析 /init.rc 以及其导入的所有 rc 文件,最终根据定义的动作和事件来启动服务和设置系统属性的过程。

四、RC文件结构:

rc文件主要包括以下几个部分:

  • service:定义一个服务,包括服务名称、执行命令、用户权限等等;
  • on boot:定义设备启动时执行的命令;
  • on early-boot:定义设备在内核引导完成,进入系统启动前执行的命令;
  • on late-boot:定义设备在引导程序完成,进入系统启动后执行的命令;
  • on property:当某个系统属性发生改变时执行的命令;

1、service定义

service <name> <pathname> [<argument>]*
    <option>
    <option>
    ...
  • name: 服务名称
  • pathname: 服务所在路径,一般为服务可执行文件所在路径
  • argument:启动服务所携带的参数
  • option:定义服务启动相关的一些约束选项,比如disabled禁用服务、start xx启动一个其他的服务或者脚本、setenv设置环境变量信息、user和group指定服务运行用户角色等等。

2、on boot/early-boot/late-boot

这几个阶段是系统启动过程各阶段,系统存在一些默认定义和配置,一般情况下不用做改动,但是如果有特殊需求,可以在对应阶段中添加目标操作,实现自定义扩展。

on boot
    # basic network init
    ifup lo
    hostname localhost
    domainname localdomain

    # IPsec SA default expiration length
    write /proc/sys/net/core/xfrm_acq_expires 3600

    # Memory management.  Basic kernel parameters, and allow the high
    # level system server to be able to adjust the kernel OOM driver
    # parameters to match how it is managing things.
    write /proc/sys/vm/overcommit_memory 1
    write /proc/sys/vm/min_free_order_shift 4
    chown root system /sys/module/lowmemorykiller/parameters/adj
    chmod 0664 /sys/module/lowmemorykiller/parameters/adj
    ...

    # Assume SMP uses shared cpufreq policy for all CPUs
    chown system system /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq
    chmod 0660 /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq

    chown system system /sys/class/leds/vibrator/trigger
    ...
    chown root radio /proc/cmdline

    # Define default initial receive window size in segments.
    setprop net.tcp.default_init_rwnd 60

    # Start standard binderized HAL daemons
    class_start hal

    class_start core

3、on property

这个的用法和service一样,是用得比较多的,可以监听到各种系统原生、自定义属性的变化,从而在变化时实现自定义的功能。

on property:ro.debuggable=1
    # Give writes to anyone for the trace folder on debug builds.
    # The folder is used to store method traces.
    chmod 0773 /data/misc/trace
    # Give reads to anyone for the window trace folder on debug builds.
    chmod 0775 /data/misc/wmtrace
    start console

以上示例的作用就是当ro.debuggable的值为1时,也就是系统处于可调试模式的时候,改变trace和wmtrace目录的权限,同时打开一个console服务,支持shell操作。 同样你可以根据自己的业务监听任何一个属性,然后启动一个service、执行一些命令或者自定义脚本等。

五、扩展

除开在现有的rc文件中去增加和修改属性、service等实现目标功能,你一样可以自定义rc文件去实现,自定义的rc文件也是可以在相同生命周期阶段、已声明的一些属性上追加定义。 关于如何自定义rc,这里就不再过多介绍,如果大家有兴趣或者问题,欢迎评论留言交流~

我是一念,分享个人的技术、经历、感悟浅识,欢迎大家多多关注、留言评论,私信交流~