Android 系统启动流程简介

2023-11-09

1. Init 进程启动流程
2. Zygote启动流程

3. SystemServer启动流程


1.  Init 进程启动流程

Android启动流程

  init进程 –>
 Zygote进程 –>
 SystemServer进程 –>

各种应用进程


Init 进程
init是第一个进程,我们可以说它是root进程或者说有进程的父进程。init进程有两个责任,
一是挂载目录,比如/sys、/dev、/proc,
二是运行init.rc脚本。


init进程可以在/system/core/init找到。
源码位置 Init.cpp: system/core/init/init.cpp
 init系统中位置:/init


init.rc文件可以在/system/core/rootdir/init.rc找到。
readme.txt可以在/system/core/init/readme.txt找到。


Android初始化语言由四大类型的声明组成,即Actions(动作)、Commands(命令)、Services(服务)、以及Options(选项)
Action(动作):动作是以命令流程命名的,有一个触发器决定动作是否发生。
Service(服务):服务是init进程启动的程序、当服务退出时init进程会视情况重启服务
Options(选项)  :选项是对服务的描述。它们影响init进程如何以及何时启动服务。

在这个阶段你可以在设备的屏幕上看到“Android”logo了。


Init.rc脚本解析


2. Zygote启动流程

Zygote进程启动过程


1. 解析启动Service(Zygote) init.rc->
service zygote /system/bin/app_process32 - Xzygote /system/bin 
--zygote --start-system-server --socket-name=zygote
执行命令后到frameworks\/base/\cmds\/app_process/\app_main.cpp   main()
2.  app_main.cpp 里调用AndroidRuntime.start()启动ZygoteInit.cpp  Main().
frameworks/base/core/jni/AndroidRuntime.cpp
3.  AndroidRuntime.start方法调用ZygoteInit.java的Main()方法。
runtime.start("com.android.internal.os.ZygoteInit", args, zygote);
runtime.start("com.android.internal.os.RuntimeInit", args, zygote);
frameworks/base/core/jni/AndroidRuntime.cpp

frameworks/base/core/java/com/android/internal/os/ZygoteInit.java-

4. ZygoteInit.java  main() 方法
frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
5. Register zygote Socket
ZygoteServer.registerServerSocketFromEnv(“zygote”)
frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
6. StartSystemServer
 startSystemSerer
forkSystemServer(abilist,socketName,zygoteServer)
frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
7.RunSelectLoop
Caller=zygoteServer.runSelectLoop(abilist)

frameworks/base/core/java/com/android/internal/os/ZygoteInit.java

3. SystemServer启动流程


1. ZygoteInit.java  main() 方法, 
pid=Zygote.forkSystemServer()  ->
handleySystemServerProcess() ->
RuntimeInit.zygoteInit() ->


Frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
frameworks/base/core/java/com/android/internal/os/Zygote.java
frameworks/base/core/java/com/android/internal/os/RuntimeInit.java
    ---- (Class zygote, method forkSystemServer)

2. RuntimeInit.ZygoteInit()  - >
   RuntimeInit.commonInit();  ZygoteInit.nativeZygotieInit();  RuntimeInit.appicationInit(); ->
  invokeStatickMain(args,startClass,args.startArgs,classLoader); ->
  throw new Zygote.MethodAndArgsCaller(m,argv)  调用到SystemServer Mian方法
frameworks/base/core/java/com/android/internal/os/RuntimeInit.java
frameworks/base/services/java/com/android/server/SystemServer.java
3.1 在SystemServer.java    main() 方法里调用到SystemServer().run()  ->  
      设置一些系统属性
       SystemProperties.set("persist.sys.timezone", "GMT"); 
       SystemProperties.set("persist.sys.locale", languageTag);    
       SystemProperties.set("persist.sys.language", "");
        SystemProperties.set("persist.sys.country", "");
        SystemProperties.set("persist.sys.localevar", "");


3.2   run () 里其他初始化及设置主线程,开始服务和LOOPER:
 Build.ensureFingerprintProperty();
// Increase the number of binder threads in system_server
BinderInternal.setMaxThreads(sMaxBinderThreads);
// Prepare the main looper thread (this thread).  设置主线程
android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_FOREGROUND);
android.os.Process.setCanSelfBackground(false);              Looper.prepareMainLooper();  准备LOOPER.
 // Initialize native services.
    System.loadLibrary("android_servers");
  // Start services. 开启服务
    try {traceBeginAndSlog("StartServices");startBootstrapServices();
            startCoreServices();startOtherServices(); SystemServerInitThreadPool.shutdown(); }
 // Loop forever.   开启Looper.
Looper.loop();
frameworks/base/services/java/com/android/server/SystemServer.java

转载:https://blog.csdn.net/weixin_41820883/article/details/80895733

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 系统启动流程简介 的相关文章

随机推荐

  • 使用IDEA基于MVC和分层模式完成登录和注册

    MVC Model View Controller 1 概念 MVC模式中 M是指业务模型 V是指用户界面 C则是控制器 其中 View的定义比较清晰 就是用户界面 M Model模型 完成具体的业务操作 e g 查询数据库 封装对象 V
  • Gateway网关提示Flipping property: system-server.ribbon.ActiveConnectionsLimit to use NEXT property: niws

    一 问题描述 自己有一个微服务项目 使用了GateWay进行限流处理 但是最近发现 无论如何 系统都登陆不上去了 出现了问题 控制台总是提示Flipping property system server ribbon ActiveConne
  • centos8与centos7有什么区别呢?一文带你了解区别

    作者 小刘在C站 个人主页 小刘主页 努力不一定有回报 但一定会有收获加油 一起努力 共赴美好人生 学习两年总结出的运维经验 以及思科模拟器全套网络实验教程 专栏 云计算技术 小刘私信可以随便问 只要会绝不吝啬 感谢CSDN让你我相遇 目录
  • web3.0的特点、应用和安全问题

    特点 Web 3 0 也称为 Web 3 或 Semantic Web 是互联网的下一阶段 旨在构建更加智能 去中心化和用户友好的网络 Web 3 0的主要内容包括以下几个方面 去中心化 Web3 0 的目标是将互联网从集中式架构转变为去中
  • YOLO V7源码解析

    1 命令行参数介绍 YOLO v7参数与YOLO v5差不多 我就直接将YOLO v5命令行参数搬过来了 偷个懒 weights 初始权重 cfg 模型配置文件 data 数据配置文件 hyp 学习率等超参数文件 epochs 迭代次数 i
  • AndroidStudio 快捷键使用总结大全

    原文转自 http mobile 51cto com aengine 463236 htm 本文介绍了一系列在AndroidStudio中常用的快捷键 希望可以帮助各位在AndroidStudio的使用中更加得心应手 如鱼得水 随心所欲 驾
  • vue踩坑记:把对象中的数据同时赋给了两个变量,改变一个对象的值,另一个对象也变化了

    场景 请求到数据后 将数据data a同时赋给了c和b 这时改变c的时候b的值也会跟着变 为什么会出现这种情况呢 其实 这是一个引用传递而不是值传递 c和b指向的是同一个内存地址 如果想实现改变了c而不改变b的话 我们要怎么操作呢 可以给b
  • VC实现微秒(十万分之一秒)休眠

    VC自带的SDK中为我们提供了一个Sleep函数 此函数的最小单位为毫秒 既千分之一秒 但在实际的应该中 特别是网络数据传输 我们需要更小的休眠单位 微秒 而系统又没有提供相关API 那么我们如何实现微秒 既十万分之一秒 的休眠呢 我们知道
  • 芯片面积估算

    If giving total standard cell gate count all memory macro list including memory type bit width and depth all other macro
  • Socket中出现EOFException错误问题

    java io EOFException at java io ObjectInputStream PeekInputStream readFully ObjectInputStream java 2681 at java io Objec
  • 六、Vite 常用第三方库(axios、mockjs、sass、echars、element-plus、开箱即用)

    文章目录 一 参考 二 vite 创建 Vue 项目工程 2 1 create vite和vite的关系是什么呢 2 2 vue团队希望弱化vite的一个存在感 但是我们去学习的时候不能弱化的 2 3 创建工程 三 第三方库的安装 开箱即用
  • CMake:递归检查并拷贝所有需要的DLL文件

    文章目录 1 目的 2 设计 整体思路 多层依赖的处理 获取 DLL 所在目录 探测剩余的 DLL 文件 3 代码实现 判断 stack 是否为空 判断 stack 是否为空 获取所有 target 检测并拷贝 DLL 4 使用 1 目的
  • 苏州吴江区实现首单跨区域数字人民币试点场景应用

    作为数字人民币试点的首批城市 苏州一直在数字人民币应用场景的落地方面进展迅速 其中 苏州相城区在全市率先开展数字人民币场景建设及试点 截至目前 已开放试点场景7500余个 占全市总数近50 并在全国率先落地交通补贴批量代发 房屋契税缴纳 智
  • python num循环怎么从1开始

    如何实现python for循环从1开始 range 函数的作用和用法 编写一个从数值1开始的循环 执行后得到的结果 其他注意事项
  • 在OTFS学习中的一些总结

    双选特性 多径传播 gt 时延 gt 频率选择性 时延的倒数为相干带宽 在频域内信道相应的幅值大概保持不变的一段频率称为相干带宽 当信号的带宽小于相干带宽 或者说信号的传输时间 周期 大于时延拓展 信号之间没有干扰 我们认为信号是没有失真的
  • Win10下Anaconda使用conda activate激活环境出错

    直接输入conda activate pytorch 报如下错误 解决方法 1 在base路径下先输入activate 提示如下 2 再输入conda activate base 激活base环境 3 在输入conda activate p
  • [python知识] 爬虫知识之BeautifulSoup库安装及简单介绍

    一 前言 在前面的几篇文章中我介绍了如何通过Python分析源代码来爬取博客 维基百科InfoBox和图片 其文章链接如下 python学习 简单爬取维基百科程序语言消息盒 Python学习 简单网络爬虫抓取博客文章及思想介绍 python
  • awk使用shell变量,shell获取awk中的变量值

    awk使用shell变量 shell获取awk中的变量值 2012 04 13 09 36 28 分类 LINUX 字号 订阅 原文 http renyongjie668 blog 163 com blog static 160053120
  • 今天面试招了个18K的人,从腾讯出来的果然都有两把刷子···

    公司前段时间缺人 也面了不少测试 前面一开始瞄准的就是中级的水准 也没指望来大牛 提供的薪资在15 20k 面试的人很多 但平均水平很让人失望 看简历很多都是4年工作经验 但面试中 不提测试工具 仅仅基础的技术很多也知之不详 多数人数年的工
  • Android 系统启动流程简介

    1 Init 进程启动流程 2 Zygote启动流程 3 SystemServer启动流程 1 Init 进程启动流程 Android启动流程 init进程 gt Zygote进程 gt SystemServer进程 gt 各种应用进程 I