Android系统在新进程中启动自定义服务过程(startService)的原理分析:
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就启动起来了。
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实例,它里面指定了要启动的服务的名称
ActivityManagerProxy类的startService函数把这三个参数写入到data本地变量去,接着通过mRemote.transact函数进入到Binder驱动程序,然后Binder驱动程序唤醒正在等待Client请求的ActivityManagerService进程,最后进入到ActivityManagerService的startService函数中。
下面是ActivityManagerService的startService函数的处理流程
Android应用程序启动过程源代码分析:
整个应用程序的启动过程要执行很多步骤,但是整体来看,主要分为以下五个阶段:
一:Launcher通过Binder进程间通信机制通知ActivityManagerService,它要启动一个Activity;
二:ActivityManagerService通过Binder进程间通信机制通知Launcher进入Paused状态;
三:Launcher通过Binder进程间通信机制通知ActivityManagerService,它已经准备就绪进入Paused状态,于是ActivityManagerService就创建一个新的进程,用来启动一个ActivityThread实例,即将要启动的Activity就是在这个ActivityThread实例中运行;
四:ActivityThread通过Binder进程间通信机制将一个ApplicationThread类型的Binder对象传递给ActivityManagerService,以便以后ActivityManagerService能够通过这个Binder对象和它进行通信;
五:ActivityManagerService通过Binder进程间通信机制通知ActivityThread,现在一切准备就绪,它可以真正执行Activity的启动操作了。