http://www.shengshiyouxi.com
生活随笔
收集整理的這篇文章主要介紹了
http://www.shengshiyouxi.com
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
| android從Linux系統(tǒng)啟動(dòng)有4個(gè)步驟; ??(1) init進(jìn)程啟動(dòng) ??(2) Native服務(wù)啟動(dòng) ??(3) System Server,Android服務(wù)啟動(dòng) ??(4) Home啟動(dòng) ?? ??總體啟動(dòng)框架圖如: ?? ?? ??? ??第一步:initial進(jìn)程(system\core\init) ?? ??? ???init進(jìn)程,它是一個(gè)由內(nèi)核啟動(dòng)的用戶級(jí)進(jìn)程。內(nèi)核自行啟動(dòng)(已經(jīng)被載入內(nèi)存,開(kāi)始運(yùn)行,并已初始化所有的設(shè)備驅(qū)動(dòng)程序和數(shù)據(jù)結(jié)構(gòu)等)之后,就通過(guò)啟動(dòng)一個(gè)用戶級(jí)程序init的方式,完成引導(dǎo)進(jìn)程。init始終是第一個(gè)進(jìn)程. ??Init.rc ??Init.marvell.rc ?? ?? ?? ?? ??Init進(jìn)程一起來(lái)就根據(jù)init.rc和init.xxx.rc腳本文件建立了幾個(gè)基本的服務(wù): servicemanamger zygote ??。。。 ??最后Init并不退出,而是擔(dān)當(dāng)起property service的功能。 ??1.1腳本文件 ??init@System/Core/Init ??Init.c: parse_config_file(Init.rc) ????@parse_config_file(Init.marvel.rc) ??解析腳本文件:Init.rc和Init.xxxx.rc(硬件平臺(tái)相關(guān)) ?? ??Init.rc是Android自己規(guī)定的初始化腳本(Android Init Language, System/Core/Init/readme.txt) ??該腳本包含四個(gè)類型的聲明: Actions Commands Services Options.1.2 服務(wù)啟動(dòng)機(jī)制 ?? ??我們來(lái)看看Init是這樣解析.rc文件開(kāi)啟服務(wù)的。 ??(1)打開(kāi).rc文件,解析文件內(nèi)容@ system\core\init\init.c ??將service信息放置到service_list中。@ system\core\init parser.c ??(2)restart_service()@ system\core\init\init.c ??service_start ??execve(…).建立service進(jìn)程。 ??第二步 Zygote ??Servicemanager和zygote進(jìn)程就奠定了Android的基礎(chǔ)。Zygote這個(gè)進(jìn)程起來(lái)才會(huì)建立起真正的Android運(yùn)行空間,初始化建立的Service都是Navtive service.在.rc腳本文件中zygote的描述: ??service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server ??所以Zygote從main(…)@frameworks\base\cmds\app_main.cpp開(kāi)始。 ??(1) main(…)@frameworks\base\cmds\app_main.cpp 建立JAVA?Runtime runtime.start("com.android.internal.os.ZygoteInit", startSystemServer); ?? ??(2) runtime.start@AndroidRuntime.cpp 建立虛擬機(jī) 運(yùn)行:com.android.internal.os.ZygoteInit:main函數(shù)。 ?? ??(3)main()@com.android.internal.os.ZygoteInit//正真的Zygote。 registerZygoteSocket();//登記Listen端口 startSystemServer(); 進(jìn)入Zygote服務(wù)框架。 ??經(jīng)過(guò)這幾個(gè)步驟,Zygote就建立好了,利用Socket通訊,接收ActivityManangerService的請(qǐng)求,Fork應(yīng)用程序。 ?? ??第三步 System Server ?? ??startSystemServer@com.android.internal.os.ZygoteInit在Zygote上fork了一個(gè)進(jìn)程: com.android.server.SystemServer.于是SystemServer@(SystemServer.java)就建立了。Android的所有服務(wù)循環(huán)框架都是建立SystemServer@(SystemServer.java)上。在SystemServer.java中看不到循環(huán)結(jié)構(gòu),只是可以看到建立了init2的實(shí)現(xiàn)函數(shù),建立了一大堆服務(wù),并AddService到service Manager。 ??main() @ com/android/server/SystemServer ??{ ??init1(); ??} ??Init1()是在Native空間實(shí)現(xiàn)的(com_andoird_server_systemServer.cpp)。我們一看這個(gè)函數(shù)就知道了,init1->system_init() @System_init.cpp ?? ??在system_init()我們看到了循環(huán)閉合管理框架。 ??{ ??Call "com/android/server/SystemServer", "init2" ??….. ??ProcessState::self()->startThreadPool(); ??? ? IPCThreadState::self()->joinThreadPool(); ??} ?? ??init2()@SystemServer.java中建立了Android中所有要用到的服務(wù)。 ??這個(gè)init2()建立了一個(gè)線程,來(lái)New Service和AddService來(lái)建立服務(wù) ?? ??第三步 Home啟動(dòng)? ?盛世游戲:http://www.shengshiyouxi.com ??在ServerThread@SystemServer.java后半段,我們可以看到系統(tǒng)在啟動(dòng)完所有的Android服務(wù)后,做了這樣一些動(dòng)作: ??(1) 使用xxx.systemReady()通知各個(gè)服務(wù),系統(tǒng)已經(jīng)就緒。 ??(2)??特別對(duì)于ActivityManagerService.systemReady(回調(diào)) ??Widget.wallpaper,imm(輸入法)等ready通知。 ?? ??Home就是在ActivityManagerService.systemReady()通知的過(guò)程中建立的。下面是ActivityManagerService.systemReady()的偽代碼: ??systemReady()@ActivityManagerService.java ??resumeTopActivityLocked() ??startHomeActivityLocked();//如果是第一個(gè)則啟動(dòng)HomeActivity。 ??startActivityLocked(。。。)CATEGORY_HOME ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? |
轉(zhuǎn)載于:https://www.cnblogs.com/dyllove98/p/3186908.html
總結(jié)
以上是生活随笔為你收集整理的http://www.shengshiyouxi.com的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 从零开始:iOS(三)
- 下一篇: Debian卸载iceweasel