图片:http://blog.csdn.net/chenzheng_java/article/details/6205269

 

由上图,我们可以看出Android系统架构由5部分组成,
 
分别是:Linux Kernel(linux内核)、Android Runtime(运行时环境)、Libraries(类库)、Application Framework(应用框架)、Applications(应用)。

 

1、Linux Kernel
 
Android基于Linux 2.6提供核心系统服务,例如:安全、内存管理、进程管理、网络堆栈、驱动模型。Linux Kernel也作为硬件和软件之间的抽象层,它隐藏具体硬件细节而为上层提供统一的服务。
 
分层的好处就是使用下层提供的服务而为上层提供统一的服务,屏蔽本层及以下层的差异,当本层及以下层发生了变化不会影响到上层。也就是说各层各司其职,各层提供固定的SAP(Service Access Point),专业点可以说是高内聚、低耦合。

 

2、Android Runtime
 
Android包含一个核心库的集合,提供大部分在Java编程语言核心类库中可用的功能。每一个Android应用程序是Dalvik虚拟机中的实例,运行在他们自己的进程中。Dalvik虚拟机设计成,在一个设备可以高效地运行多个虚拟机。
 
大多数虚拟机包括JVM都是基于栈的,而Dalvik虚拟机则是基于寄存器的。dx 是一套工具,可以將 Java .class 转换成 .dex 格式。一个dex文件通常会有多个.class。由于dex有時必须进行最佳化,会使文件大小增加1-4倍,以ODEX结尾。(注意,.class转换成.dex文件的过程中,android是会对其进行优化的,以让其更适应小内存环境)
 
Dalvik虚拟机依赖于Linux 内核提供基本功能,如线程和底层内存管理。

 

3、Libraries
 
Android包含一个C/C++库的集合,供Android系统的各个组件使用。这些功能通过Android的应用程序框架(application framework)暴露给开发者。

 

4、Application Framework

一、FrameWork整体运行框架说明:

1.Activity的创建会创建PhoneWindow,PhoneWindow会创建DocerView,DocerView会创建View和ViewGroup。

2.应用程序在Activity中添加和删除窗口,是通过调用WindowManager类的addView和RemoveView函数达成,具体实现是通过桥接模式实现的WindowManagerImpl来实现。进而转向调用ViewRoot类的setView和removeViewLocked,然后通过IPC机制调用到WMS中的addWindow和removeWindow来完成。

3.当AMS通知ActivityThread销毁某个Activity时,ActivityThread会直接调用WindowManager的removeView方法删除窗口,实现在WindowManagerImpl类。

4.AMS调用WMS,一般情况是告诉WMS一些消息,比如某个新的Activity要启动了,从而WMS会保存一个该Activity记录的引用,有时也会直接调用WMS的接口,比如切换窗口时,启动切换窗口是直接调用WMS的setAppStartingWindow。

 

二、FrameWork启动流程

Android启动过程包含从Linux内核加载到Home应用程序启动的整个过程。整体流程如下:

Android是基于Linux内核的系统平台。启动时,首先通过bootloader(系统加载器),加载Linux内核。在Linux加载启动时,与普通的Linux启动过程相同,先初始化内核,然后调用init进程。


Init进程启动zygote:解析配置文件:init.rc(系统配置文件)及initXXX.rc(与硬件平台相关的文件)的内容执行一系列的命令,包括创建mount目录,安装文件系统,设置属性,启动属性服务器,启动Socket服务端口-》加载preload-classes和preload-resources(Framework大部分类及资源)-》fork启动新的进程Zygote(其实是由fork和execv共同创建)。


Zygnote孵化第一个进程SystemServer,SystemServer启动各种系统服务线程。SystemServer进程在Android的运行环境中扮演了"神经中枢"的作用,APK应用中能够直接交互的大部分系统服务都在该进程中运行,常见的比如WindowManagerServer(Wms)、ActivityManagerSystemService(AmS)、PackageManagerServer(PmS)等,这些系统服务都是以一个线程的方式存在于SystemServer进程中。SystemServer的main()函数首先调用的是init1()函数,这是一个native函数,内部会进行一些与Dalvik虚拟机相关的初始化工作。该函数执行完毕后,其内部会调用Java端的init2()函数,该函数首先创建了一个ServerThread对象,该对象是一个线程,然后直接运行该线程,于是,从ServerThread的run()方法内部开始真正启动各种服务线程。


基本上每个服务都有对应的Java类,从编码规范的角度来看,启动这些服务的模式可归类为三种:模式一是指直接使用构造函数构造一个服务,由于大多数服务都对应一个线程,因此,在构造函数内部就会创建一个线程并自动运行。模式二是指服务类会提供一个getInstance()方法,通过该方法获取该服务对象,这样的好处是保证系统中仅包含一个该服务对象。模式三是指从服务类的main()函数中开始执行。无论以上何种模式,当创建了服务对象后,有时可能还需要调用该服务类的init()或者systemReady()函数以完成该对象的启动

当以上服务线程都启动后,AMS以systemReady调用完成最后启动,mMainStack.resumeTopActivityLocked(null)-》mService.startHomeActivityLocked启动第一个Activity。至此,FrameWorkd启动完成。


5、Applications
 
Android装配一个核心应用程序集合,包括电子邮件客户端、SMS程序、日历、地图、浏览器、联系人和其他设置。所有应用程序都是用Java编程语言写的。

Logo

开源、云原生的融合云平台

更多推荐