Android进程启动流程

news2024/11/23 21:09:25

一.Android 系统架构图

​虽然 Android 系统非常庞大且错综复杂,但整体架构设计清晰。Android 底层内核空间以 Linux Kernel 作为基石,上层用户空间由 Native系统库、虚拟机运行环境、框架层组成,通过系统调用(Syscall)连通系统的内核空间 与 用户空间。对于用户空间主要采用 C++ Java 代码编写,通过 JNI 技术打通用户空间的 Java层 和 Native(C++/C),从而连通整个系统。为了能让大家整体上大致了解Android系统涉及的知识层面,先来看一张Google官方提供的经典分层架构图:

Linux内核层

Android系统是基于Linux操作系统的,严格来说,它属于Linux操作系统的一个变种。

好处:

避免了与硬件直接打交道;基于Linux系统的驱动开发可扩展性很强;

硬件抽象层

通过定义硬件“驱动”的接口来进一步降低Android系统与硬件的耦合度;

由于Linux遵循的是GPL协议,而Android开源项目基于Apache协议,意味着其下的所有驱动都应该开源,

这一点对于部分厂商来说无法接受;

系统运行库

这层中包含了支持整个系统正常运行的基础库,由于这些库多数都由C/C++实现,因此也被一些开发人员

成为“C库层”,以区别于应用程序框架层。

应用程序框架层

与系统运行库被称为“C库层”相对应,应用程序框架层往往被冠以“JAVA库”的称号。这是因为框架层

所提供的组件一般都是以JAVA语言编写而成,他一方面为上层应用程序提供了API接口;

另一方面也囊括了不少系统级服务进程的实现,是与Android应用程序开发者关系最直接的一层

应用程序层

应用是用java语言编写的运行在虚拟机上的程序,比如Email客户端,SMS短消息程序,日历等

二.Android 启动流程

 

Android启动流程图:

1.Boot Rom:按电源键上电后,引导芯片从固化在ROM的预设代码开始执行,加载引导程序到RAM

2.SML:初始化TrustZone TEE运行环境,运行时切换非安全世界(Android/Linux)和安全世界(TOS),支持CPU core power uppower downsuspendresumeCPU电源管理功能,控制部分芯片安全硬件模块

3.TOS:实现Trusty OS基本模块,包括线程调度、中断处理、MMU、内存子系统、Timer以及系统调用等。完成安全启动、指纹、人脸、安全存储、数据加解密等安全业务

4.Bootloader:引导程序,主要作用是初始化flash、将内核kernel拷贝到内存中、启动内核

5.启动kernel:主要是启动内核线程kernel_initkernel_init函数完成设备驱动程序的初始化,并调用init_post启动用户空间的init进程

6.启动init进程:在Linux系统中,所有的进程都是由init进程直接或间接fork出来的。init进程负责创建系统中最关键的几个子进程,尤其是zygote进程,另外它还提供了property service

7.启动surfaceflinger进程:init在解析rc过程中,在boot阶段通过class_start core接口启动surfaceflinger进程。当surfaceflinger启动之后会通过init设置“service.bootanim.exit属性为0,同时调用ctl.start接口通知init启动bootanimationservices(开机动画显示服务)。

8.启动zygote进程:当init进程创建之后,会fork出一个zygote进程,这个进程是所有Java进程的父进程。

9.启动SystemServer进程:SystemServer进程由zygote进程fork,这个进程在整个Android系统中非常重要,系统里面的服务都是在这个进程里面开启的,例如AMSActivity Manager Service,活动管理服务)、WindowsManager等。

10.运行Home Activity:最后AMS会通过Home intent启动launcher

三.Init进程启动过程

 

 init进程是Android系统中用户空间的第一个进程,进程号为1,是Android系统启动流程中的一个关键的步骤,作为第一个进程,它被赋予了很多极其重要的工作职责,比如创建Zygote(孵化器)和属性服务等。init进程是由多个源文件共同组成的,这些源文件位于源码目录system/core/init中。

kernel_init初始化如上图:

kernel_init启动后,完成一些init的初始化操作。启动后去系统根目录下依次找ramdisk_execute_commandexecute_command设置的应用程序,如果这两个目录都找不到,就依次去根目录下找/sbin/init/etc/init/bin/init/bin/sh,只要这些应用程序有一个启动了,其他就不需启动了。当log中出现以下信息说明init启动成功。

00736 <0> [12.935128][01-01 08:00:11.935] run init

00737 <14> [12.961677][01-01 08:00:11.961] init: init first first stage started!Android系统一般会在根目录下放一个init的可执行文件,也就是说Linux系统的init进程在内核初始化完成后,就会直接执行该init文件。

内核启动init进程

 

 

四.zygote启动流程 

zygote启动流程
init进程启动后,zygote是最重要的一个进程,它是所有Android Java进程的父进程。SystemServer和其他所有Dalivik虚拟机进程都是由zygotefork而来。
zygote是由app_process启动。zygote按C/S模型工作,它作为服务端,其他进程作为客户端。其他进程向zygote发出fork请求,zygote收到请求后fork一个新的进程。

zygote启动过程
init进程启动后,会解析init.rc文件,然后创建和加载service字段指定的进程。zygote进程就是以这种方式,被init进程加载的。
在/system/core/rootdir/init.rc中,通过如下引用来加载zygote的rc。import /system/etc/init/hw/init.${ro.zygote}.rc其中,${ro.zygote}由各个厂家使用,现在主流厂家基本使用zygote64_32,相应的${ro.zygote}.rc文件为init.zygote64_32.rc。

init.zygote64_32.rc
Primaryzygote
进程名:zygote进程通过/system/bin/app_process64来启动,支持64位程序。
启动参数:-Xzygote/system/bin --zygote--start-system-server --socket-name=zygote
socket名称:zygote

 

Secondary zygote

进程名:zygote_secondary

进程通过/system/bin/app_process32来启动,支持32位程序。

启动参数:-Xzygote/system/bin --zygote--socket-name=zygote_secondary --enable-lazy-preload

socket名称:zygote_secondary

init.zygote64_32.rc中的以下内容可以看出,zygote是通过进程文件/system/bin/app_process64/system/bin/app_process32来启动的。

zygote进程重启

有些services发生异常重启时会同时重启zygote,其对应的rc文件中有“onrestart restart zygote”的字样。以surfaceflingerservice为例,surfaceflinger.rc相关内容如下。

如上述rc文件所示,当surfaceflingerservice发生异常重启时会同时重启zygote

zygote进程的重启时机如下

zygote的工作内容

zygote是所有Android Java进程的父进程,是Java世界的入口。zygote启动后的工作内容

zygote流程图

 startVM()
该函数主要是初始化VM参数。需重点关注dalvik heapsize的初始化,如果VM参数未配置正确或使用默认参数很有可能导致手机无法进入Launcher。目前app占用的heapsize都比较大,使用默认参数很容易出现内存不足,导致应用不断重启。


startReg()
注册JNI(Java Native Interface,Java原生接口)函数,遍历gRegJNI数组中JNI register方法注册JNI method。注册JNI后,会通过JNI调用java class(zygoteInit)的main函数进入java世界。


registerServerSocket()
通过获取环境变量值得到zygote文件描述符,根据该文件描述符创建socket,用来和ActivityManagerService通信。AMS通过Process.start来创建新的进程,而Process.start会先通过socket连接到zygote进程,并最终由zygote完成进程创建。


preload()
预加载类和资源,zygote通过预加载类和资源可以加快子进程的执行速度和优化内存。因为预加载的类和资源较多,在开机优化过程中也需要重点关注preload的耗时。
预加载Class文件路径:/system/etc/preloaded-classes预加载resource文件路径:frameworks/base/core/res/res/values/arrays.xml


forkSystemServer()
启动system_server进程,Android Java系统服务都将驻留在该进程中,是Android framework核心。设置systemserver进程的uid、gid、process name和class name。

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/91514.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

浅谈hudi 的callback回调机制

浅谈hudi 的callback回调机制 关于hudi的write operations,hudi有4种类型,分别为upsert/insert/bulk_insert/delete[软删除/硬删除]。 了解hudi的都知道,hudi有一个核心的机制就是timeline,hudi的instantDTO包含action(动作),ts(时间),state(状态)。 action主要包括: commits…

Linux常用命令总结(建议收藏)

文章目录一、文件管理1、cat&#xff1a;查看文件内容案例1&#xff1a;输出内容行数2、chmod&#xff1a;是控制用户对文件的权限的命令案例1&#xff1a;&#xff1a;将user文件修改成用户、组、其他用户都可以读写可执行的权限3、diff&#xff1a;用于比较文件的差异4、find…

ELK (一)部署ELK+Filebeat日志收集分析系统

说明&#xff1a;此安装流程只适用于8.0.0以下的版本 1. ElasticSearch 部署 1.1 下载ElasticSearch的wget指令&#xff1a; wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.13.4-linux-x86_64.tar.gz1.2 解压安装包到指定目录 指定解压缩到 …

【指纹识别】指纹识别【含GUI Matlab源码 586期】

⛄一、指纹识别简介 1 指纹识别的引入和原理 1.1 指纹的基本知识 指纹&#xff0c;由于其具有终身不变性、唯一性和方便性&#xff0c;已几乎成为生物特征识别的代名词。指纹是指人的手指末端正面皮肤上凸凹不平产生的纹线。纹线有规律的排列形成不同的纹型。纹线的起点、终点…

SpringBoot+Vue实现前后端分离的旅游网站

文末获取源码 开发语言&#xff1a;Java 使用框架&#xff1a;spring boot 前端技术&#xff1a;JavaScript、Vue.js 、css3 开发工具&#xff1a;IDEA/MyEclipse/Eclipse、Visual Studio Code 数据库&#xff1a;MySQL 5.7/8.0 数据库管理工具&#xff1a;phpstudy/Navicat JD…

【Effective_Objective-C_2对象,消息,运行期1】

文章目录前言6 理解”属性“这一概念定义变量不兼容现象的出现解决不兼容现象-Property使用属性更便捷属性特质原子性读写权限内存管理语义方法名原子性和非原子性要点总结7 在对象内部尽量直接访问实例变量要点总结8 理解“对象等同性” 和 isEqual“” 判断的依据“isEuqalTo…

RTL8380M/82M管理型交换机系统软件操作指南四:QoS/服务质量

接下来对QoS进行详细的描述&#xff0c;主要包括以下七大内容&#xff1a;QoS概述、功能简介、拥塞管理、策略分类、调度方式、优先级映射配置、QoS端口配置. 1.1 QoS概述 QoS&#xff08;Quality of Service&#xff0c;服务质量&#xff09;是用各种手段解决网络延迟和阻塞等…

[附源码]Python计算机毕业设计SSM基于Java动漫论坛系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

业务模型设计

业务模型设计业务模型设计统一语言、术语统一单词业务数据表模型规范数据库范式几个经验业务模型索引主键&#xff1a; 自增id、雪花id、和uuid 差别创建表字符集设置myisam 和 innodb 区别业务模型设计 统一语言、术语 定义&#xff1a;需求分析的过程&#xff08;系统目标、…

001、【C语言编程题目】猴子吃桃问题

001、【题目】猴子吃桃问题 猴子吃桃问题&#xff1a;猴子第一天吃了若干个桃子&#xff0c;当即吃了一半&#xff0c;还不解馋&#xff0c;又多吃了一个&#xff1b; 第二天&#xff0c;吃剩下的桃子的一半&#xff0c;还不过瘾&#xff0c;又多吃了一个&#xff1b;以后每天…

艾美捷针对性检测—游离维多珠单抗ADA水平检测试剂盒

艾美捷游离维多珠单抗ADA水平检测试剂盒可靠地测定游离ADA针对维多利单抗&#xff08;如ENTYVIO&#xff09;). 风湿因子的联合测定或排除不规则抗体。连同确定维多利单抗的活性物质浓度由IDK监测仪指示 维多利单抗免费ADA ELISA&#xff0c;主治医师有可能陪同治疗并在早期阶段…

用Python作一条已知曲线的等距曲线

参考资料&#xff1a; 该如何作一条已知曲线的等距曲线&#xff1f; - 知乎 等距线_百度百科 目录 1.等距线 2.数学推导 3.示例 4.代码与结果 1.等距线 等距线&#xff08;equidistant line&#xff09;亦称平行曲线&#xff0c;一种平面曲线&#xff0c;即由一已知曲线…

准备Plan B 如何设计兜底方案

对于很多秒杀系统而言&#xff0c;在诸如双十一这样的大流量的迅猛冲击下&#xff0c;都曾经或多或少发生过宕机的情况。当一个系统面临的大流量时&#xff0c;它其实很难单靠自身调整来恢复状态&#xff0c;你必须等待流量自然下降或者认人为地把流量切走才行&#xff0c;这无…

Android OpenGL ES 学习(九) – 坐标系统和实现3D效果

OpenGL 学习教程 Android OpenGL ES 学习(一) – 基本概念 Android OpenGL ES 学习(二) – 图形渲染管线和GLSL Android OpenGL ES 学习(三) – 绘制平面图形 Android OpenGL ES 学习(四) – 正交投影 Android OpenGL ES 学习(五) – 渐变色 Android OpenGL ES 学习(六) – 使用…

高通Ride软件开发包使用指南(7)

高通Ride软件开发包使用指南&#xff08;7&#xff09;6.5 构建 x86 Ubuntu SDK6.6端到端可视化6.7 x86 Ubuntu上的功能验证6.7.1简单比特率验证6.7.2在x86笔记本上用 8xCams HEVC格式 录制 FPS6.8记录仪6.5 构建 x86 Ubuntu SDK 构建 x86 ubuntu ~/src/qride/stack-sdk$ ./ex…

十个精妙绝伦的SQL语句,说尽SQL精华

目录引子十大SQL1. 统计班级总分前十名2. 删除重复记录, 且保留一条3. 最大连续登陆天数的问题4. 计算除去部门最高工资&#xff0c;和最低工资的平均工资5. 计算占比和同比增长6. 算成绩7.算昨天每个城市top 10消费金额的用户&#xff0c;输出city_id,city_name,uid, 消费总金…

C语言刷题(3)

&#x1f412;博客名&#xff1a;平凡的小苏 &#x1f4da;学习格言&#xff1a;别人可以拷贝我的模式&#xff0c;但不能拷贝我不断往前的激情 目录 计算体重指数 计算三角形周长和面积 KiKi和酸奶 网购 变种水仙花 计算体重指数 描述 问题&#xff1a;计算BMI指数&#xff0…

安全可信 | 强墙出击!天翼云Web应用防火墙(原生版)硬核亮相!

12月9日&#xff0c;由中国信息通信研究院主办的“墙墙联合——云上防火墙技术沙龙”在线上顺利举行&#xff0c;天翼云科技有限公司研发专家吴雷分享了新标准、新需求下云Web应用防火墙&#xff08;云WAF&#xff09;的发展方向&#xff0c;并介绍了天翼云Web应用防火墙&#…

如何从 OVF 或 OVA 文件中部署虚拟机

从 OVF 或 OVA 文件中部署虚拟机 使用新建虚拟机向导从 OV F和 VMDK 文件或 OVA 文件部署虚拟机。由于 Web 浏览器的限制,OVA 部署仅限于1GB以下的文件。要部署大于1GB的 OVA 文件,请使用 tar 提取 OVA 文件并分别提供OVF和VMDK文件。 一、右键单击导航器中的‘‘虚拟机“,…

Android:远程调试WebView

目录 前言 配置WebView 手机设置 远程调试 前言 APP中使用WebView展示网页的结果可能不太理想&#xff0c;那么我们想调试的话就没有在浏览器当中调试方便&#xff0c;不过谷歌浏览器给我们提供了能远程调试的方案。 官方文档&#xff1a;https://developer.chrome.com…