JAVA启动流程调试和程序结构.ppt

上传人:牧羊曲112 文档编号:6509675 上传时间:2023-11-07 格式:PPT 页数:38 大小:1.41MB
返回 下载 相关 举报
JAVA启动流程调试和程序结构.ppt_第1页
第1页 / 共38页
JAVA启动流程调试和程序结构.ppt_第2页
第2页 / 共38页
JAVA启动流程调试和程序结构.ppt_第3页
第3页 / 共38页
JAVA启动流程调试和程序结构.ppt_第4页
第4页 / 共38页
JAVA启动流程调试和程序结构.ppt_第5页
第5页 / 共38页
点击查看更多>>
资源描述

《JAVA启动流程调试和程序结构.ppt》由会员分享,可在线阅读,更多相关《JAVA启动流程调试和程序结构.ppt(38页珍藏版)》请在三一办公上搜索。

1、Android系统移植第九章 Java启动流程和程序结构,一、java部分的启动流程二、jni的基本概念三、jni的实现四、框架层中使用jni五、APK中使用jni,9.1 java部分的启动流程,Android系统的本地部分启动完成后,将形成一系列的守护进程,其中的名称为zygote的守护进程将继续完成java部分的初始化,java部分初始化结束后,形成zygote、SystemServer以及若干个java应用的进程,系统进入正常运行阶段。,9.1.1 启动流程概述,Android系统java部分的启动主要涉及以下几个实体:作为zygote运行的本地可执行程序,java框架库中的zygot

2、eInit,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当中的系统初始

3、化。SystemServer中的java初始化再次被调用(再入java程序)。建立ServerThread线程。,9.1.1 启动流程概述,ServerThread线程建立各个服务,然后进出入循环ActivityManagerServer服务在启动结束发送相关消息。各个java应用程序运行。启动的过程中,经历了复杂的调用过程,有从本地到java的调用,有java之间的调用,有java调用本地,也有本地之间的调用,最终主要工作,在名称为ServerThread的java线程中完成。Java启动完成后,android进入正常的运行状态中,此时,与java相关进程主要有以下3个部分。Zygote:本

4、质是本地守护进程,最终进入循环状态。System_server:java的第一个守护进程,其中也包括若干个线程,并进入循环。各个java应用程序:他们并行存在,互相依赖关系。从liunx系统运行的角度上,SystemServe和各个java应用程序内的进程都是zygote进程的子进程。,9.1.1 启动流程概述,Android java部分的启动流程如图途中实线部分表示java系统相关的实体,其中有本地的内容也有java的内容,右侧虚线框中的内容分表示运行时的进程情况。在java的启动过程中,java服务库的重点,它调用了本地的部分初始化,然后建立了java层的各个服务,在系统正常的运行过程中

5、,这些服务是android java系统的公共部分和后台部分。,9.1.2 java系统的守护进程,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虚拟

6、机的libdvm.so库调用Dalvik虚拟机。其中app_mian.cpp文件中的main()函数为可执行程序入口,主要的代码片段如下:,9.1.2 java系统的守护进程,其中的appruntime实际上是运行库androidRuntime的继承者,可以视为一个封装类,app_process执行后,根据传入的参数不同有两条运行路径。第一个分支:当命令具有zygote参数的时候,将进程的名称设置为zygote然后调用java内部的类zygoteinit,完成java环境第一步启动。,9.1.2 java系统的守护进程,第二个分支,当命令程序没有zygote参数的时候,将进程的名称设置为第一个

7、参数,然后根据类名启动程序。App_process可执行程序作为zygote守护进程运行的时候,显然调用的是第一个分支,根据参数的传递情况,其调用的是AppRuntime类的start()函数传入的第一个参数为java的类名第二个参数为startsystemserver,根据命令行的参数,其数值为true,这个过程是在本地的进程中,利用androidruntime执行java的代码。,9.1.3 Zygoteinit类的执行,守护进程zygote运行后,进入java环境中运行,Zygoteinit是一个java框架库(framework.jar)中的内部类。ZygoteInit.java在fa

8、rmeworks/base/core/java/com/android/internal/os目录中,其中的main()是一个android系统正常启动后执行的第一段java代码。,初始化过程中,zygote守护进程调用ZygoteInit时,传入的第一个参数为true,因此其中的startSystemServer()方法将会被执行。,9.1.3 Zygoteinit类的执行,startSystemServer()方法中的核心内容如下所示:startSystemServer执行了zygote.forkSystemserver(),完成了一次进程的分裂,分裂出来的子进程执行了路径为的java类,

9、这是java代码中分裂另一个进程的方法,分裂出的进程就是系统服务器。它的名称为system_server。进程分裂后,在父进程中,startsystemsrver()方法将返回,ZygoteInit的main方法中代码将继续向下执行,进入有runforkmode或者runselectloopmode()构建的循环(默认是后者)。执行到这个地方,zygote守护进程进入了循环,而分裂出来的第一个java进程-系统服务器(system_server)将完成后续的java层初始化工作。,9.1.4 Zygoteinit类的执行-main方法,System_server进程运行的分类是。这个类的内容在

10、java服务库(server.jar)当中,SystemServer执行过程中多次在java和本地直接切换,涉及的内容还包括libandroid_server.so和libsystem_server.so两个本地库。Java层入口:SystemServer类的main()方法SystemServer类是服务包的主入口,在systmesrver.java文件中是实现,代码的路径为:frameworks/base/service/java/com/android/server/,当这个类被调用后,执行其main()代码。,System_server运行后加载了本地库libandroid_serve

11、r.so,然后执行其中的init1()函数,调用了本地的初始化内容,作为第一阶段的初始化内容。,9.1.4 Zygoteinit类的执行-本地接口init1(),Libandroid_server.so提供的是服务包的jni部分的支持,在java执行过程中,又执行了本地的调用,这种实现方式也就是在java系统的初始化过程中,插入了一段本地执行的内容,表示在特定的时机,完成部分本地初始化。Systemserver中执行的init1()本地方方法,在frameworks/base/service/jni目录中的com_android_server_systemserver.cpp文件中,其中主要的

12、内容如下:,这里实现了java中所需要的民称为init1的本地调用,参数的内容没有进行处理,而直接调用了本地的一个函数system_init()。,9.1.4 Zygoteinit类的执行-system_init(),System_init()先完成本地的一些初始化,在调用java程序,最终进入循环,这个函数在libsystem_server.so库中实现,代码路径为:frameworks/base/cmds/system_server/libary。System_init()首先执完成本地相关的初始化,其中如果设置了”system_init.startsufaceflinger”属性为1,则

13、启动surfacefilnger服务,如果本地的mediapalyerservice等服务没有初始化,在此处也将启动。然后得到java的运行环境androidruntime,并调用com/android/server/systemserver类中的名称为init2静态方法。此时由本地程序调用systemserver类中的java部分,9.1.4 Zygoteinit类的执行-system_init(),具体的系统实现中,如果有内容需要在java系统正式执行之前完成初始化,同样可以将初始化的内容放置到libsystme_server.so的system_init()函数中。除此之外,framew

14、orks/base/cmds/system_server目录中的内容将生成一个名称为system_server的可执行程序,它连接了libsystem_server.so库并调试了system_init(),完成等同于正常初始化的流程。System_server可执行程序只用于测试,正常启动中不执行。,9.1.4 Zygoteinit类的执行-init2()方法,Systemserver类中的静态方法init2()被本地调用后,system_server进程中的java代码又再次被执行。Init2()方法如下所示:,这里调用了一个serverthread,它是一个java线程(thread)类

15、的继承者,在其中继续完成后续的工作,实际上systemServer类当中的两个静态方法main()和init2()并无直接的调用关系,而是经过本地的间接调用。System_server进程的执行流程为:mian()=init1()=system_init()=int2()。两端为java中的内容,中间为本地的内容。Systemserver类的init2()方法执行后会返回,之后system_server这个进程的主线程将运行位于libsystem_server.so中的system_init()最后的循环中。,9.1.4 Zygoteinit类的执行-serverthread,Serverth

16、read是systemserver.java文件中和systemserver平行的一个类。它是java线程类thread的继承者,负责建立各个java子服务。Serverthread的核心内容是其中的run()方法,执行流程入下所示:,serverthread,的初始化工作完成后,自己调用Looper.loop()进入循环,这里启动的各个服务都是系统核心的重要部分,其中很多服务均会建立线程的后台运行。例如其中的几个服务建立过程的片段如下,9.1.4 Zygoteinit类的执行-serverthread,serverthread,的初始化工作完成后,自己调用Looper.loop()进入循环,

17、这里启动的各个服务都是系统核心的重要部分,其中很多服务均会建立线程的后台运行。例如其中的几个服务建立过程的片段ServerThread的初始化流程是:首先建立关键(critical)的服务,例如以上的ActivityManagerService等;再建立各个次要服务,例如InputMethodManagerServer、networkservice等,然后将调用很多服务中都具有的systemready()方法,等待每一个服务初始化完成。初始化完成后,serverthread才进入looper.loop()的循环。SystemServer中的服务(service)。有时候这些服务又被称之为”an

18、deroid服务”,区分于”本地服务”。他们的实现其实只是一个名词,并无实现类型的限制。上面的powermanagerservice,就是一个IXX.stub的继承者,因此通过servermanager将其加成服务;而activitymanagerservice则提供了静态的main()方法来初始化,其实也是一个IXXX.stub的继承者,在main()方法中建立自己的实例,并增加到ServerManager;Lightsservice则只是一个普通类,使用new建立实例即可。,9.1.4 Zygoteinit类的执行-各个”服务”的执行,当系统初始化完成后,在android系统的正常运行状态

19、中,SystemServer进程中包含了多个线程,线程大部分是由system_server中的服务所建立的,用于执行每个服务当中的后台工作。线程和使用system_server增加多少个服务(binder的继承者)没有任何关系,只有在代码中构建了thread,才具有线程。在命令界面中执行ps t可以查看system_server进程中的线程情况,查看的结果片段如下所示:(1)EntropyService key:entropy(2)PowerManagerService key:power(3)ActivityManagerService key:activity am工具命令(4)Telep

20、honyRegistry key:telephony.registry(5)PackageManagerService pm工具命令(6)AccountManagerService key:account(7)BatteryService key:battery(8)HardwareService key:hardware(9)AlarmManagerService key:alarm(10)SensorService key:sensor(11)WindowManagerService key:window,9.1.4 Zygoteinit类的执行-各个”服务”的执行,(12)Bluetoo

21、thService key:bluetooth(13)BluetoothA2dpService key:bluetooth_a2dp(14)StatusBarService key:statusbar(15)ClipboardService key:clipboard(16)InputMethodManagerService key:input_method(17)NetStatService key:netstat(18)ConnectivtiyService key:connectivity(19)AccessibilityManagerService key:accessibility(

22、20)NotificationManagerService key:notification(21)MountService key:mount(22)DeviceStorageMonitorService key:devicestoragemonitor(23)LocationManagerService key:location(24)SearchManagerService key:search(25)FallbackCheckinService key:checkin(26)WallpaperManagerService key:wallpaper(27)AudioService ke

23、y:audio(28)BackupManagerService key:backup(29)AppWidgetService key:appwidget,9.1.4 Zygoteinit类的执行-各个”服务”的执行,此处众多的父进程id(PID)为system_server的id进程,实际上都是system_server中的线程,其中分成了各种不同的类型。HeapWorker、GC、SignalCatcher、JDWP、Compile几个线程都是java环境所具有的,System_Server是java环境的进程,因此具有以上内容。SurfaceFilnger等是从本地system_init(

24、)中初始化过程中建立的本地线程,因此出现在交前的位置。Er.serverthread是用于启动各个java服务的线程,也就是serverthread。在serverthread之后就是activitymanager、processstats、packaemanager和windowmanager等,则是各个java服务的线程。Java全局的系统服务器初始化完毕后,有其中的某些服务发送服务信号,各个应用程序的进程被启动。,9.1.5 java应用程序部分的启动,Java应用程序部分的启动原理是其中组件的调用,主要原因是java服务库运行后发送的各个intent。消息的发送各个应用程序的启动,一般

25、都是由于系统服务器当中的activitymanagerservice在初始化完成后发送了某种特殊的消息,其中造成应用程序启动的两个原因是启动了桌面(HOME)活动和发送了启动结束(ACTION_BOOT_COMPLETED)广播。Activitymanagerservice当中的starthomeactivitylocked()方法和桌面启动有关系。而finishbooting()将在启动结束的时候被调用,其核心思想是包含一个动作名称为Intent.ACTION_BOOT_COMPLETED的intent发送广播,因此各个应用程序包当中接受这个动作的BroadcastReceiver将有可能被

26、运行。,9.1.5 java应用程序部分的启动,各个java应用程序包一般讲成为一个独立的进程运行,这些进程也是zygote的子进程,在这点上他们和system_server进程是相同的,因此,虽然应用程序进程和system_server在启动上有因果关系,但是在运行时linux视他们为同一个进程的子进程,如果没有特殊的情况下,所有的java进程都是zygote的子进程。各个java应用程序的启动是通过app_process的第二个分支完成的,由于其中调用了set_process_name(),因此每个java应用程序的进程名称通常就是他们的java包,在系统启动完成后可以查看java命令进程

27、情况,,8.1 android的java本地调用,Jni,8.1 android的java本地调用,Jni,9.1.5 java应用程序部分的启动,System_server和各个应用程序进程的父进程均为zygote,他们都是由zygote以类似的方式启动起来的,系统不会立刻释放每个应用程序包上下文运行,因此只需要一个应用程包中有组件运行过,他的进程就会立即存在。在系统初始化阶段之后,虽然没有主动运行某些应用,但是此时已经存在了一些各个应用进程,他是可能是由不同的方式被启动的,由于某些包中的broadcastreceiver在接受了广播后,得以运行,因此它们虽然运行完成但是应用程序进程依然存在

28、,例如:则作为桌面程序存在,他建立一些放置在桌面上的appwidet(窗口部件),因此实现这些窗口小部件的应用程序包就已经是启动的进程了,有一些数据库想关的应用程序包,需要在启动后处理,因此其中的广播接收器接收动作为ACTION_BOOT_COMPLETED的广播,也已经被运行过了。,9.2 java层程序的结构设计,本部分介绍java层的结构化设计思路,指的是主体结构子java层的程序,程序本身依然有本地调用(C/C+)的部分,主要需要关注的方面是android特有的java框架层和java应用层的各中通信机制。,9.2.1 目标和设计思路,在android的java层次中进行框架性程序设计

29、的时候,主要需要处理以下几个方面的问题。(1)两个java进程之间的程序,包括远程方法调用。(2)在后台长期运行的程序,用来处理全局或者公共的内容。(3)程序间特定的通知。以上的三个方面中,第一个方面和第二个方面是后台程序的基本内容,他们也可以在本底层完成。但是第三个方面由于涉及android的java框架层和java应用层各种特殊的通信机制,因此只能在java层完成。Android的java应用层各种特殊的通信机制包括:使用android.content包中的intent类,android.app包中的pendingitent类和应用程序层的组件(activity、server或者broad

30、castreceiver)进行交互;通过uri访问某些内容提供者;使用toast进行提示:使用状态栏的通知等。在java层的程序结构化设计的核心是java层的binder机制,他可以完成两个java进程间相互调用的主要方面。,9.2.1 目标和设计思路,在java层进行框架层的设计,主要具有两种典型的结构,一种是在java框架层实现一个服务,作为系统服务的一部分,另一种形式是基于应用层的service组件,两种方式都可以实现后台长期运行的公共程序,一般他们实现的核心都基于java层的binder机制。,8.1 android的java本地调用,Jni,8.1 android的java本地调用,

31、Jni,8.1 android的java本地调用,Jni,8.1 android的java本地调用,Jni,8.1 android的java本地调用,Jni,在android中提供的jni的方式,让java程序可以调用C语言编写的程序,android中很多java类具有native接口,这些native接口就是由本地实现,然后注册到系统中的。在Android中主要的jni代码在一下的路径中:Frameworks/base/core/jni/这个路径中的内容将被编译成库libandroid_runtime.so,这就是一个普通的动态库,被放置在目标系统的/system/lib目录中。除此之外,a

32、ndroid还包含其他的jni库,录入媒体部分的jni在目录frameworks/base/media/jni中,被编译成libmedia_jni.so。Jni中的各个文件实际上就是C+的普通文件,其命令一般和支持的java类有对应关系,这种关系式习惯上的写法,而不是强制的。在android中实现的jni库,需要连接动态库libnativehelper.so。Jni在android层次结构中的作用,8.1.1 android的jni实现,Jni在android层次结构中的作用如图所示:Android系统的jni和标准的java基本类似,实现jni主要的流程为在java源代码中声明本地方法,并注册到对应的java类中,在java层的声明方面,android和标准的java使用了完全相同的方法,在本地层的实现方面,原本jni也没有绝对完整的规则,android系统具有一定的特殊性,8.1.1 android的jni实现,谢谢!,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号