一、启动初探

在android手机上,当我们点击桌面上的按钮启动一个应用,就能打开应用的界面。这里我们所说的桌面其实就是android系统启动后的就已经帮我们运行的第一个程序,launcher程序。

launcher程序可以理解为作为其它应用app入口管理的一个系统自带的app,正常情况下,安装一个新的应用,就会在桌面(laucher)程序中显示一个相应的图标。

上述点击桌面上的图标打开应用的过程,本质上是通过lancher应用的提供的桌面图标启动另一个app的过程,并打开了新应用的首个Activity。

很显然,上述的过程是两个应用之间的一个交互,属于跨进程的通信。

针对于上述流程中,今天我们先搞清楚第一个问题:

Android手机系统启动的流程,都干了些什么?另外,从launcher程序中打开一个应用的流程,暂不分析。

说明:不会涉及太多的源码分析,尤其相对底层非java层源码,本篇主要分析Android系统启动、App启动的流程,部分涉及到的源码为Android10.0源码。

二、Android系统启动流程

首先,我们来看一下android系统的启动架构图:

Android系统启动的过程是自下而上的一个过程,是由Boot Loader引导开机,然后依次进入:

Kernel->Native->FrameWork->App,从上图中也能看到在App层启动了我们的launcher应用。

1、BootLoader

板子上电后,芯片从固化在ROM里预设的代码(BOOT ROM)开始执行,BOOT ROM会加载BootLoader到RAM,然后把控制权交给BootLoader。

BootLoader并不属于Android系统,它的作用是初始化硬件设备,加载内核文件等,为Android系统内核启动搭建好所需的环境。

BootLoader是针对特定的主板和芯片的(与CPU以及电路板的配置情况有关),因此对于不同的设备制造商,他们的引导程序都是不同的。目前大多数系统都是是uboot来修改的。

BootLoader引导程序一般分两个阶段执行:

1.基本的硬件初始化,目的是为了下一个阶段的执行以及随后的kernel的执行准备好一些基本的硬件环境。这一阶段的代码通常是用汇编语言写的,以达到短小精焊的目的。

2.初始化Flash设备,设置网络、内存等等,将kernel映像和根文件系统映像从Flash上读到RAM空间中,然后启动内核。这段代码通常是用C语言来写的,以便于实现复杂的功能和取得更好的代码可读性和可移植性。

实际上BootLoader还需要根据misc分区的设置来决定是要正常启动系统内核还是要进入recovery进行系统升级,复位等工作。

2、Linux kernel

Linux内核负责初始化各种软硬件环境,加载驱动程序,挂载根文件系统等。最重要的是内核启动完成后,它会在根文件系统中寻找”init“文件,然后启动init进程

3、init进程

init进程是Linux系统中用户空间的第一个进程,进程号为1,我们可以说它是root进程或者是所有进程的父进程。

在init进程中,挂载虚拟文件系统、启动property服务、当然更重要的是包括了启动的各种系统服务:serviceManager、adbd、mediasever、zygote、bootanmation等。

4、zygote进程

zygote进程是Android系统最重要的进程之一。后续Android中的应用进程都是由zygote进程fork出来的。因此,zygote是Android系统所有应用进程的父进程。zygote进程实际执行文件并不是zygote,而是/system/bin/app_process。它会调用 frameworks/base/core/jni/AndroidRuntime.cpp 提供的接口启动 java 层的代码 frameworks/base/core/java/com/android/internal/os/ZygoteInit.java。

public static void main(String argv[]) {.....zygoteServer = new ZygoteServer(isPrimaryZygote);Runnable r = forkSystemServer(abiList, zygoteSocketName, zygoteServer);.....
}

上面的ZygoteInit.java中的核心代码,ZygoteServer的构造函数:

/*** 初始化一个带有server socket的ZygoteServer进程。*/
ZygoteServer(boolean isPrimaryZygote) {....mZygoteSocket = Zygote.createManagedSocketFromInitSocket(Zygote.PRIMARY_SOCKET_NAME);.....
}

”后续Android中的应用进程都是由zygote进程fork出来的“,上述zogoteInit的主要工作:

1、启动socket服务,监听socket,当有启动应用的请求到达的时候,fork生成app应用进程。

2、启动SystemServer进程。

5、systemServer进程

SystemServer进程,被称为系统服务进程,属于Android framework层的源码实现,通过android studio打开SystemServer.java,能够看到其中声明了大量的android的系统服务。简单看一下SystemServer.java的源码实现:

/*** zygote进程调用入口点*/
public static void main(String[] args) {// systemServer的实际创建,并run起来new SystemServer().run();
}
private void run() {// 初始化系统上下文.createSystemContext();// 创建service manager.mSystemServiceManager = new SystemServiceManager(mSystemContext);// Start services.(启动服务)try {traceBeginAndSlog("StartServices");startBootstrapServices();//引导程序服务startCoreServices();//核心服务startOtherServices();//其它服务SystemServerInitThreadPool.shutdown();} catch (Throwable ex) {...}
}

SystemServer的主要作用就是启动各种系统的服务和管理它们,包含三大类服务:

  1. BootstrapService:我们日常常用的ActivityMangerService、PowerManagerService、PackageManagerService;
  2. CoreService:BatteryService、UsageStatsService、WebViewUpdateService
  3. OtherService: WindowManagerService、InputManagerService、WatchDog(印象中做ANR采集的时候用到过,原来在这启动的服务)

6、launcher的启动

上述systemServer进程中启动的ActivityManagerService,最后会调用systemReady

public void systemReady(final Runnable goingCallback, TimingsTraceLog traceLog) {...//9.0源码,此处的api有区别,建议直接查看10.0源码mAtmInternal.startHomeOnAllDisplays(currentUserId, "systemReady");...
}

上述代码,就是laucher程序的启动的入口函数,这里不做详细深入的launcher程序启动过多细节,Android10.0的源码和之前的源码有一些差别,主要是将很多职责交给了ActivityTaskManagerService来处理,需要追看源代码的可以从这里入手继续看。简单概括一下launcher程序的启动的流程:

  1. SystemServer完成启动Launcher Activity的调用(intent);
  2. Zygote进程进行Laucher进程的fork操作
  3. 进入到ActivityThread的main(),最终完成Launcher的onCreate方法的调用

2、3步骤,分析过Activity的启动过程源码的同学,一眼就能看出一致性。

7、BootAnimation退出

Launcher启动完成之后,开机动画会进行出,这样给用户的体验就是开机后,就直接进入到桌面了。

本篇文章部分文字描述摘自其它网络资源,源码部分皆为自行查看和注释。

参考文章:http://gityuan.com/android/,https://qiushao.net/
及时获得最新文章更新,关注gongzhonghao:Hym4Android

Android系统启动流程分析相关推荐

  1. Android系统启动流程分析之安装应用

    2016六月 21 原 Android系统启动流程分析之安装应用 分类:Android系统源码研究 (295)  (0)  举报  收藏 跟随上一篇博客Android系统的启动流程简要分析继续分析an ...

  2. Android 7.0系统启动流程分析

    随着Android版本的升级,aosp项目中的代码也有了些变化,本文基于Android 7.0分析Android系统启动流程.当我们按下电源键后,整个Android设备大体经过了一下过程:  今天我们 ...

  3. Android系统启动流程—— init进程zygote进程SystemServer进程启动流程

    原文地址:https://blog.csdn.net/qq_30993595/article/details/82714409 Android系统启动流程 Android系统启动过程往细了说可以分为5 ...

  4. 从源码解析-Android系统启动流程概述 init进程zygote进程SystemServer进程启动流程

    Android系统启动流程 启动流程 Loader Kernel Native Framework Application init进程 启动 rc文件规则 Actions Commands Serv ...

  5. Android系统启动流程 -- bootloader

    Android系统启动流程 -- bootloader   BootLoader:在嵌入式操作系统中,BootLoader是在操作系统内核运行之前运行.可以初始化硬件设备.建立内存空间映射图,从而将系 ...

  6. 基于Android13的系统启动流程分析(三)之FirstStageMain阶段

    Android13系统启动阶段大致分为FirstStageMain阶段和SecondStageMain,此章主要讲FirstStageMain阶段 (若分析有误敬请指教) 本章讲解的方向和你将收获的知 ...

  7. 基于Android13的系统启动流程分析(六)之SystemServer内部逻辑分析

    主要分析一下SystemServer启动过后的内部逻辑,特别说明一下AMS,WMS都属于SystemServer进程,属于同一个进程 一. SystemServer进程启动流程 基于Android13 ...

  8. Android 7.1.2(Android N) Android系统启动流程

    Android 7.1.2(Android N) Android系统启动流程 源码: system/core/rootdir/ init.rc init.zygote64.rc system/core ...

  9. 【SemiDrive源码分析】【X9芯片启动流程】09 - X9平台系统启动流程分析

    [SemiDrive源码分析][X9芯片启动流程]09 - X9平台系统启动流程分析 一.X9 芯片介绍 二.OSPI1_ONLY boot (0000)启动方式(Nor + eMMC) 2.1 Se ...

  10. Android系统启动流程(四)Launcher进程启动过程解析(附带面试题)

    前面我们分析了init进程,zygote进程,SystemServer进程,本篇的Launcher是系统启动流程的最后一个进程. 1 Launcher概述 Launcher进程是一个系统的应用程序,位 ...

最新文章

  1. pycharm 取消连按两下shift出现的全局搜索
  2. laravel5.6 mysql_快速入门 |《Laravel 5.6 中文文档 5.6》| Laravel China 社区
  3. c语言输入坐标判断位置,〓求助〓谁能帮忙编个程序:输入N个点坐标,判断能否构成多边形....
  4. Keepalived配置文件详解
  5. 使用gitlab初次上传代码
  6. feign服务器响应数据量过大,SpringCloud之Feign 性能优化
  7. fragtats中平均临近距离(PROX_MN)的具体解释
  8. 盈利靠涨价、广告满屏飞,共享充电宝入局容易做大难
  9. Android 蓝牙相关的广播
  10. 大型网站系统架构分析
  11. 十五、K8s helm包管理与应用
  12. paip.c++ qt messagebox用法
  13. 小米系统服务器,小米服务框架
  14. Aircrack-ng支持网卡列表(下)
  15. 免费可开放接口一览表
  16. 【GitHub Desktop】(GitHub Windows桌面版) 中文汉化,(GitHub客户端汉化,非网页端插件)
  17. 七周成为数据分析师 第三周:Excel篇
  18. HTTP协议响应头之Transfer-Encoding:分块传输详解
  19. 小游戏《塔防》开发(一)上篇
  20. 实现Android手机之间在局域网下传输任意文件

热门文章

  1. 3.5.1_2 Maven - pom.xml 添加maven-assembly-plugin(官方标准打包插件)
  2. 为什么要有红黑树?什么是红黑树?
  3. 医院信息化建设,该何去何从?
  4. FatMouse believes that the fatter a mouse is, the faster it runs.
  5. Python原来有三大神器
  6. 【Audio】基于STM32 I2S移植WM8978 Audio Codec驱动
  7. 分享餐饮管理组织结构流程图模板
  8. 如何只用HTML创建一个时间计划表?
  9. 黄山学院计算机专业考研情况,为什么考入北大的研究生偏偏来自黄山学院这样的学校?...
  10. python实现车牌识别系统