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

  • 相关阅读:
    获取请求IP
    Excel导入工具类兼容xls和xlsx
    Openshift 4.3环境的离线Operatorhub安装
    RHEL学习
    OpenShift Service Mesh 培训作业
    OpenId Connect认证配置
    Route Sharding in OpenShift 4.3
    OpenShift 4.3环境中创建基于Go的Operator
    Quay和Clair的集成
    Quay 基础版安装和部署
  • 原文地址:https://www.cnblogs.com/xidongyu/p/6549672.html
Copyright © 2020-2023  润新知