Android知识巩固—android9.0系统启动流程

  1. 首先Bootloader引导程序启动完Linux内核后,会加载各种驱动和数据结构,当有了驱动以后,开始启动Android系统,同时会加载用户级别的第一个进程init(system\core\init.c),该进程会首先加载一个init.rc配置文件
    Android知识巩固—android9.0系统启动流程_第1张图片
    Android知识巩固—android9.0系统启动流程_第2张图片

  2. init.rc配置文件会进行很多的配置,创建很多的文件夹及文件,然后初始化一些Android驱动器,之后该配置文件最重要的一个任务就是启动一个Zygote(孵化器)进程,此进程是Android系统的一个母进程,用来启动Android的其他服务进程。
    Android知识巩固—android9.0系统启动流程_第3张图片
    Android知识巩固—android9.0系统启动流程_第4张图片

  3. 通过上面我们知道Zygote进程要执行的程序便是app_process64了,它位于frameworks/base/cmds/app_process/app_main.cpp文件中,入口函数是main,利用AndroidRuntime(android/frameworks/base/core/jni/AndroidRuntime.cpp)启动Zygote
    Android知识巩固—android9.0系统启动流程_第5张图片
    Android知识巩固—android9.0系统启动流程_第6张图片

  4. runtime.start函数中做了三件事,一是调用函数startVM启动虚拟机,二是调用函数startReg注册JNI方法,三是调用了com.android.internal.os.ZygoteInit类的main函数,在ZygoteInit.java(frameworks/base/core/java/com/android/internal/os/ZygoteInit.java)这里初始化了GC、调用preload加载资源、registerZygoteSocket、启动SystemServer
    Android知识巩固—android9.0系统启动流程_第7张图片

  5. startSystemServer()会通过Zygote.forkSystemServer()函数来创建一个新的进程来启动SystemServer(android/frameworks/base/services/java/com/android/server/SystemServer.java)组件,返回值pid等0的地方就是新的进程要执行的路径。:
    Android知识巩固—android9.0系统启动流程_第8张图片
    Android知识巩固—android9.0系统启动流程_第9张图片

  6. 在SystemServer(android/frameworks/base/services/java/com/android/server/SystemServer.java)中主要做了5件事:1、初始化设置一些系统属性;2、准备MainLooper;3、初始化system context对象;4、创建system service manager;5、调用startBootstrapServices(),startCoreServices(),startOtherServices()。
    (a) startBootstrapServices():启动引导服务,比如AMS,PMS等。
    (b)startCoreServices():启动核心服务,比如BatteryService等。
    (c)startOtherServices():启动其他服务,比如NetworkStatsService等。

    Android知识巩固—android9.0系统启动流程_第10张图片

  7. 在启动AMS之前,调用了createSystemContext()函数,,ActivityThread的systemMain函数中,除了进行是否开启硬件渲染的判断外,主要作用是创建出ActivityThread对象,然后调用该对象的attach函数。ActivityThread是android Framework中一个非常重要的类,它代表一个应用进程的主线程,其职责就是调度及执行在该线程中运行的四大组件。
    在Android中,应用进程指那些运行APK的进程,它们由zygote fork出来,其中运行着独立的dalvik虚拟机。 与应用进程相对的就是系统进程,例如zygote和SystemServer。注意到此处的ActivityThread创建于SystemServer进程中。 由于SystemServer中也运行着一些系统APK,例如framework-res.apk、SettingsProvider.apk等,因此也可以认为SystemServer是一个特殊的应用进程。

    Android知识巩固—android9.0系统启动流程_第11张图片
    Android知识巩固—android9.0系统启动流程_第12张图片

  8. 对于系统进程而言,ActivityThread的attach函数最重要的工作就是创建了Instrumentation、Application和Context
    Android知识巩固—android9.0系统启动流程_第13张图片

  9. Instrumentation是Android中的一个工具类,当该类被启用时,它将优先于应用中其它的类被初始化。
    此时,系统先创建它,再通过它创建其它组件。此外,系统和应用组件之间的交互也将通过Instrumentation来传递。
    因此,Instrumentation就能监控系统和组件的交互情况了。实际使用时,可以创建该类的派生类进行相应的操作。
    这个类在介绍启动Activity的过程时还会碰到。

  10. Context是Android中的一个抽象类,用于维护应用运行环境的全局信息。 通过Context可以访问应用的资源和类,甚至进行系统级的操作,例如启动Activity、发送广播等。

  11. Android中Application类用于保存应用的全局状态。

  12. 创建完Android运行环境后,SystemServer调用startBootstrapServices,其中就创建并启动了AMS(/android/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java)。
    Android知识巩固—android9.0系统启动流程_第14张图片
    Android知识巩固—android9.0系统启动流程_第15张图片

  13. AMS完成启动后,在SystemServer的startBootstrapServices函数中, 下一个与AMS相关的重要调用就是AMS.setSystemProcess。
    Android知识巩固—android9.0系统启动流程_第16张图片

  14. 接下来,我们看看AMS启动的最后一部分:systemReady,该函数在SystemServer中startOtherServices的最后被调用:
    Android知识巩固—android9.0系统启动流程_第17张图片

  15. AMS启动Home Activity
    Android知识巩固—android9.0系统启动流程_第18张图片
    Android知识巩固—android9.0系统启动流程_第19张图片

你可能感兴趣的:(Android随笔)