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就被启动了。
- Android Framework的启动过程
- Android Framework的启动过程
- Framework 的启动过程
- Framework的启动过程
- Framework的启动过程
- Android Framework的启动
- 通过Android启动过程浅析Android Framework
- Android启动过程及FrameWork初始化
- 鸟人的Android揭秘(2)——通过启动过程分析 Android Framework
- Framework启动过程
- Framework启动过程浅析
- Framework Activity启动过程
- Android Framework启动过程(android内核剖析笔记)
- 《Android内核剖析》读书笔记 第9章 Framework的启动过程
- Android的启动过程
- android的启动过程
- android的启动过程
- android的启动过程
- 基于Firebreath的浏览器插件制作
- php 5.3新增的闭包语法介绍function() use() {}
- Git SSH Key 生成步骤
- 静态检测内存泄露Analyze--Value stored to 'dataArr' during its initialization is never read
- LeetCode 39. Combination Sum
- Android Framework的启动过程
- 循环列表设立头指针和尾指针
- C++ 正则表达式的简单实用
- ( ̄︶ ̄)↗ 涨姿势
- C++类中的static数据成员,static成员函数
- putty&TeamViewer
- 几种 angular 循环。。。。
- 搭建一个php框架
- lightoj 1389 - Scarecrow 贪心