玩转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,这些相关文件。

相关推荐
nvvas1 小时前
Android Studio JAVA开发按钮跳转功能
android·java·android studio
怪兽20141 小时前
Android多进程通信机制
android·面试
叶羽西2 小时前
Android CarService调试操作
android
千里马-horse2 小时前
在android中 spdlog库的log如何在控制台上输出
android·c++·spdlog
Zender Han2 小时前
《从零搭建现代 Android 模块化架构项目(2025 最新实践)》
android·架构
Digitally2 小时前
如何从电脑上卸载安卓应用程序
android·电脑
Mr YiRan3 小时前
多线程性能优化基础
android·java·开发语言·性能优化
liyi_hz20083 小时前
O2OA (翱途)开发平台新版本发布预告:架构升级、性能跃迁、功能全面进化
android·java·javascript·开源软件
Huangyi3 小时前
第一节:Flow的基础知识
android·前端·kotlin
hweiyu004 小时前
Android基础入门教程(视频教程)
android