↓双击 Markdown插件,就可以开始编辑啦。
public static void main(String[] args) {
ActivityThread thread = new ActivityThread();
thread.attach(false, startSeq);
}
在attach方法中主要做了以下重要的事情:
final IActivityManager mgr = ActivityManager.getService();
try {
mgr.attachApplication(mAppThread, startSeq);
} catch (RemoteException ex) {
throw ex.rethrowFromSystemServer();
}
attach方法把应用进程的ApplicationThread通过IActivityManager传递到ActivityManagerService,而IActivityManager是ActivityManagerService系统服务在APP进程的一个代理,这个是一个跨进程的调用,最终会调用到ActivityManagerService的attachApplication方法:
public final void attachApplication(IApplicationThread thread, long startSeq) {
synchronized (this) {
int callingPid = Binder.getCallingPid();
final int callingUid = Binder.getCallingUid();
final long origId = Binder.clearCallingIdentity();
attachApplicationLocked(thread, callingPid, callingUid, startSeq);
Binder.restoreCallingIdentity(origId);
}
}
attachApplication方法里面又调用到:
IApplicationThread是APP进程ApplicationThread在系统进程的一个代理对象,bindApplication是一个系统进程到APP进程的跨进层调用,负责把一些初始化的数据回传到APP进程,例如系统服务的各种Binder代理对象,bindApplication最后会调用到ApplicationThread的bindApplication方法,这里面主要做了三件事:
/**
* The main entry point from zygote.
*/
public static void main(String[] args) {
new SystemServer().run();
}
在system_process进程启动的时候就会初始化一些系统服务,例如ActivityManagerService:
private void performLifecycleSequence(ActivityClientRecord r, IntArray path,
ClientTransaction transaction) {
final int size = path.size();
for (int i = 0, state; i < size; i++) {
state = path.get(i);
if (DEBUG_RESOLVER) {
Slog.d(TAG, tId(transaction) + "Transitioning activity: "
+ getShortActivityName(r.token, mTransactionHandler)
+ " to state: " + getStateName(state));
}
switch (state) {
case ON_CREATE:
mTransactionHandler.handleLaunchActivity(r, mPendingActions,
null /* customIntent */);
break;
case ON_START:
mTransactionHandler.handleStartActivity(r, mPendingActions);
break;
case ON_RESUME:
mTransactionHandler.handleResumeActivity(r.token, false /* finalStateRequest */,
r.isForward, "LIFECYCLER_RESUME_ACTIVITY");
break;
case ON_PAUSE:
mTransactionHandler.handlePauseActivity(r.token, false /* finished */,
false /* userLeaving */, 0 /* configChanges */, mPendingActions,
"LIFECYCLER_PAUSE_ACTIVITY");
break;
case ON_STOP:
mTransactionHandler.handleStopActivity(r.token, false /* show */,
0 /* configChanges */, mPendingActions, false /* finalStateRequest */,
"LIFECYCLER_STOP_ACTIVITY");
break;
case ON_DESTROY:
mTransactionHandler.handleDestroyActivity(r.token, false /* finishing */,
0 /* configChanges */, false /* getNonConfigInstance */,
"performLifecycleSequence. cycling to:" + path.get(size - 1));
break;
case ON_RESTART:
mTransactionHandler.performRestartActivity(r.token, false /* start */);
break;
default:
throw new IllegalArgumentException("Unexpected lifecycle state: " + state);
}
}
}
Method getServiceMethod = ActivityManager.class.getDeclaredMethod("getService");
getServiceMethod.setAccessible(true);
Object iActivityManagerObj = getServiceMethod.invoke(ActivityManager.class, null);
Field IActivityManagerSingleton = ActivityManager.class.getDeclaredField("IActivityManagerSingleton");
IActivityManagerSingleton.setAccessible(true);
Object IActivityManagerSingletonObj = IActivityManagerSingleton.get(ActivityManager.class);
Class<?> singletonCls = Class.forName("android.util.Singleton");
Field mInstance = singletonCls.getDeclaredField("mInstance");
mInstance.setAccessible(true);
Class<?> iActivityManagerInterface = Class.forName("android.app.IActivityManager");
Object iActivityManagerProxy = Proxy.newProxyInstance(ActivityManager.class.getClassLoader()
, new Class<?>[]{iActivityManagerInterface}, new IActivityManagerHandler(iActivityManagerObj));
mInstance.set(IActivityManagerSingletonObj, iActivityManagerProxy);