导语:对于Android操作系统的初学者来说,引导过程,只不过是终端用户的一些花哨的图像和动画。但当你阅读完这篇文章后,你可能会打破原来对引导过程的狭隘思维。

u=367768547,3531904601&fm=26&gp=0.jpg

大多数智能手机用户使用的Android操作系统的功能和操作过程都比较复杂。

11.jpg

对于Android操作系统的初学者来说,引导过程,只不过是终端用户的一些花哨的图像和动画。但当你阅读完这篇文章后,你可能会打破原来对引导过程的狭隘思维。

基本核心过程

引导ROM >引导加载程序 >内核 > init过程> Zygote > Dalvik V M >系统服务器 >管理器

该过程是Android启动的核心过程,下面让我来详细介绍每一步及其并行操作(如果有的话)。

引导ROM

一旦Android操作系统开始运行,就会执行负责“Boot ROM”部分的代码。起始代码恰好是预定义的硬编码位置,代码将引导加载程序加载到RAM中并开始执行。

引导程序

虽然引导程序只是Android系统的一小部分,但却非常重要。你可能已经听说过OEM或制造商放置的某些限制和规则,而引导程序正是存储所有这些“规则”的地方。一开始提到的“引导加载程序”的过程其实包括两个阶段:

第一阶段:检测RAM。引导加载程序检测RAM并执行启动第二步所需的应用程序。

第二步:设置。引导加载程序现在继续设置网络、低级内存管理和安全选项。

222.jpg

这一步对于执行内核至关重要。位于/ bootable / bootloader / legacy / usbloader的引导加载程序包含两个非常重要的文件,即init.s和main.c。

init.s文件基本上负责的是初始化栈, 0和BSS段,然后继续在main.c.中初始化call_main()。 main.c文件在并行创建Linux标签的同时初始化硬件,特别是时间,控制台和键盘。

内核

Android内核的初始化过程模仿的是Linux内核的初始化,当内核执行时,它将高速缓存,受保护的内存设置为不同的加载驱动程序。当完成所有设置和调度驱动程序后,内核会在系统文件中查找init。

初始化过程

init过程是相当重要的一步,这一步,不仅会安装/ sys和/ dev等目录或分区,还会启动init.rc脚本。 init进程位于/ init,而init.rc脚本位于/ rootdir。

emile-perron-190221.jpg

Zygote和Dalvik VM 

Zygote是一个VM进程,会在系统启动时启动。它可以实现Dalvik VM的代码共享,从而有助于把启动时间降至最低。 Zygote还确保更低的内存占用,使Dalvik VM不会消耗大量内存。此外,它还会初始化核心库类。

Zygote加载过程的框架看起来与开头概述的框架完全相同:

加载Zygote init类 > registerZygoteSocket() > preloadClasses() > preloadResources() >用户看到启动的动画

系统服务器

在这一步,Zygote会要求一个新的过程,这样以下的过程才会启动,处理和执行。

启动电源管理器 >创建活动管理器 >启动电话注册表 >启动包管理器 >将活动管理器服务设置为系统进程 >启动上下文管理器 >启动系统联系人 >启动电池服务 >启动警报管理 >启动 >传感器服务 >启动窗口管理器 >启动蓝牙服务 >启动安装服务 >启动状态栏服务 >启动硬件服务 >启动NetStat服务 >启动连接服务 >启动通知管理器 >启动DeviceStorageMonitor服务 >启动位置管理器 >启动搜索服务 >启动剪贴板服务 >启动检查服务 >启动墙纸服务 >启动音频服务 >启动HeadsetObserver >启动AdbSettingsObserver >呈现到用户眼前

分析

现在,启动就已经全部完成,与此同时服务已启动并运行,这时,你可能需要了解创建日志的一些方法。

使用adb logca从启动过程获取日志,你可以按照相应顺序输入以下命令:

adb logcat –d –b events | grep “boot”
adb logcat –d | grep preload```

源链接

Hacking more

...