Android原始碼(二)應用程式啟動

猥瑣發育_別浪發表於2019-01-19

一、應用程式程式建立

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");
}

複製程式碼

相關文章