Android程序启动流程

文章主要介绍Android程序启动流程

Posted by linxu on July 15, 2018

Android程序启动流程

  文章主要介绍Android程序启动流程。

  Android开发语言最开始是使用的Java语言,我们都知道Java程序运行都是从main方法开始的。所以在阅读Android源代码的时候也是先找到的这个方法。Android的main方法是在ActivityThread类里面。

     public final class ActivityThread {
        //...
      public static void main(String[] args) {
        //...
        Looper.prepareMainLooper();  //主线程的消息处理机制初始化
        ActivityThread thread = new ActivityThread(); 
        thread.attach(false);//调用attach方法
        //...
        // End of event ActivityThreadMain.
        Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
        Looper.loop(); //主线程消息循环机制开始
        throw new RuntimeException("Main thread loop unexpectedly exited");
     }
    }

  如上代码,最重要的是:thread.attach(false); 这一行代码,这里调用了ActivityThread的attach方法。  

       private void attach(boolean system) {
        //...
        sCurrentActivityThread = this;
        mSystemThread = system;
        if (!system) {
            final IActivityManager mgr = ActivityManagerNative.getDefault(); //这里获取ActivityManager的一个代理对象
            try {
                mgr.attachApplication(mAppThread);//调用ActivityManagerNative下ActivityManagerProxy类的attachApplication方法。
            } catch (RemoteException ex) {
                throw ex.rethrowFromSystemServer();
            }
            // Watch for getting close to heap limit.
            BinderInternal.addGcWatcher(new Runnable() {
                @Override public void run() {
                   //这里的代码用于监测内存
                }
            });
        } else {
            //...
        }

        // add dropbox logging to libcore
        DropBox.setReporter(new DropBoxReporter());

        ViewRootImpl.addConfigCallback(new ComponentCallbacks2() {
            @Override
            public void onConfigurationChanged(Configuration newConfig) {
                synchronized (mResourcesManager) {
                 //...
                }
            }
            @Override
            public void onLowMemory() {
            }
            @Override
            public void onTrimMemory(int level) {
            }
        });
      }
      
private static final Singleton<IActivityManager> gDefault = new Singleton<IActivityManager>() {
        protected IActivityManager create() {
            IBinder b = ServiceManager.getService('activity');
            if (false) {
                Log.v('ActivityManager', 'default service binder = ' + b);
            }
            IActivityManager am = asInterface(b);
            if (false) {
                Log.v('ActivityManager', 'default service = ' + am);
            }
            return am;
        }
      };
     static public IActivityManager getDefault() {
        return gDefault.get();
     }

```static public IActivityManager asInterface(IBinder obj) { if (obj == null) { return null; } IActivityManager in = (IActivityManager)obj.queryLocalInterface(descriptor); if (in != null) { return in; }

    return new ActivityManagerProxy(obj);
} ```

  如上代码,mgr是IActivityManager的一个实例,通过ActivityManagerNative.getDefault();方法获得。getDefault()调用变量gDefault的get方法获得,在变量gDefault的定义里面调用了asInterface方法。在方法asInterface里面可以看到,msg是类ActivityManagerProxy的对象。msg调用了attachApplication方法。

public void attachApplication(IApplicationThread app) throws RemoteException
    {
        Parcel data = Parcel.obtain();
        Parcel reply = Parcel.obtain();
        data.writeInterfaceToken(IActivityManager.descriptor);
        data.writeStrongBinder(app.asBinder());
        mRemote.transact(ATTACH_APPLICATION_TRANSACTION, data, reply, 0);
        reply.readException();
        data.recycle();
        reply.recycle();
    }
 
  public boolean onTransact(int code, Parcel data, Parcel reply, int flags)
            throws RemoteException {
        switch (code) {
         //...

        case ATTACH_APPLICATION_TRANSACTION: {
            data.enforceInterface(IActivityManager.descriptor);
            IApplicationThread app = ApplicationThreadNative.asInterface(
                    data.readStrongBinder());
            if (app != null) {
                attachApplication(app);
            }
            reply.writeNoException();
            return true;
        }

        //...
    }

  可以看到attachApplication就是Binder机制的实现方式。mRemote是一个IBinder对象,通过调用ActivityManagerProxy类的方法,然后再Binder中传递数据,可以到达ActivityManagerNative类的onTransact方法,这就是典型的Binder机制的流程。可以看到在ActivityManagerNative的onTransact方法中,当收到来之代理对象的消息,然后对应code值是ATTACH_APPLICATION_TRANSACTION是调用了attachApplication方法。注意这个是ActivityManagerNative类的方法,不要与ActivityManagerProxy类的方法混淆。这个方法继承自IActivityManager接口,可以看到在ActivityManagerNative类中没有实现,那么应该是在它的子类中是实现了。而它的子类正好是ActivityManagerService。到这就需要分析ActivityManagerService了。

Activity的OnCreate调用

  Activity的OnCreate调用是在ActivityManagerService类中的attachApplicationLocked方法,在调用了thread.bindApplication之后,使用ActivityStackSupervisor类的mStackSupervisor.attachApplicationLocked(app),在这个调用了realStartActivityLocked,然后是app.thread.scheduleLaunchActivity方法,可以看到这里就开始启动activity了。