安卓启动过程.docx
- 文档编号:30559944
- 上传时间:2023-08-16
- 格式:DOCX
- 页数:22
- 大小:175.78KB
安卓启动过程.docx
《安卓启动过程.docx》由会员分享,可在线阅读,更多相关《安卓启动过程.docx(22页珍藏版)》请在冰豆网上搜索。
安卓启动过程
Android系统启动过程
首先Android框架架构图:
(来自网上,我觉得这张图看起来很清晰)
Linux内核启动之后就到AndroidInit进程,进而启动Android相关的服务和应用。
启动的过程如下图所示:
(图片来自网上,后面有地址)
下面将从Android4.0源码中,和网络达人对此的总结中,对此过程加以学习了解和总结,
以下学习过程中代码片段中均有省略不完整,请参照源码。
一Init进程的启动
init进程,它是一个由内核启动的用户级进程。
内核自行启动(已经被载入内存,开始运行,
并已初始化所有的设备驱动程序和数据结构等)之后,就通过启动一个用户级程序init的方式,完成引导进程。
init始终是第一个进程。
启动过程就是代码init.c中main函数执行过程:
system\core\init\init.c
在函数中执行了:
文件夹建立,挂载,rc文件解析,属性设置,启动服务,执行动作,socket监听……
下面看两个重要的过程:
rc文件解析和服务启动。
1rc文件解析
.rc文件是Android使用的初始化脚本文件(System/Core/Init/readme.txt中有描述:
fourbroadclassesofstatementswhichareActions,Commands,Services,andOptions.)
其中Command就是系统支持的一系列命令,如:
export,hostname,mkdir,mount,等等,其中一部分是linux命令,
还有一些是android添加的,如:
class_start
启动服务,class_stop
关闭服务,等等。
其中Options是针对Service的选项的。
系统初始化要触发的动作和要启动的服务及其各自属性都在rc脚本文件中定义。
具体看一下启动脚本:
\system\core\rootdir\init.rc
在解析rc脚本文件时,将相应的类型放入各自的List中:
\system\core\init\Init_parser.c :
init_parse_config_file()存入到
action_queue、 action_list、service_list中,解析过程可以看一下parse_config函数,类似状态机形式挺有意思。
这其中包含了服务:
adbd、servicemanager、vold、ril-daemon、debuggerd、surfaceflinger、zygote、media……
2服务启动
文件解析完成之后将service放入到service_list中。
system/core/init/init.c中:
[Java] 纯文本查看 复制代码
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
intmain(){
……
for(;;){
execute_one_command();
restart_processes();
for(i=0;i if(ufds.revents==POLLIN){ if(ufds.fd==get_property_set_fd()) handle_property_set_fd(); elseif(ufds.fd==get_keychord_fd()) handle_keychord(); elseif(ufds.fd==get_signal_fd()) handle_signal(); } } } } 循环调用service_start,将状态SVC_RESTARTING启动,将启动后的service状态设置为SVC_RUNNING。 pid=fork(); execve(); 在消息循环中: Init进程执行了Android的Command,启动了Android的NativeService,监听Service的变化需求,Signal处理。 Init进程是作为属性服务(Propertyservice),维护这些NativeService。 二ServiceManager启动 在.rc脚本文件中zygote的描述: [Java] 纯文本查看 复制代码 ? 1 2 3 4 5 6 7 8 9 serviceservicemanager/system/bin/servicemanager classcore usersystem groupsystem critical onrestartrestartzygote onrestartrestartmedia onrestartrestartsurfaceflinger onrestartrestartdrm ServiceManager用来管理系统中所有的binderservice,不管是本地的c++实现的还是java语言实现的都需要 这个进程来统一管理,最主要的管理就是,注册添加服务,获取服务。 所有的Service使用前都必须先在servicemanager中进行注册。 [Java] 纯文本查看 复制代码 ? 1 2 3 do_find_service() do_add_service() svcmgr_handler() 代码位置: frameworks\base\cmds\servicemanager\Service_manager.c 三Zygote进程的启动 Zygote这个进程是非常重要的一个进程,Zygote进程的建立是真正的Android运行空间,初始化建立的Service都是Navtiveservice. (1)在.rc脚本文件中zygote的描述: [Java] 纯文本查看 复制代码 ? 1 2 3 4 5 6 7 servicezygote/system/bin/app_process-Xzygote/system/bin--zygote--start-system-server classmain socketzygotestream666 onrestartwrite/sys/android_power/request_statewake onrestartwrite/sys/power/stateon onrestartrestartmedia onrestartrestartnetd 代码位置: frameworks/base/cmds/app_process/app_main.cpp 上面的参数在这里就会用上,决定是否要启动和启动那些进程。 [Java] 纯文本查看 复制代码 ? 1 2 3 4 5 6 7 8 9 intmain(){ AppRuntimeruntime; if(zygote){ runtime.start("com.android.internal.os.ZygoteInit", startSystemServer? "start-system-server": ""); } } classAppRuntime: publicAndroidRuntime{}; (2)接着到了AndroidRuntime类中: frameworks\base\core\jni\AndroidRuntime.cpp [Java] 纯文本查看 复制代码 ? 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 voidstart(constchar*className,constchar*options){ //startthevirtualmachineJava在虚拟机中运行的 JNIEnv*env; if(startVm(&mJavaVM,&env)! =0){ return; } //向刚刚新建的虚拟机注册JNI本地接口 if(startReg(env)<0){ return; } //jni调用java方法,获取对应类的静态main方法 jmethodIDstartMeth=env->GetStaticMethodID(startClass, "main","([Ljava/lang/String;)V"); //jni调用java方法,调用到ZygoteInit类的main函数 jclassstartClass=env->FindClass(className); env->CallStaticVoidMethod(startClass,startMeth,strArray); } 到了ZygoteInit.java中的静态main函数中,从C++——》JAVA (3)ZygoteInit 真正Zygote进程: [Java] 纯文本查看 复制代码 ? 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 publicstaticvoidmain(Stringargv[]){ //Registersaserversocketforzygotecommandconnections registerZygoteSocket(); //Loadsandinitializescommonlyusedclassesand //usedresourcesthatcanbesharedacrossprocesses preload(); //Doaninitialgctocleanupafterstartup gc(); if(argv[1].equals("start-system-server")){ startSystemServer(); } /** *Runsthezygoteprocess'sselectloop.Acceptsnewconnectionsas *theyhappen,andreadscommandsfromconnectionsonespawn-request's *worthatatime. */ runSelectLoopMode(); //loop中 /** *Closeandcleanupzygotesockets.Calledonshutdownandonthe *child'sexitpath. */ closeServerSocket(); } Zygote就建立好了,利用Socket通讯,接收请求,Fork应用程序进程,进入Zygote进程服务框架中。 四SystemServer启动 (1)在Zygote进程进入循环之前,调用了startSystemServer(); [Java] 纯文本查看 复制代码 ? 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 privatestaticbooleanstartSystemServer(){ /*Requesttoforkthesystemserverprocess孵化新的进程*/ ZygoteConnection.ArgumentsparsedArgs=null; pid=Zygote.forkSystemServer( parsedArgs.uid,parsedArgs.gid, parsedArgs.gids, parsedArgs.debugFlags, null, parsedArgs.permittedCapabilities, parsedArgs.effectiveCapabilities); /*Forchildprocess对新的子进程设置*/ if(pid==0){ handleSystemServerProcess(parsedArgs); } } voidhandleSystemServerProcess(parsedArgs){ closeServerSocket(); //"system_server" Process.setArgV0(parsedArgs.niceName); //PasstheremainingargumentstoSystemServer. RuntimeInit.zygoteInit(parsedArgs.targetSdkVersion, parsedArgs.remainingArgs); /*shouldneverreachhere*/ } (2)RuntimeInit中: frameworks\base\core\java\com\android\internal\os\RuntimeInit.java [Java] 纯文本查看 复制代码 ? 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 //Themainfunctioncalledwhenstartedthroughthezygoteprocess. voidzygoteInit(inttargetSdkVersion,String[]argv){ applicationInit(targetSdkVersion,argv); } voidapplicationInit(inttargetSdkVersion,String[]argv){ //Remainingargumentsarepassedtothestartclass'sstaticmain invokeStaticMain(args.startClass,args.startArgs); } voidinvokeStaticMain(StringclassName,String[]argv){ Class >cl; cl=Class.forName(className); //获取SystemServer的main方法,抛出MethodAndArgsCaller异常 Methodm; m=cl.getMethod("main",newClass[]{String[].class}); intmodifiers=m.getModifiers(); thrownewZygoteInit.MethodAndArgsCaller(m,argv); } (3)从startSystemServer开始执行并没有去调用SystemServer的任何方法, 只是通过反射获取了main方法,付给了MethodAndArgsCaller,并抛出了MethodAndArgsCaller异常。 此异常是在哪里处理的呢? 回到startSystemServer()函数的调用处: 在ZygoteInit的main函数中: [Java] 纯文本查看 复制代码 ? 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 publicstaticvoidmain(Stringargv[]){ try{ …… if(argv[1].equals("start-system-server")){ startSystemServer(); //这里如果抛出异常,跳过下面流程 } runSelectLoopMode(); //loop中 …… }catch(MethodAndArgsCallercaller){ caller.run(); //处理的异常 } } 如果startSystemServer抛出了异常,跳过执行ZygoteInit进程的循环,这是怎么回事呢? 在startSystemServer中异常是由handleSystemServerProcess抛出,而 pid=Zygote.forkSystemServer() /*Forchildprocess仅对新的子进程设置*/ if(pid==0){ handleSystemServerProcess(parsedArgs); } //Zygote.forkSystemServer根据参数fork出一个子进程,若成功调用,则返回两次: 一次返回的是zygote进程的pid,值大于0;一次返回的是子进程pid,值等于0否则,出错返回-1; caller.run(); MethodAndArgsCallerrun函数: 调用前面所提到的 //SystemServermain方法 m=cl.getMethod("main",newClass[]{String[].class}); 启动了进程SystemServer。 (4)SystemServer的执行init1() [Java] 纯文本查看 复制代码 ? 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 publicstaticvoidmain(String[]args){ System.loadLibrary("android_servers"); /* *ThismethodiscalledfromZygotetoinitializethesystem. *Thiswillcausethenativeservices(SurfaceFlinger,AudioFlinger,etc..) *tobestarted.Afterthatitwillcallback *upintoinit2()tostarttheAndroidservices. */ init1(args); //native完了回调init2() } //init1: frameworks/base/services/jni/com_android_server_SystemServer.cpp: : android_server_SystemServer_init1() 中调用: system_init extern"C"status_tsystem_init() { sp : self()); sp //启动SurfaceFlinger和传感器 property_get("system_init.startsurfaceflinger",propBuf,"1");
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 启动 过程