当前位置: 首页 > 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.dtcms.com/a/324503.html

相关文章:

  • springboot骚操作
  • 【论文阅读】Deep Adversarial Multi-view Clustering Network
  • 视觉障碍物后处理
  • Java开发异步编程中常用的接口和类
  • 人工智能之数学基础:如何理解n个事件的独立?
  • [C/C++线程安全]_[中级]_[避免使用的C线程不安全函数]
  • Android APK 使用OpenGl 绘制三角形源码
  • Word XML 批注范围克隆处理器
  • 绕过文件上传漏洞并利用文件包含漏洞获取系统信息的技术分析
  • 使用MongoDB存储和计算距离
  • Spring Boot 2 升级 Spring Boot 3 的全方位深度指南
  • Leetcode 3644. Maximum K to Sort a Permutation
  • 9_基于深度学习的车型检测识别系统(yolo11、yolov8、yolov5+UI界面+Python项目源码+模型+标注好的数据集)
  • Error: error:0308010C:digital envelope routines::unsupported at new Hash
  • 【Python 小脚本·大用途 · 第 3 篇】
  • 编译xformers
  • 【深度学习新浪潮】遥感图像风格化迁移研究工作介绍
  • 学习记录(十九)-Overleaf如何插入图片(单,多)
  • 学习模板元编程(3)enable_if
  • CART算法:Gini指数
  • 25.机器学习入门:让机器变聪明的魔法课
  • 串口通信初始化过程是怎样的???
  • IDEA 快捷编辑指南
  • Java开源代码源码研究:我的成长之路与实战心得分享
  • IDEA 安装插件的两种方式
  • 【面试场景题】异地多活改造方案
  • AI大模型--提示词工程
  • CVPR医学图像三套创新方案:通用分割+3D高效解码+SSM肿瘤定位(附链接)
  • 如何解决网站长期不连接数据库后首次连接缓慢的问题?
  • JS--判断是对象还是数组