Android启动流程:上电到启动第一个APP的详细流程

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. 安卓启动大致如下图所示:


Android启动流程:上电到启动第一个APP的详细流程_第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

你可能感兴趣的:(Android启动流程:上电到启动第一个APP的详细流程)