第1页AndroidAndroid系统移植系统移植第九章第九章JavaJava启动流程和程序结构启动流程和程序结构第2页一、一、javajava部分的启动流程部分的启动流程二、二、jnijni的基本概念的基本概念三、三、jnijni的实现的实现四、框架层中使用四、框架层中使用jnijni五、五、APKAPK中使用中使用jnijni第3页9.1java部分的启动流程•Android系统的本地部分启动完成后,将形成一系列的守护进程,其中的名称为zygote的守护进程将继续完成java部分的初始化,java部分初始化结束后,形成zygote、SystemServer以及若干个java应用的进程,系统进入正常运行阶段。第4页9.1.1启动流程概述•Android系统java部分的启动主要涉及以下几个实体:作为zygote运行的本地可执行程序,java框架库中的zygoteInit,java服务库当中的SystemServer和个服务,java服务库对应的JNI本地库libandroid_sercers.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.1启动流程概述•ServerThread线程建立各个服务,然后进出入循环•ActivityManagerServer服务在启动结束发送相关消息。•各个java应用程序运行。•启动的过程中,经历了复杂的调用过程,有从本地到java的调用,有java之间的调用,有java调用本地,也有本地之间的调用,最终主要工作,在名称为ServerThread的java线程中完成。•Java启动完成后,android进入正常的运行状态中,此时,与java相关进程主要有以下3个部分。•Zygote:本质是本地守护进程,最终进入循环状态。•System_server:java的第一个守护进程,其中也包括若干个线程,并进入循环。•各个java应用程序:他们并行存在,互相依赖关系。•从liunx系统运行的角度上,SystemServe和各个java应用程序内的进程都是zygote进程的子进程。第6页9.1.1启动流程概述•Androidjava部分的启动流程如图•途中实线部分表示java系统相关的实体,其中有本地的内容也有java的内容,右侧虚线框中的内容分表示运行时的进程情况。•在java的启动过程中,java服务库的重点,它调用了本地的部分初始化,然后建立了java层的各个服务,在系统正常的运行过程中,这些服务是androidjava系统的公共部分和后台部分。com.android.internal.os.ZygoteInitApp_process可执行程序Zygotecom.android.server.SystemServerLibandroid_server.soLibsystem_server.soSystemservercom.android.server中的ServerThread线程com.android.server包中的各个服务ServerThread(1)由init.rc运行守护进程(2)运行java内部类循环(3)分裂运行systemserver(4)调用init1()运行脚本(5)调用system_init()循环(6)调用java的init2()(7)建立线程(8)建立各个服务Java应用进程Java应用进程Zygote守护进程各个服务建立的线程java进程第7页9.1.2java系统的守护进程•Zygote是通过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()函数为可执行程序入口,主要的代码片段如下:第8页9.1.2java系统的守护进程•其中的appruntime实际上是运行库androidRuntime的继承者,可以视为一个封装类,app_process执行后,根据传入的参数不同有两条运行路径。•第一个分支:当命令具有—zygote参数的时候,将进程的名称设置为zygote然后调用java内部的类zygoteinit,完成java环境...