当前位置: 首页 > 科技观察

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

时间:2023-03-13 05:02:16 科技观察

Android应用框架层创建的应用进程有两个特点。一是进程的入口函数是ActivityThread.main,二是进程天然支持进程间的Binder。沟通机制;这两个特性是在进程初始化过程中实现的。本文将详细分析如何在Android应用的进程创建过程中实现这两个特性。Android应用框架层创建的应用进程的入口函数是ActivityThread.main,比较容易理解,即进程创建后,Android应用框架层会加载这个进程中的ActivityThread类,然后执行它的main函数,这个main函数就是进程执行消息循环的地方。Android应用框架层创建的应用进程天然支持Binder进程间通信机制。我们应该如何理解这个特性呢?前面我们在学习Android系统的Binder进程间通信机制时提到过,它有四个组成部分,分别是driverPrograms、daemons、Clients和Servers。Server组件在初始化时必须进入一个循环,不断与Binder驱动进行交互,以获取Client组件发送的请求。具体可以参考Android系统进程间通信(IPC)机制Binder中Server启动过程的源码分析,但是我们在Android应用中实现Server组件的时候,并没有让进程进入循环去等待Client组件的请求。但是,当Client组件获取到Server组件的远程接口时,就可以顺利的与Server组件通信了。这是因为Android应用进程在创建的时候就已经启动了一个线程池来支持Server组件和Binder驱动的交互。这极大地方便了Android应用程序中Server组件的创建。在Android应用程序框架层,ActivityManagerService组件负责为Android应用程序创建一个新的进程。它原本运行在一个独立的进程中,但这个进程是在系统启动时创建的。ActivityManagerService组件一般在什么情况下会为应用创建一个新进程呢?当系统决定在新进程中启动一个Activity或Servi时ce,它会创建一个新进程,然后在这个新进程中启动Activity或者Service。具体可以参考Android系统在新进程中启动自定义服务进程(startService)原理分析、Android应用这三篇文章分别是启动过程的源码分析和Android应用的方法和流程分析在新进程中启动新活动。ActivityManagerService从它的成员函数startProcessLocked开始一个新的进程。在深入分析这个流程之前,我们先看一下流程创建过程的时序图,然后再详细分析每一个步骤。Step1.函数ActivityManagerService.startProcessLocked定义在frameworks/base/services/java/com/android/server/am/ActivityManagerService.java文件中:BatteryCallback..  privatefinalvoidstartProcessLocked(ProcessRecordapp,  StringhostingType,StringhostingNameStr){  ......  try{  intuid=app.info.uid;  int[]gids=null;  try{  gids=mContext.getPackageManager().getPackageGids(  app.info.packageName);  }catch(PackageManager.NameNotFoundExceptione){  …  }  ……  intdebugFlags=0;  ……  intpid=Process.start("android.app.ActivityThread",  mSimpleProcessManagement?app.processName:null,uid,uid,  gids,debugFlags,null);  ……  }catch(RuntimeExceptione){  ……  }  }  ……  }它调用Process.start函数开始为应用程序创建一个新进程。注意它传入了一个***参数为“android.app.ActivityThread”,这是进程初始化时要加载的Java类。这个类被加载到进程中后,它里面的静态成员函数main会作为进程的入口,后面我们会看到。