《Android开机启动流程.docx》由会员分享,可在线阅读,更多相关《Android开机启动流程.docx(14页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Android的开机流程1. 系统引导bootloader1) 源码:bootable/bootloader/*2) 说明:加电后后,CPPU将先先执行bboottloaaderr程序,此处有有三种选选择a) 开机按按Cammeraa+Poowerr启动到到fasstbooot,即命令令或SDD卡烧写写模式,不加载载内核及及文件系系统,此此处可以以进行工工厂模式式的烧写写b) 开机按按Homme+PPoweer启动动到reecovveryy模式,加载rrecooverry.iimg,reccoveery.imgg包含内内核,基基本的文文件系统统,用于于工程模模式的烧烧写c) 开机按按Powwe
2、r,正常启启动系统统,加载载booot.iimg,booot.iimg包包含内核核,基本本文件系系统,用用于正常常启动手手机(以以下只分分析正常常启动的的情况)2. 内内核keerneel1) 源码:kerrnell/*2) 说明:kerrnell由boootlloadder加加载3. 文文件系统统及应用用iniit1) 源码:sysstemm/coore/iniit/*2) 配置文文件:ssysttem/roootdiir/iinitt.rcc,3) 说明:iniit是一一个由内内核启动动的用户户级进程程,它按按照innit.rc中中的设置置执行:启动服服务(这这里的服服务指llinuux底
3、层层服务,如addbd提提供addb支持持,voold提提供SDD卡挂载载等),执行命命令和按按其中的的配置语语句执行行相应功功能4. 重重要的后后台程序序zyggotee1) 源码:fraamewworkks/bbasee/cmmds/appp_maain.cppp等2) 说明:zyggotee是一个个在innit.rc中中被指定定启动的的服务,该服务务对应的的命令是是/syysteem/bbin/appp_prroceessa) 建立JJavaa Ruuntiime,建立虚虚拟机b) 建立SSockket接接收AcctivvityyMannanggerSServvicee的请求求,用于于F
4、orrk应用用程序c) 启动SSysttem Serrverr5. 系系统服务务sysstemm seerveer1) 源码:fraamewworkks/bbasee/seerviicess/jaava/comm/anndrooid/serrverr/SyysteemSeerveer.jjavaa2) 说明:被zyygotte启动动,通过过Sysstemm Maanagger管管理anndrooid的的服务(这里的的服务指指fraamewworkks/bbasee/seerviicess下的服服务,如如卫星定定位服务务,剪切切板服务务等)6. 桌桌面laaunccherr1) 源码:Actti
5、viityMManaagerrSerrvicce.jjavaa为入口口,paackaagess/appps/lauunchher*实现2) 说明:系统启启动成功功后SyysteemSeerveer使用用xxxx.syysteemReeadyy()通通知各个个服务,系统已已经就绪绪,桌面面程序HHomee就是在在ActtiviityMManaagerrSerrvicce.ssysttemRReaddy()通知的的过程中中建立的的,最终终调用()启llaunncheer7. 解解锁1) 源码:fraamewworkks/ppoliiciees/bbasee/phhonee/coom/aandrro
6、idd/innterrnall/pooliccy/iimpll/*llockk*2) 说明:系统启启动成功功后SyysteemSeerveer调用用wm.sysstemmReaady()通知知WinndowwMannageerSeerviice,进而调调用PhhoneeWinndowwMannageer,最最终通过过LocckPaatteernKKeygguarrdViiew显显示解锁锁界面,跟踪代代码可以以看到解解锁界面面并不是是一个AActiivitty,这这是只是是向特定定层上绘绘图,其其代码了了存放在在特殊的的位置8. 开开机自启启动的第第三方应应用程序序1) 源码:fraamewwo
7、rkks/bbasee/seerviicess/jaava/comm/anndrooid/serrverr/amm/AcctivvityyMannageerSeerviice.javva2) 说明:系统启启动成功功后SyysteemSeerveer调用用ActtiviityMManaagerrNattivee.geetDeefauult().ssysttemRReaddy()通知AActiivittyMaanagger启启动成功功,AcctivvityyMannageer会通通过置变变量mBBoottingg,通知知它的另另一线程程,该线线程会发发送广播播anddroiid.iinteent.
8、acttionn.BOOOT_COMMPLEETEDD以告知知已注册册的第三三方程序序在开机机时自动动启动。9. 总总结综上上所述,系统层层次关于于启动最最核心的的部分是是zyggotee(即aapp_proocesss)和和sysstemm seerveer,zzygoote它它负责最最基本的的虚拟机机的建立立,以支支持各个个应用程程序的启启动,而而sysstemm seerveer用于于管理aandrroidd后台服服务,启启动步骤骤及顺序序。10.参参考httpp:/bloog.ccsdnn.neet/bbasoonjiiangg_szz/caateggoryy/64483999.aas
9、pxxAndrroidd 启动动过程详详解Andrroidd从Liinuxx系统启启动有44个步骤骤;(1) iniit进程程启动(2) Nattivee服务启启动(3) Sysstemm Seerveer,AAndrroidd服务启启动(4) Homme启动动总体启动动框架图图如:第一步:iniitiaal进程程(syysteem/ccoree/innit) innit进进程,它它是一个个由内核核启动的的用户级级进程。内核自自行启动动(已经经被载入入内存,开始运运行,并并已初始始化所有有的设备备驱动程程序和数数据结构构等)之之后,就就通过启启动一个个用户级级程序iinitt的方式式,完成成引
10、导进进程。iinitt始终是是第一个个进程.Initt.rccInitt.maarveell.rcInitt进程一一起来就就根据iinitt.rcc和innit.xxxx.rcc脚本文文件建立立了几个个基本的的服务:serrviccemaanammgerr zyggotee 。最后Innit并并不退出出,而是是担当起起prooperrty serrvicce的功功能。1.1脚脚本文件件inittSyysteem/CCoree/InnitInitt.c: paarsee_coonfiig_ffilee(Innit.rc) parrse_connfigg_fiile(Iniit.mmarvvel.
11、rc)解析脚本本文件:Iniit.rrc和IInitt.xxxxx.rc(硬件平平台相关关)Initt.rcc是Anndrooid自自己规定定的初始始化脚本本(Anndrooid Iniit LLangguagge, Sysstemm/Coore/Iniit/rreaddme.txtt)该脚本包包含四个个类型的的声明:Actiionss Commmandds Servvicees Optiionss. 1.2 服务启启动机制制我们来看看看Innit是是这样解解析.rrc文件件开启服服务的。(1)打打开.rrc文件件,解析析文件内内容 sysstemm/coore/iniit/iinitt.c将
12、serrvicce信息息放置到到serrvicce_llistt中。 syysteem/ccoree/innit parrserr.c(2)rresttartt_seerviice() sysstemm/coore/iniit/iinitt.c serrvicce_sstarrt exeecvee().建立立serrvicce进程程。第二步 Zyggotee Serrviccemaanagger和和zyggotee进程就就奠定了了Anddroiid的基基础。ZZygoote这这个进程程起来才才会建立立起真正正的Anndrooid运运行空间间,初始始化建立立的Seerviice都都是Naavti
13、ive serrvicce.在在.rcc脚本文文件中zzygoote的的描述:servvicee zyygotte /sysstemm/biin/aapp_proocesss -Xzyygotte /sysstemm/biin -zyygotte -sttartt-syysteem-sservver所以Zyygotte从mmainn()frrameeworrks/basse/ccmdss/appp_mmainn.cppp开始始。(1) maiin()fframmewoorkss/baase/cmdds/aapp_maiin.ccpp建立Jaava Runntimme runttimee.stt
14、artt(ccom.anddroiid.iinteernaal.oos.ZZygooteIInitt, staartSSysttemSServver); (2) runntimme.sstarrtAAndrroiddRunntimme.ccpp建立虚拟拟机 运行:ccom.anddroiid.iinteernaal.oos.ZZygooteIInitt:maain函函数。 (3)mmainn()comm.anndrooid.intternnal.os.ZyggoteeIniit/正真的的Zyggotee。regiisteerZyygotteSoockeet();/登记LListten端端口 s
15、tarrtSyysteemSeerveer(); 进入Zyygotte服务务框架。 经过这几几个步骤骤,Zyygotte就建建立好了了,利用用Socckett通讯,接收AActiivittyMaananngerrSerrvicce的请请求,FForkk应用程程序。第三步 Sysstemm SeerveerstarrtSyysteemSeerveerccom.anddroiid.iinteernaal.oos.ZZygooteIInitt在Zyygotte上fforkk了一个个进程:coom.aandrroidd.seerveer.SSysttemSServver.于是SSysttemSServ
16、ver(SyysteemSeerveer.jjavaa)就建建立了。Anddroiid的所所有服务务循环框框架都是是建立SSysttemSServver(SyysteemSeerveer.jjavaa)上。在SyysteemSeerveer.jjavaa中看不不到循环环结构,只是可可以看到到建立了了iniit2的的实现函函数,建建立了一一大堆服服务,并并AdddSerrvicce到sservvicee Maanagger。mainn() ccom/anddroiid/sservver/SysstemmSerrverr iniit1();Initt1()是在NNatiive空空间实现现的(cco
17、m_anddoirrd_sservver_sysstemmSerrverr.cppp)。我们一一看这个个函数就就知道了了,innit11-ssysttem_iniit() SSysttem_iniit.ccpp在sysstemm_innit()我们们看到了了循环闭闭合管理理框架。 Calll comm/anndrooid/serrverr/SyysteemSeerveer, iinitt2 . ProocesssSttatee:sselff()-sttarttThrreaddPoool(); IPPCThhreaadSttatee:sselff()-jooinTThreeadPPooll();
18、initt2()SyysteemSeerveer.jjavaa中建立立了Anndrooid中中所有要要用到的的服务。这个innit22()建建立了一一个线程程,来NNew Serrvicce和AAddSServvicee来建立立服务第三步 Homme启动动在SerrverrThrreaddSyysteemSeerveer.jjavaa后半段段,我们们可以看看到系统统在启动动完所有有的Anndrooid服服务后,做了这这样一些些动作:(1) 使用xxxx.sysstemmReaady()通知知各个服服务,系系统已经经就绪。(2) 特别别对于AActiivittyMaanaggerSServvic
19、ee.syysteemReeadyy(回调调) Widdgett.waallppapeer,iimm(输入法法)等rreaddy通知知。Homee就是在在ActtiviityMManaagerrSerrvicce.ssysttemRReaddy()通知的的过程中中建立的的。下面面是AcctivvityyMannageerSeerviice.sysstemmReaady()的伪伪代码:systtemRReaddy()AcctivvityyMannageerSeerviice.javva ressumeeToppActtiviityLLockked() staartHHomeeActtiviity
20、LLockked();/如果果是第一一个则启启动HoomeAActiivitty。 staartAActiivittyLoockeed(。)CATTEGOORY_HOMMEAndrroidd Boootiing:initt iss thhe ffirsst pproccesss affterr keerneel sstarrtedd. TThe corrressponndinng ssourrce codde lliess inn: ddeviice/sysstemm/innit. Itt dooes thee foolloowinng ttaskks sstepp byy sttep: 1.
21、Innitiialiize logg syysteem. 2.Paarsee /iinitt.rcc annd /iniit.%harrdwaare%.rcc. 3. EExeccutee eaarlyy-innit acttionn inn thhe ttwo filles parrsedd inn sttep 2. 4. DDeviice speeciffic iniitiaalizze. Forr exxampple, maake alll deevicce nnodee inn /ddev andddowwnlooad firrmwaaress. 5. IInittiallizee p
22、rropeertyy syysteem. Acttuallly thee prropeertyy syysteem iis wworkkingg ass a shaare memmoryy. LLogiicallly it loooks likke aa reegisstryy unnderr Wiindoows sysstemm. 6. EExeccutee innit acttionn inn thhe ttwo filles parrsedd inn sttep 2. 7. SStarrt pproppertty sservvicee. 8. EExeccutee eaarlyy-boo
23、ot andd booot acttionns iin tthe twoo fiiless paarseed iin sstepp 2. 9. EExeccutee prropeertyy acctioon iin tthe twoo fiiless paarseed iin sstepp 2. 10.Entter intto aan iindeefinnitee looop to waiit ffor devvicee/prropeertyy seet/cchilld pproccesss exxit eveentss. FFor exaamplle, if an SD carrd iis
24、ppluggineed, iniit wwilll reeceiive a ddeviice addd evventt, sso iit ccan makke nnodee foor tthe devvicee. MMostt off thhe iimpoortaant proocesss iis fforkked in iniit, so if anyy off thhem craasheed, iniit wwilll reeceiive a SSIGCCHLDD thhen traansllatee itt innto a cchilld pproccesss exxit eveent,
25、 soo inn thhe lloopp innit cann haandlle tthe proocesss eexitt evventt annd eexeccutee thhe ccommmandds ddefiinedd inn *.rc(it willl rrun commmannd oonreestaart). The .rcc fiile is a sscriipt fille ddefiinedd byy Anndrooid. Thhe ddefaaultt iss deevicce/ssysttem/roootdiir/iinitt.rcc. WWe ccan takke a
26、a looot at thee fiile forrmatt(deevicce/ssysttem/iniit/rreaddme.txtt iss a goood ooverralll inntrooducctioon oof tthe scrriptt). Bassicaallyy thhe sscriipt fille cconttainns aactiionss annd sservvicees. Actiionss Actiionss arre nnameed ssequuencces of commmannds. Acctioons havve aa trriggger whiich
27、is useed tto ddeteermiine wheen tthe acttionn shhoulld ooccuur. Whhen an eveent occcurss whhichh maatchhes an acttionns triiggeer, thaat aactiion is addded to thee taail of a tto-bbe-eexeccuteed qqueuue (unllesss itt iss allreaady on thee quueuee). Eachh acctioon iin tthe queeue is deqqueuued in seq
28、quennce andd eaach commmannd iin tthatt acctioon iis eexeccuteed iin ssequuencce. Innit hanndlees ootheer aactiivittiess (ddeviice creeatiion/desstruuctiion, prropeertyy seettiing, prroceess resstarrtinng) beetweeen thhe eexeccutiion of thee coommaandss inn acctivvitiies. Actiionss taake thee foorm
29、of: on . Servvicees Servvicees aare proograams whiich iniit llaunnchees aand (opptioonallly) reestaartss whhen theey eexitt. Serrvicces takke tthe forrm oof: servvicee * . Optiionss Optiionss arre mmodiifieers to serrvicces. TTheyy afffecct hhow andd whhen iniit rrunss thhe sservvicee. Trigggerrs Tr
30、igggerrs aare strringgs wwhicch ccan be useed tto mmatcch ccerttainn kiindss off evventts aand useed tto ccausse aan aactiion to occcur. The buiiltiin ssuppportted commmannds aree deefinned in devvicee/syysteem/iinitt/keeywoordss.h. Coommaandss arre iimpllemeentdd inn deevicce/ssysttem/iniit/bbultti
31、nss.c. The iniit pproggramm onnly exeecuttes fivve kkindds oof ttrigggerrs: “eaarlyy-innit”, “iniit”, “eearlly-bboott”, “booot”, “prooperrty:*”. Taake a llookk att thhe ffolllowiing linne iin ddefaaultt innit.rc. classs_sstarrt ddefaaultt Thiss liine is a ccommmandd foor tthe acttionn coorreespoondi
32、ing to “booot” trriggger. Itt wiill staart alll seerviicess whhosee cllasss naame equualss too “ddefaaultt”. By deffaullt, if no claass opttionn iss deefinned forr a serrvicce, thee seerviices cclasss nnamee iss “ddefaaultt”. So thiis llinee wiill staart alll thhe sservvicees iin tthe ordder of poss
33、itiion in thee fiile by deffaullt. (BTTW, youu caan sstarrt aany serrvicce uusinng sstarrt ccommmandds, if youu liike.) AAny serrvicce iis rrun as a fforkked proocesss oof iinitt, ttakee a loook aat tthe souurcee coode of serrvicce_sstarrt iin ddeviice/sysstemm/innit.c. So aaccoordiing to thee deefa
34、uult iniit.rrc, thee foolloowinng sservvicees wwilll bee exxecuutedd sttep by steep: conssolee: sstarr a sheell. Thhe ssourrce is in devvicee/syysteem/bbin/ashh. adbdd: sstarrt aadb daeemonn. TThe souurcee iss inn deevicce/ttoolls/aadbdd. BBy ddefaaultt iss diisabbledd. servviceemannageer: staart bi
35、nnderr syysteem. Thee soourcce iis iin ddeviice/commmannds/binnderr. mounntd: moountt alll ffs ddefiinedd inn /ssysttem/etcc/moounttd.cconff iff sttartted, reeceiive commmannds thrrouggh llocaal ssockket to mouunt anyy fss. TThe souurcee iss inn deevicce/ssysttem/binn/moounttd. debuuggeerd: sttartt
36、deebugg syysteem. Thee soourcce iis iin ddeviice/sysstemm/biin/ddebuuggeerd. rildd: sstarrt rradiio iinteerfaace layyer daeemonn. TThe souurcee iss inn deevicce/ccommmandds/rrindd. zygoote: sttartt Anndrooid Javva RRunttimee annd sstarrt ssysttem serrverr. IItss thhe mmostt immporrtannt sservvicee.
37、TThe souurcee iss inn deevicce/sservverss/appp. mediia: staart AuddioFFlinngerr, MMediiaPllayeerSeerviice andd CaamerraSeerviice. Thhe ssourrce is in devvicee/coommaandss/meediaaserrverr. boottsouund: pllay thee deefauult booot ssounnd /sysstemm/meediaa/auudioo/uii/booot.mp33. TThe souurcee iss inn
38、deevicce/ccommmandds/pplayymp33. dbuss: sstarrt ddbuss daaemoon, its oonlyy ussed by BluueZ. Thhe ssourrce is in devvicee/syysteem/BBlueetoooth/dbuus-ddaemmon. hcidd: rrediirecct hhcidds stddoutt annd sstdeerr to thee Anndrooid loggginng ssysttem. Thhe ssourrce is in devvicee/syysteem/bbin/loggwraap
39、peer. By deffaullt iis ddisaableed. hfagg: sstarrt BBlueetoooth hanndsffreee auudioo gaatewway, itts onlly uusedd byy BllueZZ. TThe souurcee iss inn deevicce/ssysttem/Bluuetooothh/blluezz-uttilss. BBy ddefaaultt iss diisabbledd. hsagg: sstarrt BBlueetoooth heaadseet aaudiio ggateewayy, iitss onnly u
40、seed bby BBlueeZ. Thee soourcce iis iin ddeviice/sysstemm/Blluettootth/bblueez-uutills. By deffaullt iis ddisaableed. insttallld: staart insstalll ppackkagee daaemoon. Thee soourcce iis iin ddeviice/serrverrs/iinsttallld. flassh_rrecooverry: loaad /sysstemm/reecovveryy.immg. Thee soourcce iis iin dd
41、eviice/commmannds/reccoveery/mtddutiils. Zygoote serrvicce ddoess thhe ffolllowiing tassks steep bby sstepp: 1. CCreaate JAVVA VVM. 2. RRegiisteer aandrroidd naativve ffuncctioon ffor JAVVA VVM. 3. CCalll thhe mmainn fuuncttionn inn thhe JJAVAA cllasss naamedd coom.aandrroidd.innterrnall.oss.Zyygott
42、eInnit whoose souurcee iss deevicce/jjavaa/anndrooid/comm/anndrooid/intternnal/os/ZyggoteeIniit.jjavaa. a) Loaad ZZygooteIInitt cllasss b) Reggistter zyggotee soockeet c)Loaad pprelloadd cllassses(thee deefauult fille iisdeevicce/jjavaa/anndrooid/preeloaadedd-cllassses) d) Loaad pprelloadd reesouurc
43、ees e) Calll ZZygoote:foorkSSysttemSServver (immpleemenntedd inn deevicce/ddalvvik/vm/IntternnalNNatiive.c) to forrk aa neew pproccesss. IIn tthe neww prroceess, caall thee maain funnctiion in thee JAAVA claass nammed comm.anndrooid.serrverr.SyysteemSeerveer, whoose souurcee iss inn deevicce/jjavaa/
44、seerviicess/coom/aandrroidd/seerveer. i. Looad libbanddroiid_sservverss.soo iii. Calll JJNI nattivee innit11 fuuncttionn immpleemenntedd inn deevicce/llibss/anndrooid_serrverrs/ccom_anddroiid_sservver_SysstemmSerrverrs. It onlly ccallls ssysttem_iniit iimpllemeenteed iin ddeviice/serrverrs/ssysttem/libbrarry/ssysttem_iniit.ccpp. l If runnninng oon ssimuulattor, innstaantiiate