Android Framework的启动过程

来源:互联网 发布:正装衬衫 知乎 编辑:程序博客网 时间:2024/05/13 06:08


      

        我们平常如果只是简单的编写安卓App,特别是很多人只是更加单纯的关注View层面的代码编写,那么或许很难去思考或者注意整个安卓系统从最初启动到第一个Activity打开的这么一个过程,但是如果需要对安卓开发有更深入的了解的话,这方面的知识还是必不可少的,知其然且知其所以然,才能更好的控制它,驾驭它,这段时间学习了,一方面想记录下来,另一方面也是分享给有需要的人,废话不多说了。

       

       首先,我们知道安卓底层就是Linux内核,所以当然整个启动是由Linux内核启动开始的,关于Linux系统的启动过程可以参见我的另一篇博客《Linux的启动过程》,在Linux启动的最后,内核会读取init.rc文件,这个文件从字面意思就可以理解里就是定义各种服务程序,内核根据这个文件来启动服务程序,安卓系统相对于Linux内核来说就是一段程序,所以也被声明在init.rc文件中,然后安卓系统的程序就被开始运行了,至此安卓Framework开始运行。


      系统运行的第一个Dalvik虚拟机(关于Dalvik虚拟机,其实他与java虚拟机很相似,负责解释并执行指定的java类,一个进程就是一个Dalvik虚拟机)程序是zygote进程,从字面意义上就可以理解,之后的每一个进程都是从他“孵化”而来。启动zygote进程后虚拟机执行的第一个类ZygoteInit.java,从这个类的main()方法里面入手开始说起,这个类的main()方法启动了一个Socket服务端口,这个端口用来接收启动新进程的命令。


     同时zygote进程还有一个重要的功能就是装载FrameWork共享类以及共享资源,也就是说系统已启动,这些共享类和共享资源(也就是SDK里的大部分类和资源)就已经装载进来了,之后新创建的进程不需要再装载一次了,起到共享的作用。



    接下来zygote会“孵化”出第一个进程SystemServer(就是调用Linux系统的fork来复制当前的进程,启动新进程,即SystemServer可以共享zygote装载的各种资源),而我们所知道的很多的系统服务都在SystemServer这个进程中运行,比如我们熟知的ActivityManagerService,WindowmanagerService等。然后在ServerThread里面启动各个服务。


   从上面我们知道ActivitymanagerService已被启动,接下来说说第一个Activity的启动,在Ams的systemReady()函数内部的最后会发出启动任务队列中最上面一个Activity的消息,但是当系统刚启动时,任务队列中并没有Activity,于是ActivityStack类中将调用startHomeActivityLocked()函数来启动Home Activity,而这个Home Activity是系统发出一个catagory字段包含CATEGORY_HOME的intent,只要哪个activity匹配上就把哪个Activity作为Home启动,所以系统最先启动哪个Activity我们甚至是可以指定的,当然当有多个匹配的时候,系统会跳出提示让你选择。


     至此,第一个Activity就被启动了。


   


      


       


   

       


     

0 0
原创粉丝点击