下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、An droid系統(tǒng)啟動過程詳解An droid系統(tǒng)啟動過程首先An droid 框架架構(gòu)圖:(來自網(wǎng)上,我覺得這張圖看起來很清晰)AppikationI HomeCon: actsPhoneBrowserApip heat Ion FrameworkAciiwiiyManagerWiinOOiifMManagerCdnien:ProviderVievjSystemMafagerPackageManagerTelephony ManagerResourceLX3TOniXMIPPManagerManagerServicefLinux內(nèi)核啟動之后就到An droid Init進(jìn)程,進(jìn)而啟動An
2、droid相關(guān)的服務(wù)和 應(yīng)用。啟動的過程如下圖所示:(圖片來自網(wǎng)上,后面有地址)StfflscrSmist幕ar啤ETWshUfw內(nèi) dogeXinaiTPrH&OdARSwvice扣譏山帥藤孔皿豁詩耳皿F麗丿ril-daemonmediaDaJvit VMZveotcServiceZygote ForkbootsoutidbootanimervicemanagerrapertyinitF面將從Android4.0源碼中,和網(wǎng)絡(luò)達(dá)人對此的總結(jié)中,對此過程加以學(xué)習(xí)了解和總結(jié),以下學(xué)習(xí)過程中代碼片段中均有省略不完整,請參照源碼。Init進(jìn)程的啟動init進(jìn)程,它是一個由內(nèi)核啟動的用戶級進(jìn)程。內(nèi)核自
3、行啟動(已經(jīng)被載入 內(nèi)存,開始運行, 并已初始化所有的設(shè)備驅(qū)動程序和數(shù)據(jù)結(jié)構(gòu)等)之后,就通過啟動一個用戶級程 序init的方式,完成引導(dǎo)進(jìn)程。init始終是第一個進(jìn)程。啟動過程就是代碼in it.c中ma in函數(shù)執(zhí)行過程:systemcorei niti nit. c在函數(shù)中執(zhí)行了:文件夾建立,掛載,rc文件解析,屬性設(shè)置,啟動服務(wù),執(zhí) 行動作,socket監(jiān)聽F面看兩個重要的過程:rc文件解析和服務(wù)啟動。1 rc文件解析.rc文件是An droid 使用的初始化腳本文件(System/Core/I nit/readme.txt中有描述:four broad classes of state
4、me ntswhich are Acti ons , Comma ndsServices , and Options .)其中Comma nd 就是系統(tǒng)支持的一系列命令,如:export ,host name , mkdir ,mount,等等,其中一部分是 linux 命令,:啟動服務(wù),還有一些是 an droid 添加的,女口: class.start clasSjSto pvserviceclass :關(guān)閉服務(wù),等等。其中Options是針對Service 的選項的。系統(tǒng)初始化要觸發(fā)的動作和要啟動的服務(wù)及其各自屬性都在義。 具體看一下啟動腳本:systemcorerootdiri nit
5、.rcrc腳本文件中定中:systemcorei nitl nit_p arser.c:init_parse_config_file()存入到在解析rc腳本文件時,將相應(yīng)的類型放入各自的Listacti on .queue 、 action.list 、 servicejist中,解析過程可以看一下parseCo nfig函數(shù),類似狀態(tài)機(jī)形式挺有意思。、vold、ril-daemon 、deb這其中包含了服務(wù):adbd、servicemanager uggerd、surfacefl in ger、zygote、media 2服務(wù)啟動list 中。文件解析完成之后將service放入到servi
6、cej文件解析完成之后將service放入到service.list中。systemcorei ni tbuilti ns.cService的啟動是在do_class_start 函數(shù)中完成:intdo_class_start(nt nargs, char *args)service_for_each_class(args1 , service_start_if_ no t_disabled); return 0;遍歷所有名稱為class name,狀態(tài)不為SVC_DISABLED 的Service啟動Civoid service_for_each_classconst char *class
7、name,void (*func)( struct service *svc)static void service_start_if_not_disabled(struct service *svc) if (!(svc-flags & SVC_DISABLED) service_start(svc, NULL);do_class_start對應(yīng)的命令:KEYWORD(class_start,COMMAND, 1, do_class_start)init.rc 文件中搜索 class start:class_start main 、class_start core、main、core 即為
8、do classstart 參數(shù) class namein it.rc 文件中 Service class 名稱都是 ma in :service drm /system/bin/drmserverclass mainservice surfacefli nger/system/bi n/surfacefli ngerclassmain于是就能夠通過main名稱遍歷到所有的Service,將其啟動。do_class start調(diào)用:in it.rconboot / actionclass_startcore/ 執(zhí)行 comma nd 對應(yīng) do_class_startInitclass_sta
9、rtmain進(jìn)程main函數(shù)中:中:system/core/i nit/i nit.c|Lint main()/掛在文件/解析配置文件:in it.rc/初始化化 action queuefor(;)execute, on e_comma nd();restartpro cesses();for (i = 0; i fd_count; i+) if (ufdsi.revents = POLLIN) if (ufdsi.fd = get_property_set_fd()han dle_ prop erty_set_fd();elseif (ufdsi.fd = get_keychord_fd(
10、)han dle_keychord();elseif (ufdsi.fd = get_signal_fd()han dle_sig nal();循環(huán)調(diào)用service的service 狀態(tài)設(shè)置為SVC RUNNING。start ,將狀態(tài)SVC_RESTARTING 啟動,將啟動后pid=fork();execveO;在消息循環(huán)中:d 的 NativeServiceInit進(jìn)程執(zhí)行了,監(jiān)聽 ServiceAn droid 的 Comma nd ,啟動了 Androi 的變化需求,Signal處理。Init進(jìn)程是作為屬性服務(wù)(Propertyservice ),維護(hù)這些 NativeServic
11、eServiceMa nager啟動在.rc腳本文件中zygote的描述:service servicema nager /system/b in /servicema nager class core user system group systemcriticalon restart restart zygoteon restart restart mediaon restart restart surfaceflingeron restart restart drmServiceManager用來管理系統(tǒng)中所有的binder service,不管是本地的c+實現(xiàn)的還是java語言實現(xiàn)的都
12、需要這個進(jìn)程來統(tǒng)一管理,最主要的管理就是,注冊添加服務(wù),獲取服務(wù)。所有的 S ervice 使用前都必須先在 servicemanager中進(jìn)行注冊。do find servicedo_add_servicesvcmgr_ha ndler(代碼位置:frameworksbasecmdsservicemanagerService_mana ger.c三Zygote 進(jìn)程的啟動Zygote這個進(jìn)程是非常重要的一個進(jìn)程,Zygote進(jìn)程的建立是真正的A ndroid 運行空間,初始化建立的 Service 都是Navtive service.(1)在.rc腳本文件中zygote的描述:czservi
13、ce zygote /system/bin/app_process -Xzygote /system/bin -zygote -start-system- serverclass mainsocket zygote stream 666on restart write /sys/a ndroid _po wer/request_state wakeon restart write /sys/power/state onon restart restart mediaon restart restart netd參數(shù):-zygote -start-system-server代碼位置:framew
14、orks/base/cmds/a pp_p rocess/a pp_mai n.cpp上面的參數(shù)在這里就會用上,決定是否要啟動和啟動那些進(jìn)程。int main( )AppRun time run time;if (zygote) runtime.start(ernal.os.Zygotelnit,startSystemServer ? start-system-server:”);class AppRuntime : public AndroidRuntime;(2) 接著到了 AndroidRuntime類中:voidjni AndroidRuntime.cpp
15、start(const char* className, const char* options)/ start the virtual machine Java在虛擬機(jī)中運行的 JNIEnv* env;if (startVm(&mJavaVM, &env) != 0) return;/向剛剛新建的虛擬機(jī)注冊JNI本地接口if (startReg(env) GetStaticMethodlD(startClass,ma in ,(Ljava/la ng/Stri ng;)V);/ jni調(diào)用java方法,調(diào)用到 Zygote In it類的ma in函數(shù)jclass startClass =
16、en v- Fin dClass(className);en v-CallStaticVoidMethod(startClass, startMeth, strArray);至U了 Zygote In it.java中的靜態(tài)main函數(shù)中,從C+JAVA(3) ZygoteInit真正Zygote 進(jìn)程:frameworksbasecorejavacoma ndroidi nternalosZygote In it.javapublicstatic void main(String argv) /Registers a server socket for zygote comma nd con
17、nections registerZygoteSocketO;/Loads and initializes commonly used classes and /used resources that can be shared across pro cesses p reload();/ Do an in itial gc to clea n up after start up gc();if (argv1.equals(start-system-server) startSystemServer();* Runs the zygote pro cesss select loop. Acce
18、 pts new connections as* they happen, and reads comma nds from connections one spawn-requests* worth at a time.*/runSelectLoopMode();/loop 中/* Close and clean up zygote sockets. Called on shutdown and on the* childs exit path.*/closeServerSocket();程,Zygote 就建立好了,利用Socket通訊,接收請求,F(xiàn)ork應(yīng)用程序進(jìn) 進(jìn)入Zygote 進(jìn)程
19、服務(wù)框架中。SystemServer啟動);(1 )在Zygote 進(jìn)程進(jìn)入循環(huán)之前,調(diào)用了 startSystemServer(private static boolean startSystemServer()/* Request to fork the system server process 孵化新的進(jìn)程 */ZygoteC onnection .Argume nts p arsedArgs = nu ll; pid = Zygote.forkSystemServer(p arsedArgs.uid, p arsedArgs.gid,p arsedArgs.gids,p arsedA
20、rgs.debugFlags,n ull,p arsedArgs .p ermittedCa pabilities,p arsedArgs.effectiveCa pabilities);/* For child process對新的子進(jìn)程設(shè)置 */ if (pid = 0) han dleSystemServer Process( parsedArgs);voidhan dleSystemServerProcess (p arsedArgs) closeServerSocket();/system_serverProcess.setArgVO (p arsedArgs .ni ceName)
21、;/Pass the remaining arguments to SystemServer.Run timeI nit.zygotel nit( parsedArgs.targetSdkVersio n, p arsedArgs.rema inin gArgs);/* should never reach here */(2)Run time Init中:frameworksbasecorejavacoma ndroidi ntemalosR un timeI nit.javaCizygote In it( int targetSdkVers ion, Strin g argv)applic
22、ationinit(targetSdkVersion, argv);/The main function called when started through the zygote process. voidvoidapplicationInit( int targetSdkVersion, String argv)/ Remaining arguments are passed to the start classs static main in vokeStaticMa in( args.startClass, args.startArgs);void invokeStaticMain(
23、String className, String argv)Classv? cl;cl = Class.forName(className);/ 獲取 SystemServer 的 ma in 方法,拋出 MethodA ndArgsCaller 異常 Method m;m = cl.getMethod(main, new Class String. class );int modifiers = m.getModifiers();throw new ZygoteInit.MethodAndArgsCaller(m, argv);開始執(zhí)行并沒有去調(diào)用Systemserver 的任(3)從 st
24、artSystemServer 何方法,只是通過反射獲取了拋出了 MethodAndArgsCallerma in 方法,付給了 MethodA ndArgsCaller,并異常。此異常是在哪里處理的呢?回到startSystemServer()函數(shù)的調(diào)用處:在Zygotelnit 的main函數(shù)中:Hip ublicstatic void try main(String argv) if(argv1.equals(start-system-server) startSystemServer();/這里如果拋出異常,跳過下面流程run SelectLo opM ode();/loop 中cat
25、ch (MethodAndArgsCaller caller) caller.ru n();/處理的異常拋出了異常,跳過執(zhí)行ZygoteInit 進(jìn)程的循環(huán),女口果 startSystemServer這是怎么回事呢?在 startSystemServer 中異常是由 handleSystemServerProcess拋出,而pid = Zygote. forkSystemServer/*For child process僅對新的子進(jìn)程設(shè)置 */if(pid0) (p arsedArgs);han dIeSystemServer Process/若成功調(diào)用,則返回兩次:Zygote. forkS
26、ystemServer根據(jù)參數(shù)fork出一個子進(jìn)程,一次返回的是zygotepid,值等于0否則,出錯返回進(jìn)程的pid,值大于0 ; 次返回的是子進(jìn)程-1 ;caller .run ();MethodA ndArgsCallerrun函數(shù):調(diào)用前面所提到的/SystemServermain 方法m = cl.getMethod(mai n,new Class String.class );啟動了進(jìn)程 SystemServer 。(4)SystemServer 的執(zhí)行 init1()/frameworksbaseservicesjavacoma ndroidserverSys temServer
27、.javap ublicstatic void main(String args) System.loadLibrary(a ndroid_servers);/* This method is called from Zygote to initialize the system.* This will cause the nativeservices (SurfaceFlinger, AudioFlinger, etc.)* to be started. After that it* up in to in it2() to start the*/init1(args); /native 完
28、了回調(diào) init2(will callAn droidback services./i nit1:frameworks/base/services/j ni/com_a ndroid_server_SystemServer.c pp:a ndroid_ser ver_SystemServer_i nit1()中調(diào)用:system_initextern C status_t system_init()spvP rocessState proc(P rocessState:self(); spv IServiceMa nager sm = defaultServiceMa nager();啟動Su
29、rfaceFlinger和傳感器property_get(system_init.startsurfaceflinger, propBuf, SurfaceFli nger:i nsta ntiate();1);prop erty_get(system_i nit.startse nsorservice, prop Buf, Sen sorService:i nsta ntiate();1);/ And now start the An droid run time. We have to/ of n ast in ess because the An droid run time in it
30、ializatio n requires / some of the core system services to already be started./ All other servers should just start the An droid run time at/ the beg inning of their p rocessess main (), before calli ng/ the init function.An droidR un time* run time = An droidR un time:getR un time();do this bit/回調(diào)
31、com.android.server.SystemServerinit2 方法JNIEnv* env = runtime-getJNIEnv();jclass clazz = en v-Fi ndClass(com/a ndroid/server/SystemServer);jmethodID methodId = env-GetStaticMethodlD(clazz, init2, ()V);env-CallStaticVoidMethod(clazz, methodId);啟動線程池做為binder服務(wù)Pro cessState:self()-startThread Po ol(); I
32、P CThreadState:self()-joi nThread Pool(); return NO_ERROR;Processstate每個進(jìn)程在使用 例來描述當(dāng)前進(jìn)程在bin der 機(jī)制通信時,均需要維護(hù)一個P rocessState實binder 通信時的binder 狀態(tài)。Processstate有如下2個主要功能:1.線程為該線程負(fù)責(zé)與內(nèi)核中的binder模塊進(jìn)行通信,稱該創(chuàng)建一個thread, Pool thread ;2.pBin der 對象。為指定的handle創(chuàng)建一個BpBinder對象,并管理該進(jìn)程中所有的BPool thread在 Binder IPC 中,通信,也
33、就是不停的讀寫所有進(jìn)程均會啟動一個BD,thread 來負(fù)責(zé)與BD 來直接對象,下面會介紹這個類型。();IP CThreadState:self()-join Thread Pool();這個線程的實現(xiàn)主體是一個IP CThreadStateF面是Pool thread 的啟動方式:P rocessState:self()-startThread PoolIP CThreadStateIP CThreadState也是以單例模式設(shè)計的。由于每個進(jìn)程只維護(hù)了一個ProcessState 實例,同時 ProcessState 只啟動一個 Pool thread ,也就是說每一個進(jìn)程只會啟動一個P
34、ool thread ,因此每個進(jìn)程則只需要一個IP CThreadState 即可。Pool thread 的實際內(nèi)容則為:(5)publicSystemServer 的執(zhí)行 init2()static final void init2() 建立線程來處理Thread thr = new ServerThread(); thr.setName(a ndroid.server.ServerThread); thr.start();看看線程ServerThread里面都做了什么事情?Public void run() addBootEvent(new String(Android:SysServ
35、erlnit_START); Looper.prep are();an droid.os. Process.setThread Priority(an droid.os. Process.THREAD_ PRIORITY_FOREGROUND);/初始化服務(wù),創(chuàng)建各種服務(wù)實例,如:電源、網(wǎng)絡(luò)、 Wifi、藍(lán)牙,USB 等,/初始化完成以后加入到ServiceMa nager中,/事我們用Context.getSystemService (String name)才獲取到相應(yīng)的服務(wù) Po werMa nagerService po wer = nu ll;NetworkMa nageme ntS
36、ervice n etworkMa nageme nt = n ull;WifiP2pService wifiP2p = null;Win dowMa nagerService wm = n ull;BluetoothService bluetooth = n ull;UsbService usb = n ull;NotificationManagerService notification 二 null;StatusBarMa nagerService statusBar = null;power = new PowerManagerService();ServiceMa nager.add
37、Service(Co ntext .PO WER_SERVICE, power);/ ActivityManagerService 作為 ApplicationFramework 最重要的服務(wù) ActivityMa nagerService.setSyste mP rocess();ActivityMa nagerService.i nstallSyste mP roviders();ActivityMa nagerService.self().setWi ndowMa nager(wm);/We now tell the activity manager it is okay to run third party code. It will call back into us once it has gotten to the state where third party code can really run (but before it has actually started laun chi ng the in itial app licati on s), for us to compl ete our in
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 技術(shù)咨詢協(xié)議書模板
- 抵押借款合同范本心得
- 漁業(yè)養(yǎng)殖權(quán)承包合同
- 專業(yè)外派培訓(xùn)協(xié)議樣本
- 合作伙伴協(xié)議:共同開發(fā)軟件合同樣本
- 投資策略實施指導(dǎo)書
- 2024年化工廠廠房出租協(xié)議模板
- 產(chǎn)學(xué)研合作框架協(xié)議范本
- 初中語文八上6《藤野先生》公開課一等獎創(chuàng)新教學(xué)設(shè)計
- 醫(yī)療臨床業(yè)務(wù)合作合同2024年
- 《材料分析測試技術(shù)》全套教學(xué)課件
- 六年級上冊數(shù)學(xué)課件-6.2 百分?jǐn)?shù)的認(rèn)識丨蘇教版 (共24張PPT)
- 【精品主題班會】高三家長會(共30張PPT)
- 工程項目軟硬件平臺和集成服務(wù)采購技術(shù)投標(biāo)文件
- 形位公差檢驗標(biāo)準(zhǔn)
- 限或禁用物質(zhì)管理標(biāo)準(zhǔn)
- 四年級上冊書法課件- 10蘭葉撇 |通用版 (共10張PPT)
- 初中語文人教九年級下冊命題作文扣題技巧設(shè)計
- 消防水池 (有限空間)作業(yè)安全告知牌及警示標(biāo)志
- 大學(xué)政府采購項目驗收報告(貨物服務(wù)類)
- 港口碼頭常用安全安全警示標(biāo)志
評論
0/150
提交評論