当前位置: 首页 > news >正文

Framework开发之Zygote进程2(基于开源的AOSP15)--init.rc在start zygote之后的事情(详细完整版逐行代码走读)

service zygote的完整执行过程解读

PS:上篇文章中讲到init.rc导入了配置文件

import /system/etc/init/hw/init.${ro.zygote}.rc

start zygote后就会去找该配置文件里面的service zygote,这里以64位操作系统的zygote为例,init.zygote64.rc

1 service zygote /system/bin/app_process64 -Xzygote /system/bin --zygote --start-system-server --socket-name=zygote
2     class main
3     priority -20
4     user root
5     group root readproc reserved_disk
6     socket zygote stream 660 root system
7     socket usap_pool_primary stream 660 root system
8     onrestart exec_background - system system -- /system/bin/vdc volume abort_fuse
9     onrestart write /sys/power/state on
10     # NOTE: If the wakelock name here is changed, then also
11     # update it in SystemSuspend.cpp
12     onrestart write /sys/power/wake_lock zygote_kwl
13     onrestart restart audioserver
14     onrestart restart cameraserver
15     onrestart restart media
16     onrestart restart --only-if-running media.tuner
17     onrestart restart netd
18     onrestart restart wificond
19     task_profiles ProcessCapacityHigh MaxPerformance
20     critical window=${zygote.critical_window.minute:-off} target=zygote-fatal

service zygote - 定义名为"zygote"的服务,fork出zygote进程

PS:这里会走到system/core/init/service.cpp里,调用fork()接口创建zygote进程,大概流程如下

init进程执行service.cpp中的Start()↓
调用fork()创建子进程↓
子进程执行execv()替换为app_process64↓
app_process64开始执行自己的main函数↓
zygote进程独立运行,不再执行service.cpp代码

看了上篇文章的应该知道,这里大概是四部曲,trigger ->on ->start ->service ,真正的可执行文件app_process64是在service里面寻找的

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

/system/bin/app_process64    - 执行的可执行文件路径

-Xzygote    - JVM参数,指定使用zygote模式

/system/bin   - 应用程序根目录

--zygote   - 启动参数,标识为zygote进程

--start-system-server   - 启动system_server

 --socket-name=zygote -   指定socket名称

2     class main

  class main  -将zygote归类为"main"类服务,通常在系统启动时优先启动main类服务

主要 service class 的类型

Class 名称说明特点
main主要系统服务系统启动时优先启动,最重要的服务
core核心系统服务系统基本功能所需的服务
hal硬件抽象层服务硬件驱动相关服务
late_start延迟启动服务在main服务启动后启动
boot启动服务系统启动早期阶段的服务
default默认服务无特定分类的服务

启动顺序(按优先级递减)
1. boot   2. core   3. main   4. late_start   5. default

3     priority -20

priority -20  -设置进程优先级为-20(最高优先级),保证zygote作为核心系统进程获得高优先级

-20 到 -10

极高优先级

系统关键进程,如zygote、system_server

-10 到 -1

高优先级

系统服务、关键应用

0 到 9

中等优先级

普通应用、服务

10 到 19

低优先级

后台应用、非关键服务

4     user root

user root  以root用户身份运行,获得最高系统权限

5     group root readproc reserved_disk

group root readproc reserved_disk

  root - 主要组为root

  readproc - 允许读取其他进程信息

  reserved_disk - 允许访问保留磁盘空间

6     socket zygote stream 660 root system
7     socket usap_pool_primary stream 660 root system

创建两个socket用于进程间通信:

  socket zygote stream 660 root system 

stream 660:流式socket,权限660(所有者可读写,组可读写)

  socket usap_pool_primary stream 660 root system,usap_pool_primary socket:用于其他用途

  root system:socket所有者和组

8     onrestart exec_background - system system -- /system/bin/vdc volume abort_fuse
9     onrestart write /sys/power/state on
10     # NOTE: If the wakelock name here is changed, then also
11     # update it in SystemSuspend.cpp
12     onrestart write /sys/power/wake_lock zygote_kwl
13     onrestart restart audioserver
14     onrestart restart cameraserver
15     onrestart restart media
16     onrestart restart --only-if-running media.tuner
17     onrestart restart netd
18     onrestart restart wificond

 onrestart指令是当zygote重启时执行的操作:

exec_background:后台执行vdc命令

write /sys/power/state on:唤醒系统

write /sys/power/wake_lock zygote_kwl:保持唤醒锁

onrestart restart audioserver

onrestart restart cameraserver

onrestart restart media

onrestart restart --only-if-running media.tuner

onrestart restart netd

onrestart restart wificond

重启zygote时,同时重启相关的重要系统服务

包括音频、相机、媒体、网络等服务

19     task_profiles ProcessCapacityHigh MaxPerformance

task_profiles:设置任务性能配置

ProcessCapacityHigh MaxPerformance:高性能处理能力

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

critical:设置关键窗口和目标,确保zygote的稳定

PS:为了学习完整流程,后续不会这么详细解读代码,涉及的类以及方法太多,后续大概流程如下,会慢慢补充。

http://www.lryc.cn/news/615793.html

相关文章:

  • 《解锁 C++ 基础密码:输入输出、缺省参数,函数重载与引用的精髓》
  • 【Linux | 网络】数据链路层
  • 九、Linux Shell脚本:运算符与表达式
  • 开启单片机
  • 服务器硬件电路设计之 I2C 问答(三):I2C 总线上可以接多少个设备?如何保证数据的准确性?
  • 笔试——Day34
  • 亚麻云之全球加速器——CloudFront(CDN)服务入门
  • 【Docker实战】Spring Boot应用容器化
  • ShadowKV 机制深度解析:高吞吐长上下文 LLM 推理的 KV 缓存“影子”方案
  • Python爬虫-爬取政务网站的文档正文内容和附件数据
  • 【后端】Java 8 特性 `User::getId` 语法(方法引用)介绍
  • 【东枫科技】NTN-IOT 卫星互联网原型系统,高达1.6G大带宽
  • MPLS特性之PHP(Penultimate Hop Popping)
  • Android快速视频解码抽帧FFmpegMediaMetadataRetriever,Kotlin(2)
  • 【软考中级网络工程师】知识点之 DCC 深度剖析
  • 【21】OpenCV C++实战篇——OpenCV C++案例实战二十七《角度测量》
  • Perplexity 为特朗普 Truth Social 提供技术支持
  • 如何培养自己工程化的能力(python项目)
  • Pytorch深度学习框架实战教程12:Pytorch混合精度推理,性能加速147%的技术实现
  • 若依前后端分离版学习笔记(八)——事务简介与使用
  • Apache Pulsar性能与可用性优化实践指南
  • NLP---IF-IDF案例分析
  • C++高频知识点(十九)
  • 【面试场景题】异地多活改造方案
  • 【Matplotlib】中文显示问题
  • 【论文阅读】Deep Adversarial Multi-view Clustering Network
  • Docker 镜像常见标签(如 `标准`、`slim`、`alpine` 和 `noble`)详细对比
  • 随想记——excel报表
  • Linux下的软件编程——标准IO
  • 编程基础之多维数组——矩阵交换行