上一篇文章中我们说到ActivityThread
通过AMS的attachApplication
方法将mAppThread
对象关联到了AMS中,并且后面通过mAppThread
对Application进行创建、生命周期的管理等。这次我们就研究下它是怎么做到上述这些的。
首先我们继续看ActivityThread
#attach
方法搬过来
public void attach(boolean system){
...
//获得IActivityManager实例,他是一个ActivityManagerProxy的示例
final IActivityManager mgr = ActivityManager.getService();
try {
//这里是关键。mAppThread是一个ApplicationThread实例,具体的在下面说
mgr.attachApplication(mAppThread);
} catch (RemoteException ex) {
throw ex.rethrowFromSystemServer();
}
...
}
我们知道mgr
是一个Binder
对象,由于是远程调用,所以它是一个IActivityManager.Stub.Proxy
对象
我们来看IActivityManager.Stub.Proxy
的attachApplication
方法
IActivityManager.Stub.Proxy
#attachApplication
public void attachApplication(IApplicationThread app) throws RemoteException{
Parcel data = Parcel.obtain();
Parcel reply = Parcel.obtain();
data.writeInterfaceToken(IActivityManager.descriptor);
//把IApplicationThread 的对象app写到了data里,
//app就是mAppThread,mAppThread是什么看后面分析
data.writeStrongBinder(app.asBinder());
//重点在这里,用mRemote把dare传输出去
mRemote.transact(ATTACH_APPLICATION_TRANSACTION, data, reply, 0);
reply.readException();
data.recycle();
reply.recycle();
}
这里用了Binder机制调用通过transact
方法调用ATTACH_APPLICATION_TRANSACTION
绑定的方法
而transact
方法为Binder
类的方法,它会调用子类的onTransact
方法,我们来看ActivityManagerService
的onTransact
方法
public boolean onTransact(int code, Parcel data, Parcel reply, int flags)
throws RemoteException {
if (code == SYSPROPS_TRANSACTION){...}
try {
return super.onTransact(code, data, reply, flags);
} catch (RuntimeException e) {
...
}
}
这里实际上是交给了它的父类来处理,而ActivityManagerService
的父类是IActivityManager.Stub
IActivityManager.Stub
的onTransact
方法源码
@Override
public boolean onTransact(int code, Parcel data, Parcel reply, int flags)
throws RemoteException {
switch (code){
case ATTACH_APPLICATION_TRANSACTION: {
data.enforceInterface(IActivityManager.descriptor);
//从data里取出app,也就是之前传入的mAppThread
IApplicationThread app = ApplicationThreadNative.asInterface(
data.readStrongBinder());
if (app != null) {
//看这里,转到attachApplication去处理了
attachApplication(app);
}
reply.writeNoException();
return true;
}
}
可以看到他调用当前类的attachApplication
方法,实际上就是ActivityManagerService
的attachApplication
方法。
实际上上面的IActivityManager.Stub类是根据IActivityManager.aidl自动生成,aidl机制了通过Binder远程调用相关方法会实际调用远程对象的同名方法
ActivityManagerService
#attachApplication
public final void attachApplication(IApplicationThread thread) {
int callingPid = Binder.getCallingPid();
...
attachApplicationLocked(thread, callingPid);
...
}
attachApplication
方法又调用了attachApplicationLocked
方法
private final boolean attachApplicationLocked(IApplicationThread thread
, int pid) {
...
//看这里通过thread调用了bindApplication方法
thread.bindApplication();
...
}
可以看到调用了IApplicationThread
类型对象thread
的bindApplication
方法,而这个thread其实就是上一篇文章的mAppThread
对象的代理对象,这样就跟前一篇文章联系起来了,AMS通过Binder机制调用ApplicationThread
的bindApplication
方法创建Application
对象。
至此,我们关于AMS在创建Application
过程中的调度就分析完了。