Android底层是linux系统,因而在开机时仍然是运行天字第一号进程inti,读取init.rc来创建第一个Dalvik进程zygote,下面是个Framework启动的整体图 :
简单来说就是:
Android启动过程包含从Linux内核加载到Home应用程序启动的整个过程。整体流程如下:
1. Android是基于Linux内核的系统平台。启动时,首先通过bootloader(系统加载器),加载Linux内核。在Linux加载启动时,与普通的Linux启动过程相同,先初始化内核,然后调用init进程。
例:Linux系统天字第一号进程,在我们眼中吊的飞起的Android系统在LInux中只不过是一个linux的一个应用程序而已,就通过启动一个用户级程序init的方式,完成引导进程。init始终是第一个进程.需要读取一下配置文件
- Init.rc
- Init.marvell.rc
- 然后进入创建zygote(受精卵)
2. Init进程启动zygote:解析配置文件:init.rc(系统配置文件)及initXXX.rc(与硬件平台相关的文件)的内容执行一系列的命令,包括创建mount目录,安装文件系统,设置属性,启动属性服务器,启动Socket服务端口-》加载preload-classes和preload-resources(Framework大部分类及资源)-》fork启动新的进程Zygote(其实是由fork和execv共同创建)。
视图:
3. Zygnote孵化第一个进程SystemServer,SystemServer启动各种系统服务线程。SystemServer进程在Android的运行环境中扮演了"神经中枢"的作用,APK应用中能够直接交互的大部分系统服务都在该进程中运行,常见的比如:
- WindowManagerServer(Wms)
- ActivityManagerSystemService(AmS)
- PackageManagerServer(PmS)等。
这些系统服务都是以一个线程的方式存在于SystemServer进程中。SystemServer的main()函数首先调用的是init1()函数,这是一个native函数,内部会进行一些与Dalvik虚拟机相关的初始化工作。该函数执行完毕后,其内部会调用Java端的init2()函数,该函数首先创建了一个ServerThread对象,该对象是一个线程,然后直接运行该线程,于是,从ServerThread的run()方法内部开始真正启动各种服务线程。
基本上每个服务都有对应的Java类,从编码规范的角度来看,启动这些服务的模式可归类为三种:模式一是指直接使用构造函数构造一个服务,由于大多数服务都对应一个线程,因此,在构造函数内部就会创建一个线程并自动运行。
模式二是指服务类会提供一个getInstance()方法,通过该方法获取该服务对象,这样的好处是保证系统中仅包含一个该服务对象。模式三是指从服务类的main()函数中开始执行。无论以上何种模式,当创建了服务对象后,有时可能还需要调用该服务类的init()或者systemReady()函数以完成该对象的启动
4. 启动Activity
AMS构造Activity对象放入mMainStack队列,则第一个运行的Actviity就是该Activity。
以上介绍了framework启动流程;配合图解分析。想必此篇文章已经让我们熟悉了启动流程。这才刚刚开始,想要成为framework工程师的话,还有许多需要深入系统性学习。比喻他的通信机制、底层服务、系统资源、UI等等。为此我之前收集过一个腾讯高级工程师的学习笔记;《Framework精编内核手册》我之前学习了里面的内容划分很详细,学起来是有路线的。学习过程不迷路,对于新手非常友好。如果正在走framework工程师这条路的我觉得是一个不错的学习资料。
framework这几年在北上广深,岗位是不断增长。对于Android开发而言是个不错的发展方向。薪资也是处于30k左右,当然大部分还是取决于的framework技术层。
机会是留给有能力有技术的人。
网友评论