欢迎来到天天文库
浏览记录
ID:40401975
大小:1.45 MB
页数:38页
时间:2019-08-01
《JAVA启动流程、调试和程序结构》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、Android系统移植第九章Java启动流程和程序结构一、java部分的启动流程二、jni的基本概念三、jni的实现四、框架层中使用jni五、APK中使用jni9.1java部分的启动流程Android系统的本地部分启动完成后,将形成一系列的守护进程,其中的名称为zygote的守护进程将继续完成java部分的初始化,java部分初始化结束后,形成zygote、SystemServer以及若干个java应用的进程,系统进入正常运行阶段。9.1.1启动流程概述Android系统java部分的启动主要涉及以下几个实体:作为z
2、ygote运行的本地可执行程序,java框架库中的zygoteInit,java服务库当中的SystemServer和个服务,java服务库对应的JNI本地库libandroid_sercers.so,系统服务器的本地库libandroid_sercers.so。Java的启动流程可以分成以下的几个步骤。从本地可执行程序运行名为zygote的守护进程Zygote运行ZygoteInit(进入java程序)ZygoteInit运行SystemServer(java类),并分裂出一个新的进程,SystemServer首先运
3、行libandroid_sercers.so库当中的初始化(进入本地程序)。执行libandroid_sercers.so当中的系统初始化。SystemServer中的java初始化再次被调用(再入java程序)。建立ServerThread线程。9.1.1启动流程概述ServerThread线程建立各个服务,然后进出入循环ActivityManagerServer服务在启动结束发送相关消息。各个java应用程序运行。启动的过程中,经历了复杂的调用过程,有从本地到java的调用,有java之间的调用,有java调用本地
4、,也有本地之间的调用,最终主要工作,在名称为ServerThread的java线程中完成。Java启动完成后,android进入正常的运行状态中,此时,与java相关进程主要有以下3个部分。Zygote:本质是本地守护进程,最终进入循环状态。System_server:java的第一个守护进程,其中也包括若干个线程,并进入循环。各个java应用程序:他们并行存在,互相依赖关系。从liunx系统运行的角度上,SystemServe和各个java应用程序内的进程都是zygote进程的子进程。9.1.1启动流程概述Andro
5、idjava部分的启动流程如图途中实线部分表示java系统相关的实体,其中有本地的内容也有java的内容,右侧虚线框中的内容分表示运行时的进程情况。在java的启动过程中,java服务库的重点,它调用了本地的部分初始化,然后建立了java层的各个服务,在系统正常的运行过程中,这些服务是androidjava系统的公共部分和后台部分。9.1.2java系统的守护进程Zygote是通过init进程读取的init.rc启动的一个守护进程的民称,在init.rc中执行性内容的相关部分如下图所示。名称Zygote的服务的执行者,
6、实际上是/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()函数为可执行程序入口,主要的代码片段如下:9.1.2java系统的守护进程其中的appr
7、untime实际上是运行库androidRuntime的继承者,可以视为一个封装类,app_process执行后,根据传入的参数不同有两条运行路径。第一个分支:当命令具有—zygote参数的时候,将进程的名称设置为zygote然后调用java内部的类zygoteinit,完成java环境第一步启动。。9.1.2java系统的守护进程第二个分支,当命令程序没有—zygote参数的时候,将进程的名称设置为第一个参数,然后根据类名启动程序。App_process可执行程序作为zygote守护进程运行的时候,显然调用的是第一个
8、分支,根据参数的传递情况,其调用的是AppRuntime类的start()函数传入的第一个参数为java的类名第二个参数为startsystemserver,根据命令行的参数,其数值为true,这个过程是在本地的进程中,利用androidruntime执行java的代码。9.1.3Zygoteinit类的执行守护进程zygote运
此文档下载收益归作者所有