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系 ...
随机推荐
- 编写jsp动态网页
默认情况下,jsp网页必须保存在TOMCAT_HOME/webapps 目录下才能被客户请求. JSP网页的主题仍然是html标签,在需要显示动态数据的地方添加<%%>标记,在其中编写合法 ...
- 如何激励用户为你的app评分?
如何激励用户为你的app评分? 2014-04-10 16:21 编辑: suiling 分类:营销推广 来源:CocoaChina 0 7247 应用设计应用评分 招聘信息: IOS兼职 深圳创业 ...
- Python全栈day10(基本数据类型及其常用方法)
一,数字 1,int 将字符串转化成数字 a = '123' b=int(a) b=123 2,以进制方式进行转换 num="a" >>> num = " ...
- CH5101 LCIS【线性dp】
5101 LCIS 0x50「动态规划」例题 描述 熊大妈的奶牛在小沐沐的熏陶下开始研究信息题目.小沐沐先让奶牛研究了最长上升子序列,再让他们研究了最长公共子序列,现在又让他们研究最长公共上升子序列了 ...
- Foj1683矩阵快速幂水题
Foj 1683 纪念SlingShot 题目链接:http://acm.fzu.edu.cn/problem.php?pid=1683 题目:已知 F(n)=3 * F(n-1)+2 * F(n-2 ...
- cocoapod 最新安装使用步骤
cocoapod 最新安装使用步骤 安装 1.sudo gem update (2个-)system :更新你的gem system至最新 2.gem sources (2个-)remove htt ...
- Java/android 里ClassName.this和this的使用
如果在内部类里面用this就是指这个内部类的实例,而如果用OuterClassName.this就是它外面的那个类的实例 ClassName.this这个用法多用于在nested class(内部类) ...
- 隐藏Apache、nginx和PHP的版本号的配置方法
最近提示说有漏洞,暴露apache.nginx和php的版本号.网上搜了下,整理的方法如下: 首先说apache 在http.conf文件里添加下面两行,默认是没有的 ServerSignature ...
- PHP 支持8种基本的数据类型。
四种标量类型:boolean (布尔型):这是最简单的类型,只有两种取值,可以为 TRUE/true 或 FALSE/false ,不区分大小写.详细请查看:PHP布尔类型(boolean)integ ...
- 与python的第一次邂逅
python简介 一.什么是python python是一种面向对象.直译式的计算机程序语言,所以有了武老师的那句名言:一切皆为对象 python的设计哲学是:“优雅”,“明确”,“简单” pytho ...