一、應用程式程式建立
1、 應用程式請求
- Zygote 程式會建立一個 Socket,用來等待 AMS 請求建立應用程式。
- ActivityManagerService 會通過呼叫 startProcessLocked 來傳送請求。
- 接收到請求後,Zygote 程式會 fork 自身建立應用程式。
2、接收建立請求
通過 ZygoteServer 的runSelectLoop
方法處理建立程式的請求-->
ZygoteConnection 的runOnce
處理請求資料-->
ZygoteInit 的zygoteInit
方法中建立Binder執行緒池-->
RuntimeInit 的invokeStaticMain
方法
private static void invokeStaticMain(String className, String[] argv, ClassLoader classLoader)
throws Zygote.MethodAndArgsCaller {
Class<?> cl;
try {
//通過反射建立了ActivityThread物件
cl = Class.forName(className, true, classLoader);
} catch (ClassNotFoundException ex) {
throw new RuntimeException(
"Missing class when invoking static main " + className,
ex);
}
Method m;
try {
//獲取ActivityThread物件的main方法
m = cl.getMethod("main", new Class[] { String[].class });
} catch (NoSuchMethodException ex) {
throw new RuntimeException(
"Missing static main on " + className, ex);
} catch (SecurityException ex) {
throw new RuntimeException(
"Problem getting static main on " + className, ex);
}
......
throw new Zygote.MethodAndArgsCaller(m, argv);
}
複製程式碼
最後丟擲一個 MethodAndArgsCaller 異常,被 ZygoteInit 的main
方法處理--> Zygote 的 run 方法
public void run() {
try {
mMethod.invoke(null, new Object[] { mArgs });
} catch (IllegalAccessException ex) {
throw new RuntimeException(ex);
} catch (InvocationTargetException ex) {
Throwable cause = ex.getCause();
if (cause instanceof RuntimeException) {
throw (RuntimeException) cause;
} else if (cause instanceof Error) {
throw (Error) cause;
}
throw new RuntimeException(ex);
}
}
複製程式碼
通過反射呼叫了 ActivityThread 的 main 方法
3、ActivityThread
public static void main(String[] args) {
......
//建立Looper
Looper.prepareMainLooper();
ActivityThread thread = new ActivityThread();
thread.attach(false);
if (sMainThreadHandler == null) {
sMainThreadHandler = thread.getHandler();
}
if (false) {
Looper.myLooper().setMessageLogging(new
LogPrinter(Log.DEBUG, "ActivityThread"));
}
// End of event ActivityThreadMain.
Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
//Looper開始處理訊息
Looper.loop();
throw new RuntimeException("Main thread loop unexpectedly exited");
}
複製程式碼