1.打开电源 引导芯片代码加载引导程序Boot Loader到RAM中去执行
2.BootLoader把操作系统拉起来
3.Linux 内核启动开始系统设置,找到一个init.rc文件启动初始化进程
4.init进程初始化和启动属性服务,之后开启Zygote进程
5.Zygote开始创建JVM并注册JNI方法,开启SystemServer
6.启动Binder线程沲和SystemServiceManager,并启动各种服务
7.AMS启动Launcher
1. 安卓启动大致如下图所示:
2. BootLoader
从系统的角度上来讲,Android系统的启动过程可以分为 bootloader 引导,装载和启动 linux内核 启动Android系统
bootloader 相当于电脑上的Bios 他的主要作用就是初始化基本的硬件设备,建立内存空间映射, 为装载linux内核准备好运行环境,当linux内核加载完毕之后,bootloder就会从内存中清除
对于FastBoot和Recover估计好多童鞋都不理解,fastboot是Android设计的一套通过usb来更新手机分区的映像协议,不过大部分厂商都搞掉了 google的nexus 上应该有的
Recovery模式是Android特有的升级系统,通过这个可以进行手机恢复出厂设置,或执行OTA,补丁和固件升级,实质是启动了一个文本模式的Linux。
bootloader启动后会向内存中装载boot.img镜像文件,这个镜像文件存放的是linux内核和一个根文件系统,linux内核进行初始化之后,装载完文件系统,就启动了init进程。
3.首先Bootloader引导程序启动完Linux内核后,会加载各种驱动和数据结构,当有了驱动以后,开始启动Android系统,同时会加载用户级别的第一个进程init(system\core\init.c),该进程会首先加载一个init.rc配置文件
4.init.rc配置文件会进行很多的配置,创建很多的文件夹及文件,然后初始化一些Android驱动器,之后该配置文件最重要的一个任务就是启动一个Zygote(孵化器)进程,此进程是Android系统的一个母进程,用来启动Android的其他服务进程,代码:
5. Zygote会执行一个app_process可执行文件,在这个文件中首先添加了Android运行时环境,在Android运行时中调用了ZygoteInit类,这就从c++代码跳到了java代码。
5.1 进入AppRuntime.start。因为AppRuntime继承AndroidRuntime.所以会dai调用到AndroidRuntime.start方法start方法具体所做的事,注册一系列本地函数到虚拟机,通过反射机制找到ZygoteInit.main方法并执行。
6.在ZygoteInit.java代码中首先设置了Java虚拟机的堆内存空间,然后启动一个类加载器加载Android启动依赖的类比如Activity等四大组件,dialog等UI的类,然后分出一个子进程启动SystemServer系统服务
ZygoteInit.main方法主要做四件事:注册1.soceket,2.预加载资源,3.启动SystemServer进程,经过层层调用,最终会调用到SystemServer.main方法。4进入runSelectLoop循环处理事件。
7. 在SystemServer.main
8. SystemServer.run
9. startBootstrapServices方法里主要去启动AMS
10. startOtherServices会调用ActivityManagerService.systemReady方法。
11. 在ActivityManagerService的systemReady方法中打开Android系统的第一个Activity
public void systemReady(final Runnable goingCallback) {
// 打开第一个Activity
mMainStack.resumeTopActivityLocked(null);
}
}
12.ActivityStack的resumeTopActivityLocked方法启动home界面
final boolean resumeTopActivityLocked(ActivityRecord prev) {
// Find the first activity that is not finishing.
// 没有已经打开的Activity, next为 null
ActivityRecord next = topRunningActivityLocked(null);
// Remember how we'll process this pause/resume situation, and ensure
// that the state is reset however we wind up proceeding.
final boolean userLeaving = mUserLeaving;
mUserLeaving = false;
if (next == null) {
// There are no more activities! Let's just start up the
// Launcher...
if (mMainStack) {
// 启动lucher应用的锁屏界面
return mService.startHomeActivityLocked();
}
}
13.打开了Luncher应用的Home界面之后,到此Android系统启动完成了。
原文:https://blog.csdn.net/kai_zone/article/details/80472495