Android系统在新进程中启动自定义服务过程(sta(2)

在ContextImpl类的startService类,最终又调用了ActivityManagerProxy类的startService来实现启动服务的操作,看到这里的Proxy关键字,回忆一下前面Android系统进程间通信Binder机制在应用程序框架层的Java接口源代码分析这篇文章,就会知道ActivityManagerProxy是一个Binder对象的远程接口了,而这个Binder对象就是我们前面所说的ActivityManagerService了。

这个ActivityManagerService类实现在frameworks/base/services/java/com/Android/server/am/ActivityManagerService.java文件中,它是Binder进程间通信机制中的Server角色,它是随机启动的。随机启动的Server是在frameworks/base/services/java/com/android/server/SystemServer.java文件里面进行启动的,我们来看一下ActivityManagerService启动相关的代码:

class ServerThread extends Thread {              ......          @Override       public void run() {              ......              // Critical services...            try {                  ......                  context = ActivityManagerService.main(factoryTest);                  ......                  ActivityManagerService.setSystemProcess();                  ......                      } catch (RuntimeException e) {               Slog.e("System""Failure starting core service", e);           }              ......              }          ......      }  

首先是调用ActivityManagerService.main函数来创建一个ActivityManagerService实例,然后通过调用ActivityManagerService.setSystemProcess函数把这个Binder实例添加Binder进程间通信机制的守护进程ServiceManager中去:

public final class ActivityManagerService extends ActivityManagerNative           implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback {          ......          static ActivityManagerService mSelf;          ......          public static void setSystemProcess() {           try {               ActivityManagerService m = mSelf;                  ServiceManager.addService("activity", m);                              ......              } catch (PackageManager.NameNotFoundException e) {               ......           }       }          ......          public static final Context main(int factoryTest) {                      ......              ActivityManagerService m = thr.mService;           mSelf = m;              ......          }   }  

这样,ActivityManagerService就启动起来了。

回到ActivityManagerProxy类的startService函数中,它定义在frameworks/base/core/java/android/app/ActivityManagerNative.java文件中:

 

class ActivityManagerProxy implements IActivityManager   {       ......          public ComponentName startService(IApplicationThread caller, Intent service,           String resolvedType) throws RemoteException       {           Parcel data = Parcel.obtain();           Parcel reply = Parcel.obtain();           data.writeInterfaceToken(IActivityManager.descriptor);           data.writeStrongBinder(caller != null ? caller.asBinder() : null);           service.writeToParcel(data, 0);           data.writeString(resolvedType);           mRemote.transact(START_SERVICE_TRANSACTION, data, reply, 0);           reply.readException();           ComponentName res = ComponentName.readFromParcel(reply);           data.recycle();           reply.recycle();           return res;       }          ......   }  

参数service是一个Intent实例,它里面指定了要启动的服务的名称,就是前面我们所说的“shy.luo.ashmem.server”了。

参数caller是一个IApplicationThread实例,它是一个在主进程创建的一个Binder对象。在Android应用程序中,每一个进程都用一个ActivityThread实例来表示,而在ActivityThread类中,有一个成员变量mAppThread,它是一个ApplicationThread实例,实现了IApplicationThread接口,它的作用是用来辅助ActivityThread类来执行一些操作,这个我们在后面会看到它是如何用来启动服务的。

linux

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwddpy.html