基礎知識復習 啟動過程

Android系統(tǒng)底層基于Linux Kernel, 當Kernel啟動過程會創(chuàng)建init進程, 該進程是所有用戶空間的鼻祖, init進程會啟動servicemanager(binder服務管家), Zygote進程(Java進程的鼻祖). Zygote進程會創(chuàng)建 system_server進程以及各種app進程,下圖是這幾個系統(tǒng)重量級進程之間的層級關系。


image.png

各大核心進程啟動后,都會進入各種對象所相應的main()方法,如下

進程main方法

進程 主方法
init進程 Init.main()
zygote進程 ZygoteInit.main()
app_process進程 RuntimeInit.main()
system_server進程 SystemServer.main()
app進程 ActivityThread.main()

主方法介紹
Init.main()
init進程(pid=1)是Linux系統(tǒng)中用戶空間的第一個進程,主要工作如下:
創(chuàng)建一塊共享內存空間,用于屬性服務器
解析各個rc文件,并啟動對應的屬性服務進程
初始化epoll,一次設置signal、property,keychord 這三個fd對應的回調函數(shù)
進入無線循環(huán),執(zhí)行流程如下
檢查action_quene列表是夠為空,若不為空擇啟動相應的action
檢查是否需要重啟進程,若有擇將其重新啟動
進入epoll_wait狀態(tài) 直到新系統(tǒng)屬性變化事件(property_set屬性值變化),或者收到紫禁城的信號,或者收到鍵盤輸入時間,則會退出等待狀態(tài),執(zhí)行相應的回調函數(shù)
init啟動流程


image.png

zygote進程
Zygote是由init進程通過解析init.zygote.rc文件而創(chuàng)建的,zygote所對應的可執(zhí)行程序app_process,所對應的源文件是App_main.cpp,進程名為zygote。
Zygote啟動流程


image.png

解析init.zygote.rc中的參數(shù),創(chuàng)建appRuntime并調用AppRunTime.start方法;
調用AddroidRuntime的startVm()方法并創(chuàng)建虛擬機,在調用startReg()注冊JNI函數(shù);
通過JNI的方式調用ZygiteInit.mian進入java區(qū)域
通過 registerZygoteSocket()建立Socket通道,zygote作為通信的服務氣短,相應客戶端的請求;
preload 預加載通用類,加載color,drawable資源 openGL,共享庫、和webView 用于提高app的啟動效率
zygote完成了大部分工作 ,接下來通過startSystemServer()來fork system_server
進程,也是framework的載體
zygote 完成所有工作 調用runSelectLoop 進入掛起狀態(tài);
Activity的啟動過程
image.png
  • 首先桌面點擊圖標 lancher才會用binder IPC 想system_server 發(fā)送startActivity請求
  • system_server收到請求后,想Zygote發(fā)送創(chuàng)建進程請求
  • zygote通過socket fork一個子進程 就是我們需要的App進程
  • app進程通過BinderIPC 想system_server發(fā)送attchApplication請求
  • system_server收到請求后進行一系類準備,然后發(fā)送scheduleLaunchActivity通知app進程
  • app進程的binder線程(ApplicationThread)收到消息后通過Handler向主線程發(fā)送lancherActivity消息
  • 主線程收到消息 通過反射創(chuàng)建 activity
  • 調用activity的OnCreate方法
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容