Android系统启动过程详解DOC_第1页
Android系统启动过程详解DOC_第2页
Android系统启动过程详解DOC_第3页
Android系统启动过程详解DOC_第4页
Android系统启动过程详解DOC_第5页
免费预览已结束,剩余17页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、An droid系统启动过程详解An droid系统启动过程首先An droid 框架架构图:(来自网上,我觉得这张图看起来很清晰)AppikationI HomeCon: actsPhoneBrowserApip heat Ion FrameworkAciiwiiyManagerWiinOOiifMManagerCdnien:ProviderVievjSystemMafagerPackageManagerTelephony ManagerResourceLX3TOniXMIPPManagerManagerServicefLinux内核启动之后就到An droid Init进程,进而启动An

2、droid相关的服务和 应用。启动的过程如下图所示:(图片来自网上,后面有地址)StfflscrSmist幕ar啤ETWshUfw內 dogeXinaiTPrH&OdARSwvice扣讥山帥藤孔皿豁诗耳皿F丽丿ril-daemonmediaDaJvit VMZveotcServiceZygote ForkbootsoutidbootanimervicemanagerrapertyinitF面将从Android4.0源码中,和网络达人对此的总结中,对此过程加以学习了解和总结,以下学习过程中代码片段中均有省略不完整,请参照源码。Init进程的启动init进程,它是一个由内核启动的用户级进程。内核自

3、行启动(已经被载入 内存,开始运行, 并已初始化所有的设备驱动程序和数据结构等)之后,就通过启动一个用户级程 序init的方式,完成引导进程。init始终是第一个进程。启动过程就是代码in it.c中ma in函数执行过程:systemcorei niti nit. c在函数中执行了:文件夹建立,挂载,rc文件解析,属性设置,启动服务,执 行动作,socket监听F面看两个重要的过程:rc文件解析和服务启动。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 就是系统支持的一系列命令,如:export ,host name , mkdir ,mount,等等,其中一部分是 linux 命令,:启动服务,还有一些是 an droid 添加的,女口: class.start clasSjSto pvserviceclass :关闭服务,等等。其中Options是针对Service 的选项的。系统初始化要触发的动作和要启动的服务及其各自属性都在义。 具体看一下启动脚本:systemcorerootdiri nit

5、.rcrc脚本文件中定中:systemcorei nitl nit_p arser.c:init_parse_config_file()存入到在解析rc脚本文件时,将相应的类型放入各自的Listacti on .queue 、 action.list 、 servicejist中,解析过程可以看一下parseCo nfig函数,类似状态机形式挺有意思。、vold、ril-daemon 、deb这其中包含了服务:adbd、servicemanager uggerd、surfacefl in ger、zygote、media 2服务启动list 中。文件解析完成之后将service放入到servi

6、cej文件解析完成之后将service放入到service.list中。systemcorei ni tbuilti ns.cService的启动是在do_class_start 函数中完成:intdo_class_start(nt nargs, char *args)service_for_each_class(args1 , service_start_if_ no t_disabled); return 0;遍历所有名称为class name,状态不为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对应的命令:KEYWORD(class_start,COMMAND, 1, do_class_start)init.rc 文件中搜索 class start:class_start main 、class_start core、main、core 即为

8、do classstart 参数 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调用:in it.rconboot / actionclass_startcore/ 执行 comma nd 对应 do_class_startInitclass_sta

9、rtmain进程main函数中:中: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();循环调用service的service 状态设置为SVC RUNNING。start ,将状态SVC_RESTARTING 启动,将启动后pid=fork();execveO;在消息循环中:d 的 NativeServiceInit进程执行了,监听 ServiceAn droid 的 Comma nd ,启动了 Androi 的变化需求,Signal处理。Init进程是作为属性服务(Propertyservice ),维护这些 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用来管理系统中所有的binder service,不管是本地的c+实现的还是java语言实现的都

12、需要这个进程来统一管理,最主要的管理就是,注册添加服务,获取服务。所有的 S ervice 使用前都必须先在 servicemanager中进行注册。do find servicedo_add_servicesvcmgr_ha ndler(代码位置:frameworksbasecmdsservicemanagerService_mana ger.c三Zygote 进程的启动Zygote这个进程是非常重要的一个进程,Zygote进程的建立是真正的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参数:-zygote -start-system-server代码位置:framew

14、orks/base/cmds/a pp_p rocess/a pp_mai n.cpp上面的参数在这里就会用上,决定是否要启动和启动那些进程。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在虚拟机中运行的 JNIEnv* env;if (startVm(&mJavaVM, &env) != 0) return;/向刚刚新建的虚拟机注册JNI本地接口if (startReg(env) GetStaticMethodlD(startClass,ma in ,(Ljava/la ng/Stri ng;)V);/ jni调用java方法,调用到 Zygote In it类的ma in函数jclass startClass =

16、en v- Fin dClass(className);en v-CallStaticVoidMethod(startClass, startMeth, strArray);至U了 Zygote In it.java中的静态main函数中,从C+JAVA(3) ZygoteInit真正Zygote 进程: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通讯,接收请求,Fork应用程序进 进入Zygote 进程

19、服务框架中。SystemServer启动);(1 )在Zygote 进程进入循环之前,调用了 startSystemServer(private static boolean startSystemServer()/* Request to fork the system server process 孵化新的进程 */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对新的子进程设置 */ 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);开始执行并没有去调用Systemserver 的任(3)从 st

24、artSystemServer 何方法,只是通过反射获取了抛出了 MethodAndArgsCallerma in 方法,付给了 MethodA ndArgsCaller,并异常。此异常是在哪里处理的呢?回到startSystemServer()函数的调用处:在Zygotelnit 的main函数中: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();/处理的异常抛出了异常,跳过执行ZygoteInit 进程的循环,女口果 startSystemServer这是怎么回事呢?在 startSystemServer 中异常是由 handleSystemServerProcess抛出,而pid = Zygote. forkSystemServer/*For child process仅对新的子进程设置 */if(pid0) (p arsedArgs);han dIeSystemServer Process/若成功调用,则返回两次:Zygote. forkS

26、ystemServer根据参数fork出一个子进程,一次返回的是zygotepid,值等于0否则,出错返回进程的pid,值大于0 ; 次返回的是子进程-1 ;caller .run ();MethodA ndArgsCallerrun函数:调用前面所提到的/SystemServermain 方法m = cl.getMethod(mai n,new Class String.class );启动了进程 SystemServer 。(4)SystemServer 的执行 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、了回调 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()中调用: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/回调

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服务Pro cessState:self()-startThread Po ol(); I

32、P CThreadState:self()-joi nThread Pool(); return NO_ERROR;Processstate每个进程在使用 例来描述当前进程在bin der 机制通信时,均需要维护一个P rocessState实binder 通信时的binder 状态。Processstate有如下2个主要功能:1.线程为该线程负责与内核中的binder模块进行通信,称该创建一个thread, Pool thread ;2.pBin der 对象。为指定的handle创建一个BpBinder对象,并管理该进程中所有的BPool thread在 Binder IPC 中,通信,也

33、就是不停的读写所有进程均会启动一个BD,thread 来负责与BD 来直接对象,下面会介绍这个类型。();IP CThreadState:self()-join Thread Pool();这个线程的实现主体是一个IP CThreadStateF面是Pool thread 的启动方式:P rocessState:self()-startThread PoolIP CThreadStateIP CThreadState也是以单例模式设计的。由于每个进程只维护了一个ProcessState 实例,同时 ProcessState 只启动一个 Pool thread ,也就是说每一个进程只会启动一个P

34、ool thread ,因此每个进程则只需要一个IP CThreadState 即可。Pool thread 的实际内容则为:(5)publicSystemServer 的执行 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);/初始化服务,创建各种服务实例,如:电源、网络、 Wifi、蓝牙,USB 等,/初始化完成以后加入到ServiceMa nager中,/事我们用Context.getSystemService (String name)才获取到相应的服务 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 最重要的服务 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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论