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

相关推荐
OkeyProxy5 小时前
設置Android設備全局代理
android·代理模式·proxy模式·代理服务器·海外ip代理
刘志辉6 小时前
vue传参方法
android·vue.js·flutter
前期后期9 小时前
Android OkHttp源码分析(一):为什么OkHttp的请求速度很快?为什么可以高扩展?为什么可以高并发
android·okhttp
轻口味11 小时前
Android应用性能优化
android
全职计算机毕业设计11 小时前
基于 UniApp 平台的学生闲置物品售卖小程序设计与实现
android·uni-app
dgiij12 小时前
AutoX.js向后端传输二进制数据
android·javascript·websocket·node.js·自动化
SevenUUp13 小时前
Android Manifest权限清单
android
高林雨露13 小时前
Android 检测图片抓拍, 聚焦图片后自动完成拍照,未对准图片的提示请将摄像头对准要拍照的图片
android·拍照抓拍
wilanzai13 小时前
Android View 的绘制流程
android
INSBUG14 小时前
CVE-2024-21096:MySQLDump提权漏洞分析
android·adb