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了。