首先是init 進(jìn)程啟動(dòng)蚀狰,init 進(jìn)程是Android 系統(tǒng)用戶空間中啟動(dòng)的第一個(gè)進(jìn)程浑厚,啟動(dòng)之后加載配置文件矾瘾,init.rc文件中存放的主要就是一些可執(zhí)行程序路徑的參數(shù);負(fù)責(zé)啟動(dòng)zygote進(jìn)程和其他系統(tǒng)服務(wù)進(jìn)程
啟動(dòng)進(jìn)程:
1二庵、fork + handle
2、fork + execve 清空了父進(jìn)程繼承過來的環(huán)境
zegote進(jìn)程啟動(dòng)之后執(zhí)行了execve 調(diào)用缓呛,調(diào)用加載了一個(gè)可執(zhí)行程序催享,所以zygote 進(jìn)程雖然是init 進(jìn)程啟動(dòng)的,但是沒有繼承init 進(jìn)程的屬性
1哟绊、創(chuàng)建虛擬機(jī)
2因妙、注冊(cè)關(guān)鍵的JNI接口
3、切換到j(luò)ava 調(diào)用
4票髓、preload 資源
5攀涵、啟動(dòng)systemserver 進(jìn)程
6、Loop處理消息洽沟,有請(qǐng)求過來以故,執(zhí)行runOnce 函數(shù),
1)讀取參數(shù)列表裆操,ams 跨進(jìn)程發(fā)送過來的
2)fork 一個(gè)子進(jìn)程
3)在子進(jìn)程中執(zhí)行ActivityThread main 函數(shù)
zygote是多線程的怒详,但fork 時(shí)候會(huì)停了其他所有進(jìn)程,fork 完成之后再重新啟動(dòng)跷车;
zygote 進(jìn)程跨進(jìn)程通信機(jī)制是socket棘利,并不是binder,binder 機(jī)制是system server 的
SystemServer啟動(dòng)
startSystenServer方法中創(chuàng)建SystemServer 進(jìn)程朽缴,之后首先會(huì)初始化一些通用環(huán)境,然后開啟binder 機(jī)制水援,啟動(dòng)binder線程池密强,然后調(diào)用applicationInit,applicationInit中其實(shí)主要執(zhí)行了SeystemServer 的main方法蜗元,main方法中執(zhí)行了SeystemServer的run 方法或渤,在run 方法中首先
1、調(diào)用prepareMainlooper
2奕扣、然后加載系統(tǒng)lib 庫(kù)
3薪鹦、然后創(chuàng)建上下文,
4惯豆、啟動(dòng)系統(tǒng)服務(wù),包含ams池磁、pms、pkms 等楷兽,ams 啟動(dòng)完成之后就會(huì)啟動(dòng)launcher地熄,啟動(dòng)之后回去加載應(yīng)用列表到桌面顯示
5、Looper.Loop