Android系统机制
Android系统机制
本文主要介绍Android系统整体运行机制
Linux中的一些概念
uboot加载系统内核到内存,系统内核运行起来的后,会创建第一个用户进程叫init进程,该进程是所有用户进程的始祖进程。该进程的作用就是要么派生新的用户进程,要么回收那些孤儿进程
Android中的进程
Android系统构建在linux系统之上,所以Android系统中的进程全是用户进程。但是Android对于进程的管理并没有完全依赖于linux,它里面也有一个始祖进程zygote进程,Android中所有进程都是由该进程派生出来的。当然,该进程是由init进程派生出来的。
三大进程
zygote:Android所有进程的始祖,Android中所有的进程都是由它创建(fork)的,这点很重要
SystemServer:android中的系统级服务进程,我们把它可以看作一个服务器,为其他进程提供服务的。它能提供的服务有ActivityManagerService服务,PackageManagerService服务、WindowManagerService服务等。这些服务我们不知道也没关系,反正知道访问它可以获得一些服务就好。
App进程:当每个App运行时,系统都为其创建一个进程,这样一旦一个APP挂了都不会影响其它进程的运行
三大进程的通信
App与SystemServer通过Binder进行IPC通信,SystemServer与zygote通过Socket进行IPC通信
Launcher
在安卓系统中,当我们没有启动任何应用程序时,其实有这么一个应用程序一直在运行。正由于这个应用程序的存在,我们才可以和手机进行交互。这个应用程序就桌面应用程序---Launcher。其它应用程序安装后,会在Launcher界面上出现一个图标,点击这个图标后,Launcher就会将该应用程序启动起来。既然Andoroid中所有进程的始祖都是zygote,那么我们可以认为所有的APP始祖都是Launcher了。
下面是Launcher中的部分代码,我们把其中的onClick方法提取出来(Launcher代码位于android源码包中src/com/android/launcher2/Launcher.java)
/**
* Default launcher application.
*/
public final class Launcher extends Activity
implements View.OnClickListener, OnLongClickListener, LauncherModel.Callbacks, AllAppsView.Watcher {
......
/**
* Launches the intent referred by the clicked shortcut.
*
* @param v The view representing the clicked shortcut.
*/
public void onClick(View v) {
Object tag = v.getTag();
if (tag instanceof ShortcutInfo) {
// Open shortcut
final Intent intent = ((ShortcutInfo) tag).intent;
int[] pos = new int[2];
v.getLocationOnScreen(pos);
intent.setSourceBounds(new Rect(pos[0], pos[1],
pos[0] + v.getWidth(), pos[1] + v.getHeight()));
startActivitySafely(intent, tag);
} else if (tag instanceof FolderInfo) {
......
} else if (v == mHandleView) {
......
}
}
void startActivitySafely(Intent intent, Object tag) {
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
try {
startActivity(intent);
} catch (ActivityNotFoundException e) {
......
} catch (SecurityException e) {
......
}
}
......
}
首先我们看到Launcher是Activity的子类,所以Launcher本质上也是一个Activity。当用户点击手机桌面上的应用图标后 Launcher会调用去onClick 方法,在该方法中会根据图标来产生一个 intent对象,然后通过调用startActivitySafely方法来启动该意图。在 startActivitySafely中我们看到为意图添加了FLAG_ ACTIVITY_ NEW_TASK属性(关于Intent的属性解释请见http://www.cnblogs.com/xiaoQLu/archive/2012/07/17/2595294.html)。然后调用startActivity方法来启动该意图。而这个意图对象是与我们应用中的那个被MAIN标记的Activity绑定的,这就是为什么我们一点桌面的图标出现应用界面的原因了。
App的启动
从上面可以看出启动一个App其实就是调用startActivity方法而已。但是真的有这么简单吗?我们前面说了,每个App必须运行在自己的进程中,那么起码得创建一个进程吧。App的启动流程基本如下:
- Launcher通过Binder进程间通信机制通知ActivityManagerService,它要启动一个Activity。
- AMS让Launcher进入Paused状态
- Launcher告诉AMS进入Paused,AMS会通过Zygote进程来创建一个新的进程,这个进程会加载ActivityThread类,并执行其main方法(可以简答的理解为执行java ActivityThread命令)
- ActivityThread会将一个ApplicationThread类型Binder对象传递给AMS,以便以后可以通过该对象与AMS进行通信,然后ActivityThread进入loop循环。
- AMS会告知ActivityThread一切就绪了,那么Activity可以启动了。
这里的AMS我们称为Activity大管家,系统中所有的Activity都归他管理。但是大管家一般不干实事,它光指挥。ActivityThread就是我们所说的UI线程了,这也是主线程,毕竟人家运行的main方法,ActivityThread是与AMS交互来共同管理Activity生命周期的。但是对于Activity生命周期方法调用不是由ActivityThread完成的,而是由Instrumentation完成的。每个Activity都持有Instrumentation对象的一个引用,但是整个进程只会存在一个Instrumentation对象。三者的关系现在很明了了,AMS老板,ActivityThread组长,Instrumentation码农。
Android系统机制的更多相关文章
- Android系统机制解析-公共服务
创建一个公共服务类后有两种使用方式,第一种将公共服务放到自己的项目中执行,这样外界无法訪问和控制这个公共服务类.这个服务的全部变量.函数都在自己的项目中执行.能够直接通过startIntent(Ser ...
- 【Android 系统开发】 Android 系统启动流程简介
作者 : 万境绝尘 (octopus_truth@163.com) 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/3889548 ...
- Android系统Surface机制的SurfaceFlinger服务渲染应用程序UI的过程分析
参考:Android系统Surface机制的SurfaceFlinger服务渲染应用程序UI的过程分析 一句话概括一下Android应用程序显示的过程:Android应用程序调用SurfaceFlin ...
- Android系统中的广播(Broadcast)机制简要介绍和学习计划
在Android系统中,广播(Broadcast)是在组件之间传播数据(Intent)的一种机制:这些组件甚至是可以位于不同的进程中,这样它就像Binder机制一样,起到进程间通信的作用:本文通过一个 ...
- [转]Android系统Surface机制的SurfaceFlinger服务简要介绍和学习计划
转自:Android系统Surface机制的SurfaceFlinger服务简要介绍和学习计划 前面我们从Android应用程序与SurfaceFlinger服务的关系出发,从侧面简单学习了Surfa ...
- 理解Android系统的进程间通信原理(二)----RPC机制
理解Android系统中的轻量级解决方案RPC的原理,需要先回顾一下JAVA中的RMI(Remote Method Invocation)这个易于使用的纯JAVA方案(用来实现分布式应用).有关RMI ...
- Android系统进程间通信Binder机制在应用程序框架层的Java接口源代码分析
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6642463 在前面几篇文章中,我们详细介绍了A ...
- Android系统进程间通信(IPC)机制Binder中的Client获得Server远程接口过程源代码分析
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6633311 在上一篇文章中,我 们分析了And ...
- Android系统进程间通信(IPC)机制Binder中的Server启动过程源代码分析
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6629298 在前面一篇文章浅谈Android系 ...
随机推荐
- 学习《深入理解C#》—— 数据类型、排序和过滤 (第一章1.1---1.2)
引言 在开始看这本书之前看过一些技术博客,填补自己对于一些知识点的不足.无意中发现了<深入理解C#>这本书,本书主要探讨C# 2.C# 3和C# 4的细节与特性,所以做了一下阅读笔记,欢迎 ...
- Android设计模式之单例模式的七种写法
一 单例模式介绍及它的使用场景 单例模式是应用最广的模式,也是我最先知道的一种设计模式.在深入了解单例模式之前.每当遇到如:getInstance()这样的创建实例的代码时,我都会把它当做一种单例模式 ...
- ASp.Net控件的生命周期
服务端事件 页面生命周期 描述 Init Initialization 初始化控件树 LoadViewState Unpack ViewState 从ViewState里提取出状态信息 LoadCon ...
- 利用hugo生成静态站点
动机 使用Markdown撰写博客,并以静态页面形式发布. 选择hugo 现在jekyll似乎更加流行,但是jekyll是基于Ruby的,在windows下安装很繁琐. 而hugo是用go写的,win ...
- python 绘制3D散点图
import scipy.io as sio from mpl_toolkits.mplot3d import Axes3D import matplotlib.pyplot as plt a = [ ...
- null array mysqli_fetch_assoc ( mysqli_result $result ) void mysqli_free_result ( mysqli_result $result )
w取最大db_id. if($row=null){ var_dump(123); } var_dump($row); if($rowb=array('ww','w123')){ var_dump(23 ...
- find-if-an-item-is-in-a-javascript-array
http://stackoverflow.com/questions/143847/best-way-to-find-if-an-item-is-in-a-javascript-array Best ...
- 第六周小组作业 软件测试与评估:百词斩VS扇贝单词
被测产品说明: A:百词斩 B:扇贝单词 一.基本任务 1.测试进度表 | 项目 | 内容说明 | 预估耗时(分钟) | 实际耗时 (分钟) | | -------------- | -------- ...
- 十个技巧迅速提升JQuery性能
本文提供即刻提升你的脚本性能的十个步骤.不用担心,这并不是什么高深的技巧.人人皆可运用!这些技巧包括: 使用最新版本 合并.最小化脚本 用for替代each 用ID替代class选择器 给选择器指定前 ...
- 安装canal
一.安装前准备 配置Mysql: [mysqld] log-bin=mysql-bin #添加这一行就ok binlog-format=ROW #选择row模式 server_id=1 #配置mysq ...