App启动(二)AMS在Application创建过程中的调度

上一篇文章中我们说到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.ProxyattachApplication方法

1.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方法,我们来看ActivityManagerServiceonTransact方法

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.StubonTransact方法源码

 @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方法,实际上就是ActivityManagerServiceattachApplication方法。

实际上上面的IActivityManager.Stub类是根据IActivityManager.aidl自动生成,aidl机制了通过Binder远程调用相关方法会实际调用远程对象的同名方法

2. 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类型对象threadbindApplication方法,而这个thread其实就是上一篇文章的mAppThread对象的代理对象,这样就跟前一篇文章联系起来了,AMS通过Binder机制调用ApplicationThreadbindApplication方法创建Application对象。

至此,我们关于AMS在创建Application过程中的调度就分析完了。

你可能感兴趣的:(Android,源码)