Android的开机启动流程

Android的开机启动流程,第1张

概述1、Android的开机启动流程Android的层次框架图,如下所示:图片清晰地展示了Android的五层架构,从上到下依次是:应用层、应用框架层、库层、运行时层以及Linux内核层。Android的启动流程是自下向上的,大体上可以分为三个阶段:1、BootLoader引导启动内核;2、启动Linux内核;3、启动Android

1、AndroID的开机启动流程

AndroID的层次框架图,如下所示:

图片清晰地展示了AndroID的五层架构,从上到下依次是:应用层、应用框架层、库层、运行时层以及linux内核层。AndroID的启动流程是自下向上的,大体上可以分为三个阶段:1、BootLoader引导启动内核;2、启动linux内核;3、启动AndroID系统。

AndroID的启动流程如下所示:

接下来具体地描述一下启动过程:

Step 1. Boot Rom

当长按电源开机的时候,引导芯片开始从固化在ROM的预设代码开始执行,然后将加载引导程序到RAM中。

 

Step 2. BootLoader

BootLoader又称为引导程序,它在运行 *** 作系统之前运行的一段程序,是运行的第一个程序。主要的功能有检查RAM、初始化一些硬件外设等功能,它最终的目的是启动 *** 作系统。

文件的路径为:

/bootable/bootloader/

BootLoader的最主要功能是将 *** 作系统进行启动,把 *** 作系统的镜像文件拷贝到RAM中去,然后跳转到它的入口处去执行,我们称之为启动加载模式,该过程没有用户的介入,是它正常的工作模式,其步骤如下:

Stage 1:

(1)硬件初始化,为Stage 2的执行以及随后内核的运行准备好基本的硬件环境;

(2)为加载Stage 2准备RAM空间,为了获得更好的执行速度,通常把Stage 2加载到RAM中执行;

(3)复制Stage 2的代码到RAM中;

(4)设置好堆栈;

(5)跳转到Stage 2的C程序入口。

Stage 2:

(1)初始化本阶段要使用的硬件设备;

(2)检测系统内存映射;

(3)将内核镜像和根文件系统从ROM读到RAM中;

(4)为内核设置好启动参数;

(5)启动内核。

 

Step 3. 初始化Kernel

接着就开始进入C语言编写的结构无关的代码了,这个入口的函数是start_kernel函数,该函数完成了内核的大部分初始化工作,实际上,可以将start_kernel函数看作是内核的main函数。start_kernel函数执行到最后调用了rest_init函数进行后续的初始化,该函数的最主要任务就是启动内核线程kernel_init。kernel_init函数将完成设备驱动程序的初始化,并调用init_post函数启动用户空间的init进程,到init_post函数为止,内核的初始化已经基本完成。

文件路径:

/kernel/init/main.c

 

Step 4. init进程

当初始化内核之后,就会启动一个相当重要的祖先进程,也就是init进程,在linux系统中,所有的进程都是由init进程直接或间接fork出来的。init进程负责创建系统中最关键的几个子进程,尤其是Zygote进程,另外,它还提供了property service,类似于windows系统的注册表服务。

在AndroID系统中,会有一个init.rc脚本,init进程一旦启动就会读取并解析这个脚本文件,把其中的元素整理成自己的数据结构(链表)。

文件路径:

/system/core/init/init.c/system/core/rootdir/init.rc/system/core/init/readme.txt

 

Step 5. Zygote进程

当init进程创建之后,会fork出一个Zygote进程,这个进程是所有Java进程的父进程。我们知道,linux是基于C的,而AndroID是基于Java的(底层也是C),所有这里就会fork出一个Zygote Java进程用来fork出其它的进程。在Zygote开启的时候,会调用ZygoteInit.main()进行初始化。

接下来,看一段ZygoteInit.main()的源码:

public static voID main(String argv[]) {......    // 加载zygote的时候,会传入参数,startSystemServer变为true     boolean startSystemServer = false;     for (int i = 1; i < argv.length; i++) {                if ("start-system-server".equals(argv[i])) {                    startSystemServer = true;                } else if (argv[i].startsWith(ABI_List_ARG)) {                    abiList = argv[i].substring(ABI_List_ARG.length());                } else if (argv[i].startsWith(SOCKET_name_ARG)) {                    socketname = argv[i].substring(SOCKET_name_ARG.length());                } else {                    throw new RuntimeException("UnkNown command line argument: " + argv[i]);                }            }......         // 启动的SystemServer进程     if (startSystemServer) {                startSystemServer(abiList, socketname);         }......}

源码的文件路径:

/framework/base/core/java/com/androID/internal/os/ZygoteInit.java

 

Step 6. SystemServer进程

前面的ZygoteInit.java文件中,通过startSystemServer()函数fork出了SystemServer进程,这个进程在整个AndroID系统中非常重要,它和Zygote进程一样,是AndroID Framework层的两大重要进程。系统里面的服务都是在这个进程里面开启的,例如AWS、windowsManager等都是由这个SystemServer进程fork出来的。

在下面的代码中,可以看到服务如何开启并具体开启了哪些服务:

public final class SystemServer {    // The main entry point from zygote.    public static voID main(String[] args) {        new SystemServer().run();    }    public SystemServer() {        // Check for factory test mode.        mFactoryTestMode = FactoryTest.getMode();    }    private voID run() {......        // 初始化原生服务库        System.loadlibrary("androID_servers");        nativeInit();        // 初始化系统上下文        createSystemContext();        // 创建SystemServiceManager对象        mSystemServiceManager = new SystemServiceManager(mSystemContext);        // 开启服务        try {            startbootstrapServices();            startCoreServices();            startOtherServices();        } catch (Throwable ex) {            Slog.e("System", "******************************************");            Slog.e("System", "************ Failure starting system services", ex);            throw ex;        }                ......        // Loop forever.        Looper.loop();        throw new RuntimeException("Main thread loop unexpectedly exited");    }    //初始化系统上下文对象mSystemContext,并设置默认的主题。    private voID createSystemContext() {        ActivityThread activityThread = ActivityThread.systemMain();        mSystemContext = activityThread.getSystemContext();        mSystemContext.settheme(androID.R.style.theme_DeviceDefault_light_DarkActionbar);    }    //在这里开启了几个核心的服务,因为这些服务之间相互依赖,所以都放在了这个方法里面。    private voID startbootstrapServices() {    ......            //初始化ActivityManagerService        mActivityManagerService = mSystemServiceManager              .startService(ActivityManagerService.lifecycle.class).getService();        mActivityManagerService.setSystemServiceManager(mSystemServiceManager);        //初始化PowerManagerService,因为其他服务需要依赖这个Service,因此需要尽快的初始化        mPowerManagerService = mSystemServiceManager              .startService(PowerManagerService.class);        // 现在电源管理已经开启,ActivityManagerService负责电源管理功能        mActivityManagerService.initPowerManagement();        // 开启displayManagerService        mdisplayManagerService = mSystemServiceManager              .startService(displayManagerService.class);        // 开启PackageManagerService        mPackageManagerService = PackageManagerService.main(mSystemContext,mInstaller,              mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore);......    }    private voID startCoreServices() {...}// 启动一些基本服务。        private voID startOtherServices() {...}// 启动其他服务。}

源文件文件路径:

/framework/base/core/java/com/androID/server/SystemServer.java

 

Step 7. Home Activity

 在上面的ActivityManagerService开启之后,会调用finishBooting()函数,完成引导过程,同时发送开机广播"ACTION_BOOT_COMPLETED"。

下面是finishBooting()源码:

final voID finishBooting() {......    final int userID = mStartedUsers.keyAt(i);    Intent intent = new Intent(Intent.ACTION_BOOT_COMPLETED, null);    intent.putExtra(Intent.EXTRA_USER_HANDLE, userID);    intent.addFlags(Intent.FLAG_RECEIVER_NO_ABORT);    broadcastIntentLocked(...);......}

文件路径:

/frameworks/base/services/java/com/androID/server/am/ActivityManagerService.java

之后就会开启系统的主程序-Launcher程序,完成系统界面的加载与显示。

 

文章转载之:

https://www.jianshu.com/p/45cf56172d22

 

总结

以上是内存溢出为你收集整理的Android的开机启动流程全部内容,希望文章能够帮你解决Android的开机启动流程所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1083880.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存