第十二章 JAVA启动流程、调试和程序结构.ppt
《第十二章 JAVA启动流程、调试和程序结构.ppt》由会员分享,可在线阅读,更多相关《第十二章 JAVA启动流程、调试和程序结构.ppt(38页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第 1 页页AndroidAndroid系统移植系统移植第九章第九章第九章第九章 JavaJava启动流程和程序结构启动流程和程序结构启动流程和程序结构启动流程和程序结构第第 2 页页一、一、一、一、javajavajavajava部分的启动流程部分的启动流程部分的启动流程部分的启动流程二、二、二、二、jnijnijnijni的基本概念的基本概念的基本概念的基本概念三、三、三、三、jnijnijnijni的实现的实现的实现的实现四、框架层中使用四、框架层中使用四、框架层中使用四、框架层中使用jnijnijnijni五、五、五、五、APKAPKAPKAPK中使用中使用中使用中使用jnijnij
2、nijni第第 3 页页9.1 java部分的启动流程Android系统的本地部分启动完成后,将形成一系列的守护进程,其中的名称为zygote的守护进程将继续完成java部分的初始化,java部分初始化结束后,形成zygote、SystemServer以及若干个java应用的进程,系统进入正常运行阶段。第第 4 页页9.1.1 启动流程概述Android系统java部分的启动主要涉及以下几个实体:作为zygote运行的本地可执行程序,java框架库中的zygoteInit,java服务库当中的SystemServer和个服务,java服务库对应的JNI本地库libandroid_sercers
3、.so,系统服务器的本地库libandroid_sercers.so。Java的启动流程可以分成以下的几个步骤。从本地可执行程序运行名为zygote的守护进程Zygote运行ZygoteInit(进入java程序)ZygoteInit运行SystemServer(java类),并分裂出一个新的进程,SystemServer首先运行libandroid_sercers.so库当中的初始化(进入本地程序)。执行libandroid_sercers.so当中的系统初始化。SystemServer中的java初始化再次被调用(再入java程序)。建立ServerThread线程。第第 5 页页9.1.
4、1 启动流程概述ServerThread线程建立各个服务,然后进出入循环ActivityManagerServer服务在启动结束发送相关消息。各个java应用程序运行。启动的过程中,经历了复杂的调用过程,有从本地到java的调用,有java之间的调用,有java调用本地,也有本地之间的调用,最终主要工作,在名称为ServerThread的java线程中完成。Java启动完成后,android进入正常的运行状态中,此时,与java相关进程主要有以下3个部分。Zygote:本质是本地守护进程,最终进入循环状态。System_server:java的第一个守护进程,其中也包括若干个线程,并进入循环。
5、各个java应用程序:他们并行存在,互相依赖关系。从liunx系统运行的角度上,SystemServe和各个java应用程序内的进程都是zygote进程的子进程。第第 6 页页9.1.1 启动流程概述Android java部分的启动流程如图途中实线部分表示java系统相关的实体,其中有本地的内容也有java的内容,右侧虚线框中的内容分表示运行时的进程情况。在java的启动过程中,java服务库的重点,它调用了本地的部分初始化,然后建立了java层的各个服务,在系统正常的运行过程中,这些服务是android java系统的公共部分和后台部分。第第 7 页页9.1.2 java系统的守护进程Zy
6、gote是通过init进程读取的init.rc启动的一个守护进程的民称,在init.rc中执行性内容的相关部分如下图所示。名称Zygote的服务的执行者,实际上是/system/bin/app_process的可执行程序,后面的内容是app_process的执行参数。app_process的代码路径为frameworks/base/cmds/app_process,生成名称为app_process的可执行程序,会连接libandroid_runtime.so动态库,间接连接Dalvik虚拟机的libdvm.so库调用Dalvik虚拟机。其中app_mian.cpp文件中的main()函数为可执
7、行程序入口,主要的代码片段如下:第第 8 页页9.1.2 java系统的守护进程其中的appruntime实际上是运行库androidRuntime的继承者,可以视为一个封装类,app_process执行后,根据传入的参数不同有两条运行路径。第一个分支:当命令具有zygote参数的时候,将进程的名称设置为zygote然后调用java内部的类zygoteinit,完成java环境第一步启动。第第 9 页页9.1.2 java系统的守护进程第二个分支,当命令程序没有zygote参数的时候,将进程的名称设置为第一个参数,然后根据类名启动程序。App_process可执行程序作为zygote守护进程运
8、行的时候,显然调用的是第一个分支,根据参数的传递情况,其调用的是AppRuntime类的start()函数传入的第一个参数为java的类名第二个参数为startsystemserver,根据命令行的参数,其数值为true,这个过程是在本地的进程中,利用androidruntime执行java的代码。第第 10 页页9.1.3 Zygoteinit类的执行守护进程zygote运行后,com.android.internal.os.Zygoteinit进入java环境中运行,Zygoteinit是一个java框架库(framework.jar)中的内部类。ZygoteInit.java在farme
9、works/base/core/java/com/android/internal/os目录中,其中的main()是一个android系统正常启动后执行的第一段java代码。初始化过程中,zygote守护进程调用ZygoteInit时,传入的第一个参数为true,因此其中的startSystemServer()方法将会被执行。第第 11 页页9.1.3 Zygoteinit类的执行startSystemServer()方法中的核心内容如下所示:startSystemServer执行了zygote.forkSystemserver(),完成了一次进程的分裂,分裂出来的子进程执行了路径为com.a
10、ndroid.SystemServer的java类,这是java代码中分裂另一个进程的方法,分裂出的进程就是系统服务器。它的名称为system_server。进程分裂后,在父进程中,startsystemsrver()方法将返回,ZygoteInit的main方法中代码将继续向下执行,进入有runforkmode或者runselectloopmode()构建的循环(默认是后者)。执行到这个地方,zygote守护进程进入了循环,而分裂出来的第一个java进程-系统服务器(system_server)将完成后续的java层初始化工作。第第 12 页页9.1.4 Zygoteinit类的执行-mai
11、n方法System_server进程运行的分类是com.android.SystemServer。这个类的内容在java服务库(server.jar)当中,SystemServer执行过程中多次在java和本地直接切换,涉及的内容还包括libandroid_server.so和libsystem_server.so两个本地库。Java层入口:SystemServer类的main()方法SystemServer类是服务包的主入口,在systmesrver.java文件中是实现,代码的路径为:frameworks/base/service/java/com/android/server/,当这个类
12、被调用后,执行其main()代码。System_server运行后加载了本地库libandroid_server.so,然后执行其中的init1()函数,调用了本地的初始化内容,作为第一阶段的初始化内容。第第 13 页页9.1.4 Zygoteinit类的执行-本地接口init1()Libandroid_server.so提供的是服务包的jni部分的支持,在java执行过程中,又执行了本地的调用,这种实现方式也就是在java系统的初始化过程中,插入了一段本地执行的内容,表示在特定的时机,完成部分本地初始化。Systemserver中执行的init1()本地方方法,在frameworks/bas
13、e/service/jni目录中的com_android_server_systemserver.cpp文件中,其中主要的内容如下:这里实现了java中所需要的民称为init1的本地调用,参数的内容没有进行处理,而直接调用了本地的一个函数system_init()。第第 14 页页9.1.4 Zygoteinit类的执行-system_init()System_init()先完成本地的一些初始化,在调用java程序,最终进入循环,这个函数在libsystem_server.so库中实现,代码路径为:frameworks/base/cmds/system_server/libary。System
14、_init()首先执完成本地相关的初始化,其中如果设置了”system_init.startsufaceflinger”属性为1,则启动surfacefilnger服务,如果本地的mediapalyerservice等服务没有初始化,在此处也将启动。然后得到java的运行环境androidruntime,并调用com/android/server/systemserver类中的名称为init2静态方法。此时由本地程序调用systemserver类中的java部分第第 15 页页9.1.4 Zygoteinit类的执行-system_init()具体的系统实现中,如果有内容需要在java系统正式
15、执行之前完成初始化,同样可以将初始化的内容放置到libsystme_server.so的system_init()函数中。除此之外,frameworks/base/cmds/system_server目录中的内容将生成一个名称为system_server的可执行程序,它连接了libsystem_server.so库并调试了system_init(),完成等同于正常初始化的流程。System_server可执行程序只用于测试,正常启动中不执行。第第 16 页页9.1.4 Zygoteinit类的执行-init2()方法Systemserver类中的静态方法init2()被本地调用后,system
16、_server进程中的java代码又再次被执行。Init2()方法如下所示:这里调用了一个serverthread,它是一个java线程(thread)类的继承者,在其中继续完成后续的工作,实际上systemServer类当中的两个静态方法main()和init2()并无直接的调用关系,而是经过本地的间接调用。System_server进程的执行流程为:mian()=init1()=system_init()=int2()。两端为java中的内容,中间为本地的内容。Systemserver类的init2()方法执行后会返回,之后system_server这个进程的主线程将运行位于libsyst
17、em_server.so中的system_init()最后的循环中。第第 17 页页9.1.4 Zygoteinit类的执行-serverthreadServerthread是systemserver.java文件中和systemserver平行的一个类。它是java线程类thread的继承者,负责建立各个java子服务。Serverthread的核心内容是其中的run()方法,执行流程入下所示:serverthread,的初始化工作完成后,自己调用Looper.loop()进入循环,这里启动的各个服务都是系统核心的重要部分,其中很多服务均会建立线程的后台运行。例如其中的几个服务建立过程的片段
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第十二章 JAVA启动流程、调试和程序结构 第十二 JAVA 启动 流程 调试 程序结构
限制150内