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码农。

posted @ 2017-03-14 17:31  被罚站的树  阅读(666)  评论(0编辑  收藏  举报