分享
分享赚钱 收藏 举报 版权申诉 / 38

类型第十二章 JAVA启动流程、调试和程序结构.ppt

  • 上传人:scg750829
  • 文档编号:8271575
  • 上传时间:2019-06-17
  • 格式:PPT
  • 页数:38
  • 大小:1.45MB
  • 配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    第十二章 JAVA启动流程、调试和程序结构.ppt
    资源描述:

    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框架库中的

    2、zygoteInit,java服务库当中的SystemServer和个服务,java服务库对应的JNI本地库libandroid_sercers.so,系统服务器的本地库libandroid_sercers.so。 Java的启动流程可以分成以下的几个步骤。 从本地可执行程序运行名为zygote的守护进程 Zygote运行ZygoteInit(进入java程序) ZygoteInit运行SystemServer(java类),并分裂出一个新的进程, SystemServer首先运行libandroid_sercers.so库当中的初始化(进入本地程序)。 执行libandroid_sercer

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

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

    5、了java层的各个服务,在系统正常的运行过程中,这些服务是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_ru

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

    7、程序没有zygote参数的时候,将进程的名称设置为第一个参数,然后根据类名启动程序。 App_process可执行程序作为zygote守护进程运行的时候,显然调用的是第一个分支,根据参数的传递情况,其调用的是AppRuntime类的start()函数传入的第一个参数为java的类名 第二个参数为startsystemserver,根据命令行的参数,其数值为true,这个过程是在本地的进程中,利用androidruntime执行java的代码。,9.1.3 Zygoteinit类的执行,守护进程zygote运行后,com.android.internal.os.Zygoteinit进入java环

    8、境中运行,Zygoteinit是一个java框架库(framework.jar)中的内部类。 ZygoteInit.java在farmeworks/base/core/java/com/android/internal/os目录中,其中的main()是一个android系统正常启动后执行的第一段java代码。,初始化过程中,zygote守护进程调用ZygoteInit时,传入的第一个参数为true,因此其中的startSystemServer()方法将会被执行。,9.1.3 Zygoteinit类的执行,startSystemServer()方法中的核心内容如下所示: startSystemS

    9、erver执行了zygote.forkSystemserver(),完成了一次进程的分裂,分裂出来的子进程执行了路径为com.android.SystemServer的java类,这是java代码中分裂另一个进程的方法,分裂出的进程就是系统服务器。它的名称为system_server。 进程分裂后,在父进程中,startsystemsrver() 方法将返回,ZygoteInit的main方法中代码将继续向下执行,进入有runforkmode或者runselectloopmode()构建的循环(默认是后者)。 执行到这个地方,zygote守护进程进入了循环,而分裂出来的第一个java进程-系统

    10、服务器(system_server)将完成后续的java层初始化工作。,9.1.4 Zygoteinit类的执行-main方法,System_server进程运行的分类是com.android.SystemServer。这个类的内容在java服务库(server.jar)当中,SystemServer执行过程中多次在java和本地直接切换,涉及的内容还包括libandroid_server.so和libsystem_server.so两个本地库。 Java层入口:SystemServer类的main()方法 SystemServer类是服务包的主入口,在systmesrver.java文件中是

    11、实现,代码的路径为:frameworks/base/service/java/com/android/server/,当这个类被调用后,执行其main()代码。,System_server运行后加载了本地库libandroid_server.so,然后执行其中的init1()函数,调用了本地的初始化内容,作为第一阶段的初始化内容。,9.1.4 Zygoteinit类的执行-本地接口init1(),Libandroid_server.so提供的是服务包的jni部分的支持,在java执行过程中,又执行了本地的调用,这种实现方式也就是在java系统的初始化过程中,插入了一段本地执行的内容,表示在特定

    12、的时机,完成部分本地初始化。 Systemserver中执行的init1()本地方方法,在frameworks/base/service/jni目录中的com_android_server_systemserver.cpp文件中,其中主要的内容如下:,这里实现了java中所需要的民称为init1的本地调用,参数的内容没有进行处理,而直接调用了本地的一个函数system_init()。,9.1.4 Zygoteinit类的执行-system_init(),System_init()先完成本地的一些初始化,在调用java程序,最终进入循环,这个函数在libsystem_server.so库中实现,

    13、代码路径为:frameworks/base/cmds/system_server/libary。 System_init()首先执完成本地相关的初始化,其中如果设置了”system_init.startsufaceflinger”属性为1,则启动surfacefilnger服务,如果本地的mediapalyerservice等服务没有初始化,在此处也将启动。然后得到java的运行环境androidruntime,并调用com/android/server/systemserver类中的名称为init2静态方法。此时由本地程序调用systemserver类中的java部分,9.1.4 Zygot

    14、einit类的执行-system_init(),具体的系统实现中,如果有内容需要在java系统正式执行之前完成初始化,同样可以将初始化的内容放置到libsystme_server.so的system_init()函数中。 除此之外,frameworks/base/cmds/system_server目录中的内容将生成一个名称为system_server的可执行程序,它连接了libsystem_server.so库并调试了system_init(),完成等同于正常初始化的流程。System_server可执行程序只用于测试,正常启动中不执行。,9.1.4 Zygoteinit类的执行-init2

    15、()方法,Systemserver类中的静态方法init2()被本地调用后,system_server进程中的java代码又再次被执行。Init2()方法如下所示:,这里调用了一个serverthread,它是一个java线程(thread)类的继承者,在其中继续完成后续的工作,实际上systemServer类当中的两个静态方法main()和init2()并无直接的调用关系,而是经过本地的间接调用。 System_server进程的执行流程为:mian()=init1()=system_init()=int2()。两端为java中的内容,中间为本地的内容。 Systemserver类的init

    16、2()方法执行后会返回,之后system_server这个进程的主线程将运行位于libsystem_server.so中的system_init()最后的循环中。,9.1.4 Zygoteinit类的执行-serverthread,Serverthread是systemserver.java文件中和systemserver平行的一个类。它是java线程类thread的继承者,负责建立各个java子服务。 Serverthread的核心内容是其中的run()方法,执行流程入下所示:,serverthread,的初始化工作完成后,自己调用Looper.loop()进入循环,这里启动的各个服务都是系

    17、统核心的重要部分,其中很多服务均会建立线程的后台运行。 例如其中的几个服务建立过程的片段如下,9.1.4 Zygoteinit类的执行-serverthread,serverthread,的初始化工作完成后,自己调用Looper.loop()进入循环,这里启动的各个服务都是系统核心的重要部分,其中很多服务均会建立线程的后台运行。 例如其中的几个服务建立过程的片段 ServerThread的初始化流程是:首先建立关键(critical)的服务,例如以上的ActivityManagerService等;再建立各个次要服务,例如InputMethodManagerServer、networkserv

    18、ice等,然后将调用很多服务中都具有的systemready()方法,等待每一个服务初始化完成。初始化完成后,serverthread才进入looper.loop()的循环。 SystemServer中的服务(service)。有时候这些服务又被称之为”anderoid服务”,区分于”本地服务”。他们的实现其实只是一个名词,并无实现类型的限制。上面的powermanagerservice,就是一个IXX.stub的继承者,因此通过servermanager将其加成服务;而activitymanagerservice则提供了静态的main()方法来初始化,其实也是一个IXXX.stub的继承者,

    19、在main()方法中建立自己的实例,并增加到ServerManager;Lightsservice则只是一个普通类,使用new建立实例即可。,9.1.4 Zygoteinit类的执行-各个”服务”的执行,当系统初始化完成后,在android系统的正常运行状态中,SystemServer进程中包含了多个线程,线程大部分是由system_server中的服务所建立的,用于执行每个服务当中的后台工作。线程和使用system_server增加多少个服务(binder的继承者)没有任何关系,只有在代码中构建了thread,才具有线程。 在命令界面中执行ps t可以查看system_server进程中的线

    20、程情况,查看的结果片段如下所示: (1)EntropyService key:entropy (2)PowerManagerService key:power (3)ActivityManagerService key:activity am工具命令 (4)TelephonyRegistry key:telephony.registry (5)PackageManagerService pm工具命令 (6)AccountManagerService key:account (7)BatteryService key:battery (8)HardwareService key:hardware

    21、 (9)AlarmManagerService key:alarm (10)SensorService key:sensor (11)WindowManagerService key:window,9.1.4 Zygoteinit类的执行-各个”服务”的执行,(12)BluetoothService key:bluetooth (13)BluetoothA2dpService key:bluetooth_a2dp (14)StatusBarService key:statusbar (15)ClipboardService key:clipboard (16)InputMethodManage

    22、rService key:input_method (17)NetStatService key:netstat (18)ConnectivtiyService key:connectivity (19)AccessibilityManagerService key:accessibility (20)NotificationManagerService key:notification (21)MountService key:mount (22)DeviceStorageMonitorService key:devicestoragemonitor (23)LocationManagerS

    23、ervice key:location (24)SearchManagerService key:search (25)FallbackCheckinService key:checkin (26)WallpaperManagerService key:wallpaper (27)AudioService key:audio (28)BackupManagerService key:backup (29)AppWidgetService key:appwidget,9.1.4 Zygoteinit类的执行-各个”服务”的执行,此处众多的父进程id(PID)为system_server的id进程

    24、,实际上都是system_server中的线程,其中分成了各种不同的类型。 HeapWorker、GC、SignalCatcher、JDWP、Compile几个线程都是java环境所具有的,System_Server是java环境的进程,因此具有以上内容。 SurfaceFilnger等是从本地system_init()中初始化过程中建立的本地线程,因此出现在交前的位置。 Er.serverthread是用于启动各个java服务的线程,也就是serverthread。 在serverthread之后就是activitymanager、processstats、packaemanager和win

    25、dowmanager等,则是各个java服务的线程。 Java全局的系统服务器初始化完毕后,有其中的某些服务发送服务信号,各个应用程序的进程被启动。,9.1.5 java应用程序部分的启动,Java应用程序部分的启动原理是其中组件的调用,主要原因是java服务库运行后发送的各个intent。 消息的发送 各个应用程序的启动,一般都是由于系统服务器当中的activitymanagerservice在初始化完成后发送了某种特殊的消息,其中造成应用程序启动的两个原因是启动了桌面(HOME)活动和发送了启动结束(ACTION_BOOT_COMPLETED)广播。 Activitymanagerserv

    26、ice当中的starthomeactivitylocked()方法和桌面启动有关系。 而finishbooting()将在启动结束的时候被调用,其核心思想是包含一个动作名称为Intent.ACTION_BOOT_COMPLETED的intent发送广播,因此各个应用程序包当中接受这个动作的BroadcastReceiver将有可能被运行。,9.1.5 java应用程序部分的启动,各个java应用程序包一般讲成为一个独立的进程运行,这些进程也是zygote的子进程,在这点上他们和system_server进程是相同的,因此,虽然应用程序进程和system_server在启动上有因果关系,但是在运

    27、行时linux视他们为同一个进程的子进程,如果没有特殊的情况下,所有的java进程都是zygote的子进程。 各个java应用程序的启动是通过app_process的第二个分支完成的,由于其中调用了set_process_name (),因此每个java应用程序的进程名称通常就是他们的java包, 在系统启动完成后可以查看java命令进程情况,,8.1 android的java本地调用,Jni,8.1 android的java本地调用,Jni,9.1.5 java应用程序部分的启动,System_server和各个应用程序进程的父进程均为zygote,他们都是由zygote以类似的方式启动起来

    28、的,系统不会立刻释放每个应用程序包上下文运行,因此只需要一个应用程包中有组件运行过,他的进程就会立即存在。 在系统初始化阶段之后,虽然没有主动运行某些应用,但是此时已经存在了一些各个应用进程,他是可能是由不同的方式被启动的,由于某些包中的broadcastreceiver在接受了广播后,得以运行,因此它们虽然运行完成但是应用程序进程依然存在,例如:com.android.lancher则作为桌面程序存在,他建立一些放置在桌面上的appwidet(窗口部件),因此实现这些窗口小部件的应用程序包就已经是启动的进程了,有一些数据库想关的应用程序包,需要在启动后处理,因此其中的广播接收器接收动作为AC

    29、TION_BOOT_COMPLETED的广播,也已经被运行过了。,9.2 java层程序的结构设计,本部分介绍java层的结构化设计思路,指的是主体结构子java层的程序,程序本身依然有本地调用(C/C+)的部分,主要需要关注的方面是android特有的java框架层和java应用层的各中通信机制。,9.2.1 目标和设计思路,在android的java层次中进行框架性程序设计的时候,主要需要处理以下几个方面的问题。 (1)两个java进程之间的程序,包括远程方法调用。 (2)在后台长期运行的程序,用来处理全局或者公共的内容。 (3)程序间特定的通知。 以上的三个方面中,第一个方面和第二个方面

    30、是后台程序的基本内容,他们也可以在本底层完成。但是第三个方面由于涉及android的java框架层和java应用层各种特殊的通信机制,因此只能在java层完成。 Android的java应用层各种特殊的通信机制包括:使用android.content包中的intent类,android.app包中的pendingitent类和应用程序层的组件(activity、server或者broadcastreceiver)进行交互;通过uri访问某些内容提供者;使用toast进行提示:使用状态栏的通知等。 在java层的程序结构化设计的核心是java层的binder机制,他可以完成两个java进程间相互

    31、调用的主要方面。,9.2.1 目标和设计思路,在java层进行框架层的设计,主要具有两种典型的结构,一种是在java框架层实现一个服务,作为系统服务的一部分,另一种形式是基于应用层的service组件,两种方式都可以实现后台长期运行的公共程序,一般他们实现的核心都基于java层的binder机制。,8.1 android的java本地调用,Jni,8.1 android的java本地调用,Jni,8.1 android的java本地调用,Jni,8.1 android的java本地调用,Jni,8.1 android的java本地调用,Jni,在android中提供的jni的方式,让java程

    32、序可以调用C语言编写的程序,android中很多java类具有native接口,这些native接口就是由本地实现,然后注册到系统中的。 在Android中主要的jni代码在一下的路径中: Frameworks/base/core/jni/这个路径中的内容将被编译成库libandroid_runtime.so,这就是一个普通的动态库,被放置在目标系统的/system/lib目录中。 除此之外,android还包含其他的jni库,录入媒体部分的jni在目录frameworks/base/media/jni中,被编译成libmedia_jni.so。 Jni中的各个文件实际上就是C+的普通文件,其

    33、命令一般和支持的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实现,谢谢!,

    展开阅读全文
    提示  道客多多所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    关于本文
    本文标题:第十二章 JAVA启动流程、调试和程序结构.ppt
    链接地址:https://www.docduoduo.com/p-8271575.html
    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    道客多多用户QQ群:832276834  微博官方号:道客多多官方   知乎号:道客多多

    Copyright© 2025 道客多多 docduoduo.com 网站版权所有世界地图

    经营许可证编号:粤ICP备2021046453号    营业执照商标

    1.png 2.png 3.png 4.png 5.png 6.png 7.png 8.png 9.png 10.png



    收起
    展开