玩转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.cpp,service_list.cpp,service_parser.cpp,service_utils.cpp,这些相关文件。

相关推荐
独隅5 小时前
Claude API 实战教程:从入门到完整项目
android·java·数据库·claude·claude code
且随疾风前行.9 小时前
Paint Cavans高级绘制:[一]Paint画笔高级应用
android·ui
郑州光合科技余经理11 小时前
同城小程序开发:同一笔单在用户端和商家端各显示到哪
android·java·开发语言·前端·后端·uni-app·php
pigdreams12 小时前
Google 官方 Android CLI:让AI直接读布局结构而不是用adb截图验证
android·人工智能·adb
hunterandroid15 小时前
[Android 从零到一] Glide 图片加载原理:三级缓存、生命周期绑定与内存优化
android
法的空间15 小时前
AI 编程时代,为什么 Dart 分析会拖慢大型项目的开发
android·flutter·ios
鱼儿也有烦恼15 小时前
客户端应用架构模式
android·架构
独隅16 小时前
Claude 高效应用实战指南
android·java·开发语言·claude·claude code
硅基手札16 小时前
Android 系统全景专栏 00 · 总目录
android·操作系统·嵌入式开发
YB137516 小时前
Jetpack Compose 动画Crossfade
android