玩转Android Framework:Android Init Language

本文将介绍Android Init Language 相关的一些知识。

什么是Android Init Language

Android Init Language 是Android用来进行服务初始化的一种脚本语言,这些脚本的后缀名均为.rc,这种脚本主要的作用是用来顺序启动Android的一系列服务

这是Android Init Language的官方文档:

android.googlesource.com/platform/sy...

语法结构

Android Init Language 语法结构十分简单,大致如下:

xml 复制代码
import <path>

service <name> <pathname> [ <argument> ]*
   <option>
   <option>
   ...

on <trigger> [&& <trigger>]*
   <command>
   <command>
   <command>

一个rc文件,由5个部分组成,Actions,Commands,,Services,Options,和 Imports。

阅读RC文件

接下来我们将讲解如何阅读一个rc文件,首先在/system/core/rootdir下面,可以看到多个rc文件:

打开init.zygote64.rc,我们可以看到以下的文件内容:

perl 复制代码
service zygote /system/bin/app_process64 -Xzygote /system/bin --zygote --start-system-server --socket-name=zygote
    class main
    priority -20
    user root
    group root readproc reserved_disk
    socket zygote stream 660 root system
    socket usap_pool_primary stream 660 root system
    onrestart exec_background - system system -- /system/bin/vdc volume abort_fuse
    onrestart write /sys/power/state on
    # NOTE: If the wakelock name here is changed, then also
    # update it in SystemSuspend.cpp
    onrestart write /sys/power/wake_lock zygote_kwl
    onrestart restart audioserver
    onrestart restart cameraserver
    onrestart restart media
    onrestart restart media.tuner
    onrestart restart netd
    onrestart restart wificond
    task_profiles ProcessCapacityHigh MaxPerformance
    critical window=${zygote.critical_window.minute:-off} target=zygote-fatal

这个时候我们可以打开Android Init Language 的Readme文件,来一项项查找这个文件的每条指令代表什么。

service zygote /system/bin/app_process64 -Xzygote /system/bin --zygote --start-system-server --socket-name=zygote

从文档中我们可以看出,这代表着注册一个名字为zygote的service,并且指定此服务的执行文件路径,以及执行此文件时所带的参数:

class main

这是服务的类名,相当于这个服务的分组,默认为default,这些分组的服务可以整组的启动或停止:

priority -20

服务的优先级,取值范围为-20到19,默认为0:

user root

执行此服务的之前切换的用户,默认为root:

group root readproc reserved_disk

执行此服务前更改组,从第二个参数开始,都是此进程的补充组:

socket zygote stream 660 root system

创建一个domain socket,第一个参数是此socket的名字,第二个是类型dgram, stream 或者seqpacket其中一个,660为权限设置,后面的为用户以及组:

onrestart exec_background - system system -- /system/bin/vdc volume abort_fuse

服务重启时要执行的命令:

task_profiles ProcessCapacityHigh MaxPerformance

设置任务配置文件:

critical window=${zygote.critical_window.minute:-off} target=zygote-fatal

指定此服务为关键服务:

至此,我们就对照文档了解了整个zygote rc文件的指令,后续如果遇到其它的rc文件,也可以照此办法进行解读。

Android Init Language 源码

Andorid解析rc文件的源码,主要在/system/core/init下面:

比如如果你想了解Android是如何通过解析rc文件创建并启动service的,可以查阅service.cppservice_list.cppservice_parser.cppservice_utils.cpp,这些相关文件。

相关推荐
幻雨様5 分钟前
UE5多人MOBA+GAS 45、制作冲刺技能
android·ue5
Jerry说前后端2 小时前
Android 数据可视化开发:从技术选型到性能优化
android·信息可视化·性能优化
Meteors.3 小时前
Android约束布局(ConstraintLayout)常用属性
android
alexhilton3 小时前
玩转Shader之学会如何变形画布
android·kotlin·android jetpack
whysqwhw7 小时前
安卓图片性能优化技巧
android
风往哪边走7 小时前
自定义底部筛选弹框
android
Yyyy4828 小时前
MyCAT基础概念
android
Android轮子哥9 小时前
尝试解决 Android 适配最后一公里
android
雨白10 小时前
OkHttp 源码解析:enqueue 非同步流程与 Dispatcher 调度
android
风往哪边走10 小时前
自定义仿日历组件弹框
android