首页 > 其他分享 >Android Zygote 启动流程

Android Zygote 启动流程

时间:2024-03-27 14:12:57浏览次数:16  
标签:流程 system Zygote init zygote rc onrestart Android

Zygote 进程介绍

介绍

  • 在 Android 中,DVM、ART、和应用程序进程以及系统关键服务的 SystemServer 进程都是由 Zygote 进程创建,它被称为孵化器
  • 通过 fork 方式,创建应用程序进程和 SystemServer 进程,由于 Zygote 进程在启动的时候会创建 DVM 或者 ART,因为通过 fork 而创建的应用程序和 SystemServer 进程可以在内部获取一个 DVM 或者 ART 实例

Zygote 启动

  • Zygote 的启动是由 init.rc 脚本文件拉起来的。由 Android Init Language 编写而成的
  • 这些 zygote 启动脚本都放在 Android 源码的 system/core/rootdir 目录中
//init.rc
import /init.${ro.zygote}.rc

在 init.rc 中,启动 Zygote 并不是直接将启动的文件写死,而是根据 ro.zygote 的属性值来决定导入哪个版本的文件。
ro.zygote 取值有 4 种,也就意味着 Zygote 支持 4 种版本

init.zygote32.rc
init.zygote32_64.rc
init.zygote64.rc
init.zygote64_32.rc

init.zygote32.rc

只支持 32 bit 应用程序

service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
    class main
    priority -20
    user root
    group root readproc reserved_disk
    socket zygote stream 660 root system
    # onrestart write /sys/android_power/request_state wake
    # onrestart write /sys/power/state on
    # onrestart restart audioserver
    # onrestart restart cameraserver
    # onrestart restart media
    onrestart restart netd
    onrestart restart wificond
    writepid /dev/cpuset/foreground/tasks
  • 根据 Service 类型语句的格式,得知函数名为 zygote,执行程序路径为 /system/bin/app_process/,类名为 main

init.zygote32_64.rc

表示既支持 32 bit,又支持 64 bit 应用程序

service zygote /system/bin/app_process32 -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
    onrestart write /sys/android_power/request_state wake
    onrestart write /sys/power/state on
    onrestart restart audioserver
    onrestart restart cameraserver
    onrestart restart media
    onrestart restart netd
    onrestart restart wificond
    writepid /dev/cpuset/foreground/tasks

service zygote_secondary /system/bin/app_process64 -Xzygote /system/bin --zygote --socket-name=zygote_secondary
    class main
    priority -20
    user root
    group root readproc reserved_disk
    socket zygote_secondary stream 660 root system
    onrestart restart zygote
    writepid /dev/cpuset/foreground/tasks
  • 脚本会启动两个 Service,也就说会启动两个 Zygote 进程,一个名称叫 zygote,执行程序路径为 /system/bin/app_process32,作为主模式,另一个是 zygote_secondary,执行程序路径为 /system/bin/app_process64,作为辅模式

init.zygote64.rc 和 init.zygote64_32.rc

与上两个脚本类似,不在赘述

Zygote 启动过程

main() 函数

脚本启动 Zygote 后首先执行 frameworks/base/cmds/app_process/app_main.cpp/main() 中的代码

image

  • main 会启动 zygote,systemserver 和 application 三种类型的进程。根据传入的参数区别去启动不同类型的进程。
  • 启动进程的方法是使用 AppRuntime 类去调用 AndroidRuntime 启动 Android 进程。

AndroidRuntime.cpp

  • 该文件位于 frameworks/base/core/ 文件夹中
  • 该文件是用于启动 Android 服务的,包括 Zygote,SystemServer,application 等

image

ZygoteInit.java

  • ZygoteInit.java 文件位于 /frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
  • ZygoteInit的main方法主要做了4件事:
    1. 创建一个Server端的Socket。
    2. 预加载类和资源。
    3. 启动SystemServer进程。
    4. 等待AMS请求创建新的应用程序进程。

image

Zygote 进程总结

  1. 创建一个 AppRuntime 并调用其 start 方法,启动 Zygote 进程
  2. 创建 Java 虚拟机,并为 Java 虚拟机注册 JNI 方法
  3. 通过 JNI 调用 ZygoteInit 的 main() 函数进入 Zygote 的 Java 框架层
  4. 通过 registerZygoteSocket() 创建服务端 Socket,并通过 runSelectLoop() 方法等待 AMS 请求创建新的应用进程
  5. 启动 SystemServer 进程

标签:流程,system,Zygote,init,zygote,rc,onrestart,Android
From: https://www.cnblogs.com/wanghao-boke/p/18099022

相关文章

  • Android原生ViewPager控件实现卡片翻动效果
    本文实例为大家分享了Android控件ViewPager实现卡片翻动效果的具体代码,供大家参考,具体内容如下先放一张效果图:想要实现这样的效果其实并不是太难,需要对ViewPager的一些细节属性更深入的了解和认识,下面介绍下一个小demo的实现过程:**第一步、**创建卡片viewpager适配器的i......
  • 【Android面经】腾讯扩招了,离我进腾讯还会远吗?
    前言互联网回暖,腾讯扩招5000+,今天给大家分享一下腾讯三面顺利通过,都考了些啥?首先介绍一下我的BG,学长我,双非本硕计算机,在秋招的鞭策下,顺利在春招拿到offer希望我的经验也能帮助到你们,祝大家成功上岸。腾讯一面:1.记录uv(UniqueVisitors)为什么用set不直接计数?2.i......
  • Android Studio Iguana | 2023.2.1 补丁 1
     AndroidStudioIguana | 2023.2.1Canary3已修复的问题AndroidGradle插件问题295205663将AGP从8.0.2更新到8.1.0后,任务“:app:mergeReleaseClasses”执行失败问题298008231[Gradle8.4][升级]由于使用kotlingradle插件中已废弃的功能,升级后集成测试......
  • Android中运动事件的处理
    1.目录目录1.目录2.前言3.程序演示4.第二种程序示例5.扩展2.前言        触摸屏(TouchScreen)和滚动球(TrackBall)是Android中除了键盘之外的主要输入设备。如果需要使用触摸屏和滚动球,主要可以通过使用运动事件(MotionEvent)用于接收它们的信息。触摸屏和滚动球......
  • 摄像头国标交互流程
    1涉及内容sip,rtp(ps),开源sip服务,摄像头国标注册2流程注册后立即接入使用的是北小菜大佬的demo:https://gitee.com/Vanishi/BXC_SipServer 3sip流程图 4抓包显示注册和invite流程 5IPCamera注册设置 ......
  • 浏览器工作原理与实践--渲染流程(下):HTML、CSS和JavaScript,是如何变成页面的
    在上篇文章中,我们介绍了渲染流水线中的DOM生成、样式计算和布局三个阶段,那今天我们接着讲解渲染流水线后面的阶段。这里还是先简单回顾下上节前三个阶段的主要内容:在HTML页面内容被提交给渲染引擎之后,渲染引擎首先将HTML解析为浏览器可以理解的DOM;然后根据CSS样式表,计算出DOM......
  • 浏览器工作原理与实践--渲染流程(上):HTML、CSS和JavaScript,是如何变成页面的
    在上一篇文章中我们介绍了导航相关的流程,那导航被提交后又会怎么样呢?就进入了渲染阶段。这个阶段很重要,了解其相关流程能让你“看透”页面是如何工作的,有了这些知识,你可以解决一系列相关的问题,比如能熟练使用开发者工具,因为能够理解开发者工具里面大部分项目的含义,能优化页面卡......
  • 系统的启动流程
    系统的启动流程初始化系统在rhel7之前使用init初始化系统,在rhel7之后使用systemd初始化系统init和systemd的区别init是从上到下依次启动,如果一个点出现问题,那么它后面的点都不会启动systemd是并行启动,按需启动,可以一次性同步启动多个服务systemd会自动解决依赖问题(例如,启动......
  • web渗透测试漏洞流程:红队资产信息收集之子域名信息收集
    红队资产信息收集1.企业域名信息收集1.1主域名信息收集1.1.1主域名的whois信息1.2.4Whois信息在线收集地址1.2子域名信息收集1.2.1为什么要进行子域名枚举1.2.2子域名枚举搜索方法1.2.2.1搜索引擎查询子域名1.2.2.2资产引擎搜索子域名1.2.2.......
  • Android Framework system_server进程启动
    哈喽大家我是Zzz.今天分享的blog是system_server进程的启动,环境基于aosp13_r6,话不多说直接上干货前言:system_server是系统核心服务的一个进程,这个进程包含了系统中核心Service的运行,给系统提供如:Window的管理、Activity的管理,系统的核心功能都在System_server中;在ZygoteIni......