其他分享
首页 > 其他分享> > Android Zygote 从何而来?揭开Android系统启动的面纱,apk瘦身的实现方式

Android Zygote 从何而来?揭开Android系统启动的面纱,apk瘦身的实现方式

作者:互联网

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启动的不同点有哪些?

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加载过程如下,

《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》

浏览器打开:qq.cn.hn/FTe 免费领取
  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一个新的进程去启动系统服务。

核心服务如下:

标签:初始化,系统启动,zygote,Zygote,内核,进程,Android,android,内存
来源: https://blog.csdn.net/m0_63935374/article/details/121225624