Android Framework的启动过程
2016-04-13 12:16
411 查看
我们平常如果只是简单的编写安卓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就被启动了。
首先,我们知道安卓底层就是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就被启动了。
相关文章推荐
- Android布局优化之ViewStub、include、merge使用与源码分析
- 山东省第二届ACM大学生程序设计竞赛:The Android University ACM Team Selection Contest
- java中的反射机制在Android开发中的用处
- 我们也说说Android.mk(5) - 案例教程
- Android stdio Ndk HelloWorld
- Android API 中文(14) —— ViewStub
- 安卓开发培训(3.1 文件读写)
- android 自定义环形进度条,渐变色
- android asmack 注册 登陆 聊天 多人聊天室 文件传输
- Android数据库框架GreenDao封装使用,易理解、易扩展
- Android Design Support Library使用详解
- RecyclerView初探
- 【转】Android Fragment 真正的完全解析(上)
- Android Studio项目目录结构介绍
- 安卓刷第三方Rom
- Android 5.0 Camera2新接口
- Android 进程与线程基础知识 及 如何停止进程
- Android编程实现向SD卡写入数据的方法
- Android Retrofit 2.0框架上传图片解决方案
- Android 屏幕适配方案