天天看點

Android Framework實戰視訊--FallbackHome程序啟動及Activity啟動篇

首先看process.start的源碼:

這裡調用了zygoteprocess的start方法:

這裡調用到了startviazygote方法:

這裡設定了一系列參數後,在調用zygotesendargsandgetresult

zygotesendargsandgetresult這裡就調用了bufferedwriter的writer對象進行了socket的寫入資料,writer就是zygotestate.writer,

那zygotestate.writer又具體是怎麼指派的呢?

這裡面的socketaddress是如下代碼指派的:

也就是zygote_socket變量,變量就是前幾節課講的zygote程序建立的server名字

frameworks/base/core/java/com/android/internal/os/zygoteinit.java中的main方法中:

是以就是這樣activtiymanagerservice通過socket與zygote進行一個跨程序通信。

Android Framework實戰視訊--FallbackHome程式啟動及Activity啟動篇

activitymanagerservice這邊把要建立一個程序的主要參數等需要準備好,然後發送給zygote端,zygote端接受到了發來資料後建立對應的程序。建立對應程序時候還會執行傳過來的entrypoint即 "android.app.activitythread"類的main方法

接下來看看分析之前zygote部分的接受和建立程序,前面zygote已經知道,zygote本身是一直循環執行runselectloop裡面的while:

是以核心在processonecommand方法:

這裡processonecommand建立好了程序後,又調用handlechildproc方法:

private runnable handlechildproc(arguments parsedargs, filedescriptor[] descriptors,

filedescriptor pipefd) {

//省略

//這裡最後調用zygoteinit.zygoteinit和以前systemserver其實是一樣的,隻不過這裡的remainingargs參數變成activitythread

return zygoteinit.zygoteinit(parsedargs.targetsdkversion, parsedargs.remainingargs,

null /* classloader */);

/這裡最後調用zygoteinit.zygoteinit和以前systemserver其實是一樣的,隻不過這裡的remainingargs參數變成activitythread類,傳回的activitythread的main方法執行的runable

當應用程序被建立後,最開始就是執行的activitythread的main方法

這裡主要就是對loop進行初始化,接下來再建立activitythread對象,調用它的attach方法:

這裡主要應用端會擷取system server中的ams對象ibinder對象,然後調用attachapplication(mappthread)方法,這個attachapplication真正實作那是在activitymanagerservice:

這裡又調用重載方法:private final boolean attachapplicationlocked(iapplicationthread thread,

int pid);

這裡調用stacksupervisor.attachapplicationlocked(app):

這裡最後跨程序調回應用程序,activitythread的applicationthread的schedulelaunchactivity方法,這個方法再進行activtiy的oncreate等調用,這裡就不帶大家分析activitythread的相關内容了,因為activitythread中基本屬于應用層自己執行代碼,而且相對不那麼複雜,自己完全可以分析,是以當作作業留給大家自己分析接下來的activitythread部分。

最後附上對應的流程總圖:

Android Framework實戰視訊--FallbackHome程式啟動及Activity啟動篇