Android应用程序进程启动过程的源代码分析(一)

移动开发 Android
Android应用程序框架层创建的应用程序进程具有两个特点,一是进程的入口函数是ActivityThread.main,二是进程天然支持 Binder进程间通信机制;这两个特点都是在进程的初始化过程中实现的,本文将详细分析Android应用程序进程创建过程中是如何实现这两个特点的。

Android应用程序框架层创建的应用程序进程具有两个特点,一是进程的入口函数是ActivityThread.main,二是进程天然支持 Binder进程间通信机制;这两个特点都是在进程的初始化过程中实现的,本文将详细分析Android应用程序进程创建过程中是如何实现这两个特点的。

Android应用程序框架层创建的应用程序进程的入口函数是ActivityThread.main比较好理解,即进程创建完成之 后,Android应用程序框架层就会在这个进程中将ActivityThread类加载进来,然后执行它的main函数,这个main函数就是进程执行 消息循环的地方了。Android应用程序框架层创建的应用程序进程天然支持Binder进程间通信机制这个特点应该怎么样理解呢?前面我们在学习 Android系统的Binder进程间通信机制时说到,它具有四个组件,分别是驱动程序、守护进程、Client以及Server,其中Server组 件在初始化时必须进入一个循环中不断地与Binder驱动程序进行到交互,以便获得Client组件发送的请求,具体可参考Android系统进程间通信 (IPC)机制Binder中的Server启动过程源代码分析一文,但是,当我们在Android应用程序中实现Server组件的时候,我们并没有让 进程进入一个循环中去等待Client组件的请求,然而,当Client组件得到这个Server组件的远程接口时,却可以顺利地和Server组件进行 进程间通信,这就是因为Android应用程序进程在创建的时候就已经启动了一个线程池来支持Server组件和Binder驱动程序之间的交互了,这 样,极大地方便了在Android应用程序中创建Server组件。

在Android应用程序框架层中,是由ActivityManagerService组件负责为Android应用程序创建新的进程的,它本来也是 运行在一个独立的进程之中,不过这个进程是在系统启动的过程中创建的。ActivityManagerService组件一般会在什么情况下会为应用程序 创建一个新的进程呢?当系统决定要在一个新的进程中启动一个Activity或者Service时,它就会创建一个新的进程了,然后在这个新的进程中启动 这个Activity或者Service,具体可以参考Android系统在新进程中启动自定义服务过程(startService)的原理分析、 Android应用程序启动过程源代码分析和Android应用程序在新的进程中启动新的Activity的方法和过程分析这三篇文章。

ActivityManagerService启动新的进程是从其成员函数startProcessLocked开始的,在深入分析这个过程之前,我们先来看一下进程创建过程的序列图,然后再详细分析每一个步骤。

Step 1. ActivityManagerService.startProcessLocked

这个函数定义在frameworks/base/services/java/com/android/server/am/ActivityManagerService.java文件中:

  1. [java] view plaincopypublic final class ActivityManagerService extends 
  2. ActivityManagerNative 
  3.   implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback { 
  4.   ...... 
  5.   private final void startProcessLocked(ProcessRecord app, 
  6.   String hostingType, String hostingNameStr) { 
  7.   ...... 
  8.   try { 
  9.   int uid = app.info.uid; 
  10.   int[] gids = null
  11.   try { 
  12.   gids = mContext.getPackageManager().getPackageGids( 
  13.   app.info.packageName); 
  14.   } catch (PackageManager.NameNotFoundException e) { 
  15.   ...... 
  16.   } 
  17.   ...... 
  18.   int debugFlags = 0
  19.   ...... 
  20.   int pid = Process.start("android.app.ActivityThread"
  21.   mSimpleProcessManagement ? app.processName : null, uid, uid, 
  22.   gids, debugFlags, null); 
  23.   ...... 
  24.   } catch (RuntimeException e) { 
  25.   ...... 
  26.   } 
  27.   } 
  28.   ...... 
  29.   } 

它调用了Process.start函数开始为应用程序创建新的进程,注意,它传入一个***个参数 为"android.app.ActivityThread",这就是进程初始化时要加载的Java类了,把这个类加载到进程之后,就会把它里面的静态成 员函数main作为进程的入口点,后面我们会看到。

责任编辑:闫佳明 来源: bbs.9ria
相关推荐

2014-06-20 11:24:34

Android应用程序进程启动

2014-06-20 11:09:35

Android应用程序进程启动

2014-06-20 11:05:56

Android应用程序进程启动

2014-06-20 11:20:37

Android应用程序进程启动

2014-06-19 14:54:11

Android应用程序进程启动

2014-06-19 14:59:40

Android应用程序进程启动

2014-06-19 14:30:28

Android应用程序进程启动

2012-02-20 14:47:08

JavaPlay

2014-05-22 15:00:16

Android消息处理机制Looper

2011-08-17 16:16:29

iPhone应用程序启动过程

2011-07-28 10:34:38

Cocoa 程序 启动

2014-06-23 10:31:09

Android启动过程

2011-06-28 13:27:13

ARM Linux

2014-07-31 10:06:01

谷歌Google应用

2024-09-11 09:25:03

Tomcat组件PREP

2012-08-16 09:07:57

Erlang

2018-03-13 13:00:03

Linux运维启动分析

2022-08-29 17:34:05

鸿蒙操作系统

2014-05-22 15:45:58

Android消息处理机制Looper

2010-12-13 11:40:17

Android应用程序
点赞
收藏

51CTO技术栈公众号