
首先是init 進(jìn)程啟動,init 進(jìn)程是Android 系統(tǒng)用戶空間中啟動的第一個進(jìn)程,啟動之后加載配置文件,init.rc文件中存放的主要就是一些可執(zhí)行程序路徑的參數(shù);負(fù)責(zé)啟動zygote進(jìn)程和其他系統(tǒng)服務(wù)進(jìn)程
啟動進(jìn)程:
1、fork + handle
2、fork + execve 清空了父進(jìn)程繼承過來的環(huán)境
zegote進(jìn)程啟動之后執(zhí)行了execve 調(diào)用,調(diào)用加載了一個可執(zhí)行程序,所以zygote 進(jìn)程雖然是init 進(jìn)程啟動的,但是沒有繼承init 進(jìn)程的屬性
1、創(chuàng)建虛擬機(jī)
2、注冊關(guān)鍵的JNI接口
3、切換到j(luò)ava 調(diào)用
4、preload 資源
5、啟動systemserver 進(jìn)程
6、Loop處理消息,有請求過來,執(zhí)行runOnce 函數(shù),
1)讀取參數(shù)列表,ams 跨進(jìn)程發(fā)送過來的
2)fork 一個子進(jìn)程
3)在子進(jìn)程中執(zhí)行ActivityThread main 函數(shù)
zygote是多線程的,但fork 時候會停了其他所有進(jìn)程,fork 完成之后再重新啟動;
zygote 進(jìn)程跨進(jìn)程通信機(jī)制是socket,并不是binder,binder 機(jī)制是system server 的
SystemServer啟動
startSystenServer方法中創(chuàng)建SystemServer 進(jìn)程,之后首先會初始化一些通用環(huán)境,然后開啟binder 機(jī)制,啟動binder線程池,然后調(diào)用applicationInit,applicationInit中其實主要執(zhí)行了SeystemServer 的main方法,main方法中執(zhí)行了SeystemServer的run 方法,在run 方法中首先
1、調(diào)用prepareMainlooper
2、然后加載系統(tǒng)lib 庫
3、然后創(chuàng)建上下文,
4、啟動系統(tǒng)服務(wù),包含ams、pms、pkms 等,ams 啟動完成之后就會啟動launcher,啟動之后回去加載應(yīng)用列表到桌面顯示
5、Looper.Loop