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

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

10年积累的做网站、网站制作经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站制作后付款的网站建设流程,更有益阳免费网站建设让你可以放心的选择与我们合作。

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作为进程的入口点,后面我们会看到。

网站题目:Android应用程序进程启动过程的源代码分析(一)
URL网址:http://www.shufengxianlan.com/qtweb/news49/273699.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联