0°

Android 7.0系统启动流程分析

内容预览:
  • 始发于微信公众号: 程序员小乐 作者:江湖人称小白哥 链接:http://blo...~
  • 此篇干货,版权属于原作者~
  • 部分文章推送时因种种原因未能与原作者联系上,若涉及版权问题,敬请原...~

始发于微信公众号: 程序员小乐

Android 7.0系统启动流程分析

作者:江湖人称小白哥

链接:http://blog.csdn.net/dd864140130/article/details/57624948

上一篇中介绍了

随着版本的升级,aosp项目中的代码也有了些变化,本文基于Android 7.0分析Android系统启动流程.当我们按下电源键后,整个Android设备大体经过了一下过程: 
Android 7.0系统启动流程分析

今天我们只想来分析init进程及其后的过程,也就是下图所示部分: 
Android 7.0系统启动流程分析


init进程

init进程会解析init.rc文件(关于init.rc中的语法,可以参见之前写的),加载相关分区,并启动相关服务.

init进程在/system/core/init/init.cpp 
init.rc文件在/system/core/rootdir下 
init.rc文件由parser.cpp解析,在/system/core/init/init_parser.cpp

在init.rc中,Zygote进程被启动.Zygote进程是其他所有进程的孵化器.init.rc通过include引入init.zygote.rc,这里以init.zygote64.rc为例:

Android 7.0系统启动流程分析

对个脚本简单分析:

  1. service zygote /system/bin/app_process64 :service命令告诉init进程要创建一个名字为zygote的进程,这个zygote进程执行的程序是/system/bin/app_process64,后面是传给app_process64程序的参数.

  2. socket zygote stream 660 root system:表示zygote进程需要一个名为”zygote”的socket,该socket用来实现进程间的通信.当新启动一个应用时,ActivityManagerService想向该Socket发起请求,请求zygote进程fork出一个新的进程.

  3. 后面的onrestart表示zygote重启时需要执行的动作.

Zygote进程启动

上面说到init进程会根据init.rc执行相关的操作,其中有一项就是创建Zygote进程.Zygote进程所对应的程序是/system/bin/app_process, 
位于/frameworks/base/cmds/app_process/app_main.cpp,其入口函数是main():

Android 7.0系统启动流程分析

Android 7.0系统启动流程分析

Android 7.0系统启动流程分析

Android 7.0系统启动流程分析

Android 7.0系统启动流程分析

上述代码总体比较简单,主要是处理相关参数,并创建AppRuntime,由于在init.rc文件中,app_process启动参数被设置为--zygote --start-system-server,因此会执行runtime.start("com.android.internal.os.ZygoteInit", args, zygote),现在我们来看看AppRuntime的具体实现,它同样在 
在/frameworks/base/cmds/app_process/app_main.cpp:

Android 7.0系统启动流程分析

Android 7.0系统启动流程分析

Android 7.0系统启动流程分析

AppRuntime继承AndroidRuntime,而AndroidRuntime位于 
/frameworks/base/core/jni/AndroidRuntime.cpp. 
而start()方法便是定义在AndroidRuntime的虚方法:

Android 7.0系统启动流程分析

Android 7.0系统启动流程分析

Android 7.0系统启动流程分析

在start()方法中主要做三件事情: 
1. 调用startVM()函数启动虚拟机 
2. 调用startReg()注册JNI方法 
3. 调用com.android.internal.os.ZygoteInit.类的main函数.

走进ZygoteInit

关于前两者就不细说了,重点来关注我们熟悉的ZygoteInit.java.它在 
rameworks/base/core/Java/com/android/internal/os/ZygoteInit.java,我们直接来看他的main方法:

Android 7.0系统启动流程分析

Android 7.0系统启动流程分析

Android 7.0系统启动流程分析

这里的main()方法中主要做了三件事情 
1. 通过registerServerSocket()来创建Socket,它将作为服务端用来和作为客户端的ActivityManagerService进行通信 
2. 通过startSystemServer()方法来启动SystemServer 
3. 最后通过通过runSelectLoop方法使得刚才创建的Socket进入无限循环,以等待来自ActivityManagerService请求

Zygote中Socket创建

首先来看resiterServerSocket()它在:

Android 7.0系统启动流程分析

方法主要通过文件描述符创建socket,该文件描述代表/dev/socket/zygote文件,现在看看开头init.rc中的配置:socket zygote stream 660 root system

Zygote启动SystemServer

现在来看startSystemServer()方法:

Android 7.0系统启动流程分析

Android 7.0系统启动流程分析

Android 7.0系统启动流程分析

Android 7.0系统启动流程分析

这里首先通过Zygote.forkSystemServer()创建一个系统服务进程.与该方法相似还有forkAndSpecialize(),用于创建一个普通应用进程.进程创建成功后返回pid为0.由于此处生成的新进程和Zygote进程一模一样,也就是说这个新进程中同样包含了刚才创建的Socket,但是该Socket在此处无效,因此要将其关闭.接下来调用handleSystemServerProcess()处理刚才新建的进程即SystemServer进程,需要注意此时已经工作在SystemServer进程中了:

Android 7.0系统启动流程分析

该函数继续调用RuntimeInit.zygoteInit()进一步执行启动SystemServer组件的操作.继续来看 RuntimeInit.zygoteInit()的具体实现,它在 
/frameworks/base/core/java/com/android/internal/os/RuntimeInit.java文件中:

Android 7.0系统启动流程分析

在该方法中主要调用了三个方法:

  • commonInit():为当前进程的VM设置未捕获异常处理器

  • nativeZygoteInit():Binder驱动初始化,该方法完成后,就可以通过该Binder进行进程通信

  • applicationInit():主要用调用com.android.server.SystemServer类的main()方法

由于commonInit()方法比较简单,在此就不做分析. 
nativeZygoteInit()是一个本地方法,其对应实现在frameworks/base/core/jni/AndroidRuntime.cpp中:

Android 7.0系统启动流程分析

这里的gCurRuntime是AppRuntime的指针,在frameworks/base/core/jni/AndroidRuntime.cpp中定义,并在AndroidRuntime的够赞函数中初始化:

Android 7.0系统启动流程分析

继续来看onZygoteInit():

Android 7.0系统启动流程分析

这里调用ProcessState::startThreadPool()方法启动线程池,这个线程池就是用来和Binder驱动程序进程交互的.(Binder驱动本质就是一个文件,位于/dev/binder),关于线程池具体创建的过程暂不做说明.

现在来看applicationInit():

Android 7.0系统启动流程分析

这里继续调用了invokeStaticMain()进行后续工作:

Android 7.0系统启动流程分析

此时要执行的是com.android.server.SystemServer的中mian()方法.此外真正执行的过程是在Zygote.MethodAndArgsCaller的run()方法中:

Android 7.0系统启动流程分析

MethodAndArgsCaller继承Exception并实现Runnable接口,作为一个异常他被ZygoteInit.main()捕获并处理:

Android 7.0系统启动流程分析

现在SystemServer的main()已经被调用,我们顺着来看一下实现:

Android 7.0系统启动流程分析

Android 7.0系统启动流程分析

在main()方法中调用了run()方法继续启动操作.在run方法中这三个方法非常重要:

  1. startBootstrapServices():启动引导服务,比如AMS,PMS等

  2. startCoreServices():启动核心服务,比如BatteryService等

  3. startOtherServices():启动其他服务,比如NetworkStatsService等.

关于SystemService的具体执行过程,在此不做细解.

Socket循环监听

到目前为止,关于ZygoteServer.registerServerSocket()startSystemServer()的大体流程我们已经弄清除,接下来就是ZygoteServer.runSelectLoop()方法:

Android 7.0系统启动流程分析

Android 7.0系统启动流程分析

该方法非常简单:不断的处理来自客户端AMS的请求,然后交给runOnce().此处可见

到现在为止,整个SystemServer进程的启动流程已经明确看,用一张顺序图大体的表示上述的整个流程: 
Android 7.0系统启动流程分析


总结

  1. 系统启动时init进程会创建Zygote进程,Zygote进程负责后续Android应用框架层的其他进程的创建和启动.

  2. Zygote进程会首先创建一个SystemSever进程,然后由SystemServer负责启动系统关键服务,如ActivityManagerService或者PackageManagerService等.


大家可以可以加群和大牛们(徐宜生、张涛等)一起学习:群二维码如下所示:

  • Android 7.0系统启动流程分析

    如果人满了,可以加我的微信,我拉你进群,我的微信二维码:


  • Android 7.0系统启动流程分析


看完本文有收获?请转发分享给更多人

关注「杨守乐」,提升编程技能

Android 7.0系统启动流程分析

赞助方式如下链接:

http://blog.csdn.net/xiaole0313/article/details/52333666

如果您觉得不错,请别忘了分享到您的朋友圈让更多的人看到!! 您的举手之劳,就是对我最好的支持,非常感谢!

版权声明:【我们尊重原创。此篇干货,版权属于原作者。部分文章推送时因种种原因未能与原作者联系上,若涉及版权问题,敬请原作者联系我们,立即处理。】

本文由吧主分享:http://blog.csdn.net/xiaole0313

推荐文章:


【技术群】279126311 [满]

【技术群】484572225 [未]

如果你有好的文章想和大家分享,欢迎投稿,直接向我投递文章链接即可。投稿邮箱:[email protected]

欢迎扫描关注我们的微信公众号(),不要错过每一篇干货~

一键关注我们微信公众号 

以上就是:Android 7.0系统启动流程分析 的全部内容。

本站部分内容来源于互联网和用户投稿,如有侵权请联系我们删除,谢谢。
Email:[email protected]


0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论