揭开Android系统启动的神秘面纱

当有人问我们android中app启动流程的时候,我们总是会提到zygote。but,zygote又是从何而来?由此问题我想到了android系统的启动流程,zygote肯定是在系统初始化时创建的一个进程。带着这个疑问我去查询了一些android系统启动流程的资料及代码,下面是一张启动流程的简图,接下来我们会分析每一步做了什么,

1. 按下手机电源键

当我们按下android手机电源键后,“Boot ROM(Read only memory) code”(bootloader引导代码)将会从一个被硬编码的位置读取并开始执行。这段程序执行的主要目的是将bootloader(启动装载)代码载入内存并执行。

2.Bootloader(启动装载)

bootloader在android系统初始化前运行,他不属于android操作系统部分。通常情况下厂商会在bootloader中做一些加密及安全相关的功能。

bootloader程序分两个阶段执行。第一阶段,它检测外部RAM并加载第二阶段的辅助程序。在第二阶段,bootloader设置网络、内存等,设置内核运行参数等,即为kernel运行做准备。

你可以在aosp中找到这部分代码(android版本2.xx,后面有改动),

aosp/bootable/bootloader/legacy/usbloader(看源码需翻墙)

其中包含两个重要文件,

  1. Init.s,负责初始化堆栈,清空BSS(Block Started by Symbol segment),最终调用main.c中的_main()方法。
  2. main.c,负责初始化硬件(时钟,主板,键盘,控制台),并且创建linux标签。

3. Kernel(内核) android内核启动与linux相似,例如设置高速缓存、受保护的内存、调度和加载驱动程序。当内核完成系统设置工作,它会在系统文件夹中寻找需要初始化的服务。

android与linux启动的不同点有哪些?

  • Binder:它是android特有的进程间通信机制和远程方法调用系统。
  • ashmem(Android Shared Memory):它是一个新的共享内存分配器,类似于POSIX SHM,但具有不同的行为,并支持更简单的基于文件的API。
  • pmem(Process memory allocator):它用于管理用户空间和内核驱动程序之间共享的大量(1-16+MB)物理上连续的内存区域。
  • logger:这是对logcat命令的内核支持。
  • wakelocks:用于电源管理文件。它使机器在每个事件的基础上保持唤醒,直到唤醒锁被释放。
  • oom handling:当可用内存过低时它会杀死进程。
  • alarm manager:从用户态通知内核唤醒。
  • RAM_CONSOLE:允许将内核printk消息保存到RAM中的缓冲区,以便在内核死机后可以在下一次内核调用中查看它们。
  • 用于ADB的USB小工具驱动程序
  • yaffs2闪存文件系统(作者也不知道这是啥)

4. Init进程

Init是系统的第一个进程,它是所有进程的父进程。它有两个主要任务,

  1. 挂载目录,例如/sys , /dev or /proc。
  2. 运行init.rc脚本

init.rc中语言的规则是特定的,可以在这里查询,community.nxp.com/t5/i-MX-Pro…

在这个过程中,你可以看到android启动画面。

5. Zygote和Dalvik(终于到了这一步)

在java中,每个程序运行在一个单独的内存隔离的虚拟机实例中,每个虚拟机实例都要消耗一部分内存,我们知道android通常是手持设备,内存有限,如果采用同样的策略,虚拟机实例就会消耗掉大量内存。

为了克服内存问题,android中才出现了zygote。zygote实现了跨Dalvik虚拟机的代码共享,实现了更低的内存占用和启动时间。zygote是在系统引导时启动的虚拟机进程。zygote预加载并初始化核心库类。

zygote加载过程如下,

  1. 加载zygote初始化类,aosp/frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
  2. registerZygoteSocket(),为zygote命令通道注册一个套接字服务。
  3. preloadClasses(), 初始化zygote进程,加载并初始化常用类。
  4. preloadResources(),加载可以在进程间共享的资源。

在此过程,你可以看到启动动画。

6. System Service(系统服务)

完成上面的工作后,zygote会fork一个新的进程去启动系统服务。

核心服务如下:

  • Starting power manager
  • Creating the Activity Manager
  • Starting telephony registry
  • Starting package manager
  • Set activity manager service as system process
  • Starting context manager
  • Starting system contact providers
  • Starting battery service
  • Starting alarm manager
  • Starting sensor service
  • Starting window manager
  • Starting Bluetooth service
  • Starting mount service

其它服务如下:

  • Starting status bar service
  • Starting hardware service
  • Starting NetStat service
  • Starting connectivity service
  • Starting Notification Manager
  • Starting DeviceStorageMonitor service
  • Starting Location Manager
  • Starting Search Service
  • Starting Clipboard Service
  • Starting checkin service
  • Starting Wallpaper service
  • Starting Audio Service
  • Starting HeadsetObserver
  • Starting AdbSettingsObserver

现在我们终于完成了引导过程(系统服务在内存中启动并运行)。

如果你还没有掌握Framework,现在想要在最短的时间里吃透它,可以参考一下《Android Framework核心知识点》,里面内容包含了:Init、Zygote、SystemServer、Binder、Handler、AMS、PMS、Launcher……等知识点记录。

《Framework 核心知识点汇总手册》:https://qr18.cn/AQpN4J

Handler 机制实现原理部分:
1.宏观理论分析与Message源码分析
2.MessageQueue的源码分析
3.Looper的源码分析
4.handler的源码分析
5.总结

Binder 原理:
1.学习Binder前必须要了解的知识点
2.ServiceManager中的Binder机制
3.系统服务的注册过程
4.ServiceManager的启动过程
5.系统服务的获取过程
6.Java Binder的初始化
7.Java Binder中系统服务的注册过程

Zygote :

  1. Android系统的启动过程及Zygote的启动过程
  2. 应用进程的启动过程

AMS源码分析 :

  1. Activity生命周期管理
  2. onActivityResult执行过程
  3. AMS中Activity栈管理详解

深入PMS源码:

1.PMS的启动过程和执行流程
2.APK的安装和卸载源码分析
3.PMS中intent-filter的匹配架构

WMS:
1.WMS的诞生
2.WMS的重要成员和Window的添加过程
3.Window的删除过程

《Android Framework学习手册》:https://qr18.cn/AQpN4J

  1. 开机Init 进程
  2. 开机启动 Zygote 进程
  3. 开机启动 SystemServer 进程
  4. Binder 驱动
  5. AMS 的启动过程
  6. PMS 的启动过程
  7. Launcher 的启动过程
  8. Android 四大组件
  9. Android 系统服务 - Input 事件的分发过程
  10. Android 底层渲染 - 屏幕刷新机制源码分析
  11. Android 源码分析实战

猜你喜欢

转载自blog.csdn.net/weixin_61845324/article/details/132460904
今日推荐