Android系統(tǒng)的啟動流程

Android系統(tǒng)有哪些進(jìn)程

在Linux系統(tǒng)啟動時,會讀取init.rc,里面配置了一些需要啟動的進(jìn)程善炫。注意:SystemServer進(jìn)程不在init.rc里,因為SystemServer進(jìn)程是由zygote啟動的兜挨。
如下所示:

service zygote /system/bin/app_process ...
service servicemanager /system/bin/servicemanager ...
service sufaceflinger /system/bin/suerfaceflinger ...
service media /system/bin/mediaserver ...
...

Zygote是怎么啟動的?

  • init進(jìn)程fork出zygote進(jìn)程
  • 啟動虛擬機(jī)眯分,注冊JNI函數(shù)
  • 預(yù)加載系統(tǒng)資源(常用類拌汇、主題資源、JNI函數(shù)弊决、共享庫等)
  • 啟動SystemServer
private static boolean startSystemServer(...){
    String args[] = {
        ...
         "com.android.server.SystemServer",
    };
    int pid = Zygote.forkSystemServer(...);
    if(pid==0){
         handleSystemServerProcess(parsedArgs);
    }
    return true;
}
......
void handleSystemServerProcess(Arguments parsedArgs){
    RuntimeInit.zygoteInit(parsedArgs.targetSdkVersion,parsedArgs.remainingArgs,...);
}
......
void zygoteInit(String[] argv,...){
        commonInit();  //常規(guī)初始化
        nativeZygoteInit(); //調(diào)用native的onZygoteInit担猛,啟動binder。
        applicationInit(argv,...);  //調(diào)用Java類(SystemServer)的main函數(shù)
}
......
virtual void onZygoteInit(){
     sp<ProcessState> proc = ProcessState::self();
    proc->startThreadPool();
}
......
void applicationInit(...){
    invokeStaticMain(args,...);//調(diào)用Java類(SystemServer)的main函數(shù)
}
......

SystemServer.java

public static void main(String[] args){
     new SystemServer().run();
}
......
private void run(){
    Looper.prepareMainLooper(); //創(chuàng)建主線程looper

    System.loadLibrary("android_servers");  //加載native層的SystemServer代碼
    createSystemContext();  //創(chuàng)建系統(tǒng)上下文

    startBootstrapServices(); //啟動引導(dǎo)服務(wù)
    startCoreServices(); //啟動核心服務(wù)
    startOtherServices(); //啟動其他服務(wù)
    Looper.loop();  //開啟循環(huán)
}
  • 進(jìn)入Socket Loop
boolean runOnce(){
    String[] args = readArgumentList();
    int pid = Zygote.forkAndSpecialize();
    if(pid==0){
        //in child process
        handleChildProc(args,...);
        //should never get here, the child is expected to either throw ZygoteInit.MethodAndArgsCaller or exec().
        return true;
    }else{
        return handleParentProc(pid,...);
    }
}

系統(tǒng)服務(wù)是怎么發(fā)布丢氢,讓應(yīng)用程序可見?

void publisBinderService(String name,IBinder service){
    publishBinderService(name,service,false);
}

void publishBinderService(String name,IBinder service,...){
    ServiceManager.addService(name,service,allowIsolated);
}

系統(tǒng)服務(wù)運(yùn)行在什么線程傅联?

工作線程:AMS、PMS疚察、PackageManagerService
還有一些運(yùn)行在公用的線程中蒸走,如在DisplayThread,FgThread,IoThread,UiThread線程中運(yùn)行。
binder線程:應(yīng)用接收到binder調(diào)用后貌嫡,啟動線程比驻。

系統(tǒng)服務(wù)的互相依賴是如何解決的?

  • 分批啟動
    AMS, PMS, PKMS
  • 分階段啟動
    階段1岛抄,階段2别惦,階段3,……

桌面的啟動

public void systemReady(final Runnable goingCallback){
    ……
    //啟動桌面程序的Launcher類
    startHomeActivityLocked(mCurrentUserId,"systemReady");
    ……
}
//Launcher(Activity)的onCreate方法中會創(chuàng)建一個LoaderTask
mLoaderTask = new LoaderTask(mApp.getContext(),loadFlags);
//在LoaderTask中會去向Package ManagerSevice查詢已安裝應(yīng)用夫椭,然后將應(yīng)用圖標(biāo)顯示在桌面掸掸,當(dāng)用戶點擊圖標(biāo)時,Launcher就會啟動應(yīng)用程序蹭秋。
mPm.queryIntentActivitiesAsUser();


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末扰付,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子仁讨,更是在濱河造成了極大的恐慌羽莺,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件洞豁,死亡現(xiàn)場離奇詭異盐固,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)丈挟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進(jìn)店門刁卜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人礁哄,你說我怎么就攤上這事长酗。” “怎么了桐绒?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵夺脾,是天一觀的道長之拨。 經(jīng)常有香客問我,道長咧叭,這世上最難降的妖魔是什么蚀乔? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮菲茬,結(jié)果婚禮上吉挣,老公的妹妹穿的比我還像新娘。我一直安慰自己婉弹,他們只是感情好睬魂,可當(dāng)我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著镀赌,像睡著了一般氯哮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上商佛,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天喉钢,我揣著相機(jī)與錄音,去河邊找鬼良姆。 笑死肠虽,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的玛追。 我是一名探鬼主播税课,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼豹缀!你這毒婦竟也來了伯复?” 一聲冷哼從身側(cè)響起慨代,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤邢笙,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后侍匙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體氮惯,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年想暗,在試婚紗的時候發(fā)現(xiàn)自己被綠了妇汗。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡说莫,死狀恐怖杨箭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情储狭,我是刑警寧澤互婿,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布捣郊,位于F島的核電站,受9級特大地震影響慈参,放射性物質(zhì)發(fā)生泄漏呛牲。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一驮配、第九天 我趴在偏房一處隱蔽的房頂上張望娘扩。 院中可真熱鬧,春花似錦壮锻、人聲如沸琐旁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽旋膳。三九已至,卻和暖如春途事,著一層夾襖步出監(jiān)牢的瞬間验懊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工尸变, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留义图,地道東北人。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓召烂,卻偏偏與公主長得像碱工,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子奏夫,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,781評論 2 354