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

上传人:max****ui 文档编号:6359816 上传时间:2020-02-23 格式:PPT 页数:38 大小:1.45MB
返回 下载 相关 举报
JAVA启动流程调试和程序结构.ppt_第1页
第1页 / 共38页
JAVA启动流程调试和程序结构.ppt_第2页
第2页 / 共38页
JAVA启动流程调试和程序结构.ppt_第3页
第3页 / 共38页
点击查看更多>>
资源描述
Android系统移植第九章Java启动流程和程序结构 一 java部分的启动流程二 jni的基本概念三 jni的实现四 框架层中使用jni五 APK中使用jni 9 1java部分的启动流程 Android系统的本地部分启动完成后 将形成一系列的守护进程 其中的名称为zygote的守护进程将继续完成java部分的初始化 java部分初始化结束后 形成zygote SystemServer以及若干个java应用的进程 系统进入正常运行阶段 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线程 9 1 1启动流程概述 ServerThread线程建立各个服务 然后进出入循环ActivityManagerServer服务在启动结束发送相关消息 各个java应用程序运行 启动的过程中 经历了复杂的调用过程 有从本地到java的调用 有java之间的调用 有java调用本地 也有本地之间的调用 最终主要工作 在名称为ServerThread的java线程中完成 Java启动完成后 android进入正常的运行状态中 此时 与java相关进程主要有以下3个部分 Zygote 本质是本地守护进程 最终进入循环状态 System server java的第一个守护进程 其中也包括若干个线程 并进入循环 各个java应用程序 他们并行存在 互相依赖关系 从liunx系统运行的角度上 SystemServe和各个java应用程序内的进程都是zygote进程的子进程 9 1 1启动流程概述 Androidjava部分的启动流程如图途中实线部分表示java系统相关的实体 其中有本地的内容也有java的内容 右侧虚线框中的内容分表示运行时的进程情况 在java的启动过程中 java服务库的重点 它调用了本地的部分初始化 然后建立了java层的各个服务 在系统正常的运行过程中 这些服务是androidjava系统的公共部分和后台部分 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 函数为可执行程序入口 主要的代码片段如下 9 1 2java系统的守护进程 其中的appruntime实际上是运行库androidRuntime的继承者 可以视为一个封装类 app process执行后 根据传入的参数不同有两条运行路径 第一个分支 当命令具有 zygote参数的时候 将进程的名称设置为zygote然后调用java内部的类zygoteinit 完成java环境第一步启动 9 1 2java系统的守护进程 第二个分支 当命令程序没有 zygote参数的时候 将进程的名称设置为第一个参数 然后根据类名启动程序 App process可执行程序作为zygote守护进程运行的时候 显然调用的是第一个分支 根据参数的传递情况 其调用的是AppRuntime类的start 函数传入的第一个参数为java的类名第二个参数为startsystemserver 根据命令行的参数 其数值为true 这个过程是在本地的进程中 利用androidruntime执行java的代码 9 1 3Zygoteinit类的执行 守护进程zygote运行后 com android internal os Zygoteinit进入java环境中运行 Zygoteinit是一个java框架库 framework jar 中的内部类 ZygoteInit java在farmeworks base core java com android internal os目录中 其中的main 是一个android系统正常启动后执行的第一段java代码 初始化过程中 zygote守护进程调用ZygoteInit时 传入的第一个参数为true 因此其中的startSystemServer 方法将会被执行 9 1 3Zygoteinit类的执行 startSystemServer 方法中的核心内容如下所示 startSystemServer执行了zygote forkSystemserver 完成了一次进程的分裂 分裂出来的子进程执行了路径为com android SystemServer的java类 这是java代码中分裂另一个进程的方法 分裂出的进程就是系统服务器 它的名称为system server 进程分裂后 在父进程中 startsystemsrver 方法将返回 ZygoteInit的main方法中代码将继续向下执行 进入有runforkmode或者runselectloopmode 构建的循环 默认是后者 执行到这个地方 zygote守护进程进入了循环 而分裂出来的第一个java进程 系统服务器 system server 将完成后续的java层初始化工作 9 1 4Zygoteinit类的执行 main方法 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 当这个类被调用后 执行其main 代码 System server运行后加载了本地库libandroid server so 然后执行其中的init1 函数 调用了本地的初始化内容 作为第一阶段的初始化内容 9 1 4Zygoteinit类的执行 本地接口init1 Libandroid server so提供的是服务包的jni部分的支持 在java执行过程中 又执行了本地的调用 这种实现方式也就是在java系统的初始化过程中 插入了一段本地执行的内容 表示在特定的时机 完成部分本地初始化 Systemserver中执行的init1 本地方方法 在frameworks base service jni目录中的com android server systemserver cpp文件中 其中主要的内容如下 这里实现了java中所需要的民称为init1的本地调用 参数的内容没有进行处理 而直接调用了本地的一个函数system init 9 1 4Zygoteinit类的执行 system init System init 先完成本地的一些初始化 在调用java程序 最终进入循环 这个函数在libsystem server so库中实现 代码路径为 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 4Zygoteinit类的执行 system init 具体的系统实现中 如果有内容需要在java系统正式执行之前完成初始化 同样可以将初始化的内容放置到libsystme server so的system init 函数中 除此之外 frameworks base cmds system server目录中的内容将生成一个名称为system server的可执行程序 它连接了libsystem server so库并调试了system init 完成等同于正常初始化的流程 System server可执行程序只用于测试 正常启动中不执行 9 1 4Zygoteinit类的执行 init2 方法 Systemserver类中的静态方法init2 被本地调用后 system server进程中的java代码又再次被执行 Init2 方法如下所示 这里调用了一个serverthread 它是一个java线程 thread 类的继承者 在其中继续完成后续的工作 实际上systemServer类当中的两个静态方法main 和init2 并无直接的调用关系 而是经过本地的间接调用 System server进程的执行流程为 mian init1 system init int2 两端为java中的内容 中间为本地的内容 Systemserver类的init2 方法执行后会返回 之后system server这个进程的主线程将运行位于libsystem server so中的system init 最后的循环中 9 1 4Zygoteinit类的执行 serverthread Serverthread是systemserver java文件中和systemserver平行的一个类 它是java线程类thread的继承者 负责建立各个java子服务 Serverthread的核心内容是其中的run 方法 执行流程入下所示 serverthread 的初始化工作完成后 自己调用Looper loop 进入循环 这里启动的各个服务都是系统核心的重要部分 其中很多服务均会建立线程的后台运行 例如其中的几个服务建立过程的片段如下 9 1 4Zygoteinit类的执行 serverthread serverthread 的初始化工作完成后 自己调用Looper loop 进入循环 这里启动的各个服务都是系统核心的重要部分 其中很多服务均会建立线程的后台运行 例如其中的几个服务建立过程的片段ServerThread的初始化流程是 首先建立关键 critical 的服务 例如以上的ActivityManagerService等 再建立各个次要服务 例如InputMethodManagerServer networkservice等 然后将调用很多服务中都具有的systemready 方法 等待每一个服务初始化完成 初始化完成后 serverthread才进入looper loop 的循环 SystemServer中的服务 service 有时候这些服务又被称之为 anderoid服务 区分于 本地服务 他们的实现其实只是一个名词 并无实现类型的限制 上面的powermanagerservice 就是一个IXX stub的继承者 因此通过servermanager将其加成服务 而activitymanagerservice则提供了静态的main 方法来初始化 其实也是一个IXXX stub的继承者 在main 方法中建立自己的实例 并增加到ServerManager Lightsservice则只是一个普通类 使用new建立实例即可 9 1 4Zygoteinit类的执行 各个 服务 的执行 当系统初始化完成后 在android系统的正常运行状态中 SystemServer进程中包含了多个线程 线程大部分是由system server中的服务所建立的 用于执行每个服务当中的后台工作 线程和使用system server增加多少个服务 binder的继承者 没有任何关系 只有在代码中构建了thread 才具有线程 在命令界面中执行ps t可以查看system server进程中的线程情况 查看的结果片段如下所示 1 EntropyServicekey entropy 2 PowerManagerServicekey power 3 ActivityManagerServicekey activityam工具命令 4 TelephonyRegistrykey telephony registry 5 PackageManagerServicepm工具命令 6 AccountManagerServicekey account 7 BatteryServicekey battery 8 HardwareServicekey hardware 9 AlarmManagerServicekey alarm 10 SensorServicekey sensor 11 WindowManagerServicekey window 9 1 4Zygoteinit类的执行 各个 服务 的执行 12 BluetoothServicekey bluetooth 13 BluetoothA2dpServicekey bluetooth a2dp 14 StatusBarServicekey statusbar 15 ClipboardServicekey clipboard 16 InputMethodManagerServicekey input method 17 NetStatServicekey netstat 18 ConnectivtiyServicekey connectivity 19 AccessibilityManagerServicekey accessibility 20 NotificationManagerServicekey notification 21 MountServicekey mount 22 DeviceStorageMonitorServicekey devicestoragemonitor 23 LocationManagerServicekey location 24 SearchManagerServicekey search 25 FallbackCheckinServicekey checkin 26 WallpaperManagerServicekey wallpaper 27 AudioServicekey audio 28 BackupManagerServicekey backup 29 AppWidgetServicekey appwidget 9 1 4Zygoteinit类的执行 各个 服务 的执行 此处众多的父进程id PID 为system server的id进程 实际上都是system server中的线程 其中分成了各种不同的类型 HeapWorker GC SignalCatcher JDWP Compile几个线程都是java环境所具有的 System Server是java环境的进程 因此具有以上内容 SurfaceFilnger等是从本地system init 中初始化过程中建立的本地线程 因此出现在交前的位置 Er serverthread是用于启动各个java服务的线程 也就是serverthread 在serverthread之后就是activitymanager processstats packaemanager和windowmanager等 则是各个java服务的线程 Java全局的系统服务器初始化完毕后 有其中的某些服务发送服务信号 各个应用程序的进程被启动 9 1 5java应用程序部分的启动 Java应用程序部分的启动原理是其中组件的调用 主要原因是java服务库运行后发送的各个intent 消息的发送各个应用程序的启动 一般都是由于系统服务器当中的activitymanagerservice在初始化完成后发送了某种特殊的消息 其中造成应用程序启动的两个原因是启动了桌面 HOME 活动和发送了启动结束 ACTION BOOT COMPLETED 广播 Activitymanagerservice当中的starthomeactivitylocked 方法和桌面启动有关系 而finishbooting 将在启动结束的时候被调用 其核心思想是包含一个动作名称为Intent ACTION BOOT COMPLETED的intent发送广播 因此各个应用程序包当中接受这个动作的BroadcastReceiver将有可能被运行 9 1 5java应用程序部分的启动 各个java应用程序包一般讲成为一个独立的进程运行 这些进程也是zygote的子进程 在这点上他们和system server进程是相同的 因此 虽然应用程序进程和system server在启动上有因果关系 但是在运行时linux视他们为同一个进程的子进程 如果没有特殊的情况下 所有的java进程都是zygote的子进程 各个java应用程序的启动是通过app process的第二个分支完成的 由于其中调用了set process name 因此每个java应用程序的进程名称通常就是他们的java包 在系统启动完成后可以查看java命令进程情况 8 1android的java本地调用 Jni 8 1android的java本地调用 Jni 9 1 5java应用程序部分的启动 System server和各个应用程序进程的父进程均为zygote 他们都是由zygote以类似的方式启动起来的 系统不会立刻释放每个应用程序包上下文运行 因此只需要一个应用程包中有组件运行过 他的进程就会立即存在 在系统初始化阶段之后 虽然没有主动运行某些应用 但是此时已经存在了一些各个应用进程 他是可能是由不同的方式被启动的 由于某些包中的broadcastreceiver在接受了广播后 得以运行 因此它们虽然运行完成但是应用程序进程依然存在 例如 com android lancher则作为桌面程序存在 他建立一些放置在桌面上的appwidet 窗口部件 因此实现这些窗口小部件的应用程序包就已经是启动的进程了 有一些数据库想关的应用程序包 需要在启动后处理 因此其中的广播接收器接收动作为ACTION BOOT COMPLETED的广播 也已经被运行过了 9 2java层程序的结构设计 本部分介绍java层的结构化设计思路 指的是主体结构子java层的程序 程序本身依然有本地调用 C C 的部分 主要需要关注的方面是android特有的java框架层和java应用层的各中通信机制 9 2 1目标和设计思路 在android的java层次中进行框架性程序设计的时候 主要需要处理以下几个方面的问题 1 两个java进程之间的程序 包括远程方法调用 2 在后台长期运行的程序 用来处理全局或者公共的内容 3 程序间特定的通知 以上的三个方面中 第一个方面和第二个方面是后台程序的基本内容 他们也可以在本底层完成 但是第三个方面由于涉及android的java框架层和java应用层各种特殊的通信机制 因此只能在java层完成 Android的java应用层各种特殊的通信机制包括 使用android content包中的intent类 android app包中的pendingitent类和应用程序层的组件 activity server或者broadcastreceiver 进行交互 通过uri访问某些内容提供者 使用toast进行提示 使用状态栏的通知等 在java层的程序结构化设计的核心是java层的binder机制 他可以完成两个java进程间相互调用的主要方面 9 2 1目标和设计思路 在java层进行框架层的设计 主要具有两种典型的结构 一种是在java框架层实现一个服务 作为系统服务的一部分 另一种形式是基于应用层的service组件 两种方式都可以实现后台长期运行的公共程序 一般他们实现的核心都基于java层的binder机制 8 1android的java本地调用 Jni 8 1android的java本地调用 Jni 8 1android的java本地调用 Jni 8 1android的java本地调用 Jni 8 1android的java本地调用 Jni 在android中提供的jni的方式 让java程序可以调用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 的普通文件 其命令一般和支持的java类有对应关系 这种关系式习惯上的写法 而不是强制的 在android中实现的jni库 需要连接动态库libnativehelper so Jni在android层次结构中的作用 8 1 1android的jni实现 Jni在android层次结构中的作用如图所示 Android系统的jni和标准的java基本类似 实现jni主要的流程为在java源代码中声明本地方法 并注册到对应的java类中 在java层的声明方面 android和标准的java使用了完全相同的方法 在本地层的实现方面 原本jni也没有绝对完整的规则 android系统具有一定的特殊性 8 1 1android的jni实现 谢谢
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!