一,android系统架构
andorid系统架构从上到下分别有应用层、应用框架层、系统运行时库层、硬件抽象层、Linux内核层。
应用层:包括系统应用比如闹钟、日历等这些在内的以及非系统级别的应用都属于应用层。负责用户交互,也就是我们需要开发的东西。
应用框架层:这一层主要是为咱们开发人员提供用来开发应用程序的API,平常我们开发程序大部分都是调用这部分的API来进行开发。这一层主要提供一些ActivityManager 管理应用生命周期、locationManager 地理位置服务、还有就是NotificationManager 消息通知管理等等
系统运行库层:这一层主要分为两部分,分别是c/c++程序库和Android运行库
c++库主要是能被Andorid系统不同组件所使用,并通过应用程序框架为开发者提供服务。它主要功能有openggl 绘图方法库,多媒体库支持常用的音频 视频格式录制回访 ,还有我们常用会用到的一个轻量级的数据库 sqlLite 等还有ssl网络协议等等
android运行时库:它主要又分为核心库和虚拟机ART,核心库主要包含Java核心库的大部分功能。android 5.0系统之前使用的虚拟机是 dalvik,它相对于JVM来说,dalvik虚拟机是专门为移动设备定制的,主要在有限的内存中同时运行多个虚拟机实例,每一个dalvik虚拟机就是一个独立的linux进程,这样独立的进程可以防止在虚拟机崩溃的时候所有程序都被关闭。 5.0之后,dalvik虚拟机被ART所取代,它们主要区别就是dalvik虚拟机,应用每次在运行的时候,都需要把字节码文件转换为机器码来运行,这样应用的运行效率就会比较低。 而art虚拟机,应用在第一次安装的时候,字节码文件就会预先编译成机器码,让应用成为真正的本地应用。
硬件抽象层:它是位于操作系统内核和硬件电路之间的接口层,主要目的在于将硬件抽象化,隐藏了特定平台的硬件接口细节,为操作系统提供虚拟硬件平台,使其具有硬件无关性,可在多平台上进行移植。
linux内核层:Android的核心系统服务基于Linux内核,在此基础上添加了部分Android专用的驱动,android系统的安全管理、内存管理、进程管理、网络协议等都依赖于该内核。
二,系统的启动流程解析
1.启动电源以及系统启动
当电源按下时引导芯片代码开始从预定义的地方(固化在ROM)开始执行。加载引导程序Bootloader到RAM,然后执行。
2.引导程序BootLoader
引导程序BootLoader是在Android操作系统开始运行前的一个小程序,它的主要作用是把系统OS拉起来并运行。
3.Linux内核启动
内核启动时,设置缓存、被保护存储器、计划列表、加载驱动。当内核完成系统设置,它首先在系统文件中寻找init.rc文件,并启动init进程。
4.init进程启动
init进程是系统空间内的第一个进程,进行初始化和启动属性服务,在main方法中进行,包括初始化资源文件和启动一系列的属性服务。通过执行init.rc文件的脚本文件来启动Zygote进程。
5.Zygote进程启动
所有的应用程序包括system系统进程 都是zygote进程负责创建,因此zygote进程也被称为进程孵化器,它创建进程是通过复制自身来创建应用进程,它在启动过程中会在内部创建一个虚拟机实例,所以通过复制zygote进程而得到的应用进程和系统服务进程都可以快速地在内部的获得一个虚拟机实例拷贝。
创建JVM并注册JNI,创建服务端的socket,通过socket通信,启动systemServer
1.创建AppRuntime并调用其start方法,启动Zygote进程。
2.创建JavaVM并为JavaVM注册JNI.
3.通过JNI调用ZygoteInit的main函数进入Zygote的Java框架层。
4.通过registerZygoteSocket函数创建服务端Socket,并通过runSelectLoop函数等待ActivityManagerService的请求。
5.启动SystemServer进程。
6.SystemServer进程启动
启动Binder线程池和SystemServiceManager,systemServiceManger主要是对系统服务进行创建、启动和生命周期管理,就会启动各种系统服务。
7.Launcher启动
Launcher组件是由之前启动的systemServer所启动的ActivityManagerService启动,
这也是andorid系统启动的最后一步,launcher是andorid系统home程序,主要是用来显示系统中已安装的应用程序。 launcher应用程序的启动会通过请求packageManagerService返回系统中已经安装的应用信息,并将这些应用信息通过封装处理成快捷列表显示在系统屏幕上,这样咱们就可以单击启动它们。
被SystemServer进程启动的ActivityManagerService会启动Launcher,Launcher启动后会将已安装应用的快捷图标显示到界面上。
上述七步是手机开机andorid系统启动的流程。
三 应用启动流程
首先,activity分为两种分别是根activity和子activity,根activity就是显示在手机屏幕上快捷应用图标,在launcher应用程序启动器,根activity也就是app的第一个activity是由Launcher组件来启动,但它又是通过activity管理服务ActivityManagerService来启动根activity。但是activity Launcher activityManagerService分别运行在不同进程里面,这三个进程是通过binder进程间通信机制来完成进行通信完成activity的启动。应用的启动也就是根activity的启动。
ActivityManagerService 是一个系统关键服务,运行在SystemServer系统进程中,负责启动和调度应用程序组件。
luncher是andorid系统的home程序,管理和安装手机里的所有应用,
(1)Launcher首先向activityManagerService发送一个启动activity的进程间通信请求
(2)ams会先把要启动的activity信息保存下来,然后再想Launcher发送一个进入中止状态的进程间通信请求。
(3)Launcher组件进入终止状态后,就会给ams发送一个已进入终止状态的一个进程间通信请求,ams收到后就会继续执行启动activity操作
(4)ams如果发现用来运行运行activity的进程不存在,它就会给zygote进程发送一个进程间通信请求,zaygote会调用fork()方法创建一个新的应用程序进程。zaygote进程在启动的时候在内部创建一个虚拟机实例,它通过复制它本身得到一个应用程序进程。
(5)新的应用程序进程启动完成之后,就会向ams发送一个启动完成的通信请求,
(6)最后ams将第二步保存下来的Activity组件信息发送给zaygote进程创建的新的进程,进程创建好之后,经过一系列调用就会调用startactivity方法,最后activity调用oncreate方法构建出页面至此我们的应用正式启动完成。