Application应用层

  应用是用Java语言编写的运行在虚拟机上的程序,即图中最上层的蓝色部分.手机的上层应用其实,Google最开始时就在Android系统中捆绑了一些核心应用比如e-mail客户端、SMS短消息程序、日历、地图、浏览器、联系人管理程序,等等。


Application FrameWork应用框架层

  这一层即是编写Google发布的核心应用时所使用的API框架,开发人员同样可以使用这些框架来开发自己的应用,这样便简化了程序开发的架构设计,但是必须遵守其框架的开发原则,组件如下:

  丰富而又可扩展的视图(Views):可以用来构建应用程序,它包括列表(lists)、网格(grids)、文本框(text boxes)、按钮(buttons), 甚至可嵌入的Web浏览器。

  内容提供器(Content Providers):它可以让一个应用访问另一个应用的数据(如联系人数据库),或共享它们自己的数据

  资源管理器(Resource Manager):提供非代码资源的访问,如本地字符串、图形、和布局文件(layout files)。

  通知管理器 (Notification Manager):应用可以在状态栏中显示自定义的提示信息。

  活动管理器(Activity Manager):用来管理应用程序生命周期并提供常用的导航退回功能。

  窗口管理器(Window Manager):管理所有的窗口程序。

  包管理器(Package Manager):Android系统内的程序管理

  电话管理器(Telephony Manager):主要提供Telephony相关信息的查询/修改功能,以及Phone状态监听功能,封装的方法主要是提供给APP上层使用。

  定位管理器(Location Manager):获取经纬度及定位过程

  


在Android SDK中内置了一些对象,其中最重要的组件要属Activity、Intent、Services以及Content Providers四个组件。

  Activity活动:一个活动就是一个用户界面。一个应用程序可以定义一个或多个活动,每个活动都能够保存和恢复自身的状态。
  Intent:Intent是描述一个特定活动的一种机制,比如“选取照片”、“拨打电话”等这类具体动作。在Android中,所有的东西都是通过Intents完成的,因此开发者有机会替代或重用大量的组件。比如有一个“发送邮件”的intent,当你应用程序需要发送邮件时可以激活这个intent。开发者甚至可以重新编写一个新的邮件应用程序,并注册为活动以处理这个intent代替标准的邮件应用程序。那么其他应用程序就可以使用新编写应用程序来发送邮件了。
  Services服务:一个服务Service就是运行在后台、没有用户直接交互的任务,与Unix
daemon类似。比如要做一个音乐播放器,可能会被另一个活动激活,但音乐是需要作为背景音乐播放,那么这种程序就可以考虑作为一种服务Service。然后别的活动可以来操作这个播放器。Android中内置了很多服务,可以方便的使用API进行访问。
  ContentProviders内容提供者:一个内容提供者content Provider就是由自定义的API封装读写操作的一套数据。Content
Provider是不同应用程序之间共享全局数据最好的方式。比如,Google提供了联系人的Content
Provider,包括姓名、地址、电话等所有信息在内的联系方式能够被所有应用程序使用。


Libraries系统运行库层

当我们使用Android 应用框架时,Android系统会通过一些C/C++库来支持对我们使用的各个组件,使其能更好地为开发者服务

Bionic系统 C 库:C语言标准库,系统最底层的库,C库通过Linux系统来调用。

  多媒体库(MediaFrameword):Android系统多媒体库,基于 PacketVideo OpenCORE,该库支持多种常用的音频、视频格式的回放和录制以及一些图片,比如:MPEG4、MP3、AAC、AMR、JPG, PNG 等。

  SurFace Manager:界面管理器

  Media Framework:多媒体框架

  SQLite:开源轻量级数据库,和mysql类似

  SGL:2D图形引擎库。

  SSL:位于TVP/IP协议与各种应用层协议之间,为数据通讯提供支持。

  OpenGL ES 1.0:3D效果的支持。

  SQLite:关系数据库。

  Webkit:Web浏览器引擎。

  FreeType :位图(Bitmap)及矢量(Vector)。


Anndroid RunTim运行时  

  每个Java程序都运行在Dalvik虚拟机之上。与PC一样,每个Android应用程序都有自己的进程,Dalvik虚拟机只执行".dex"的可执行文件。当Java程序通过编译,最后还需要通过SDK中的 "dx"工具转化成".dex"格式才能正常地在虚拟机上执行。

  图中黄色的部分则是Dalvik虚拟机

  Google于2007年底正式发布了Android SDK, 作为 Android系统的重要特性,Dalvik虚拟机也第一次进入了人们的视野。它对内存的高效使用,以及在低速CPU上表现出的高性能,确实令人刮目相看。Android系统可以简单地完成进程隔离和线程管理。每一个Android应用在底层都会对应一个独立的Dalvik虚拟机实例,其代码在虚拟机的解释下得以执行。很多人认为Dalvik虚拟机是一个Java虚拟机,因为Android的编程语言恰恰就是Java语言。但是这种说法并不准确,因为Dalvik虚拟机并不是按照Java虚拟机的规范来实现的,两者并不兼容;同时还要两个明显的不同:Java虚拟机运行的是Java字节码,而Dalvik虚拟机运行的则是其专有的文件格式DEX(Dalvik Executable)的文件。在Java SE程序中的Java类会被编译成一个或者多个字节码文件(.class)然后打包到JAR文件,而后Java虚拟机会从相应的CLASS文件和JAR文件中获取相应的字节码;Android应用虽然也是使用Java语言进行编程,但是在编译成CLASS文件后,还会通过一个工具(dx)将应用所有的CLASS文件转换成一个DEX文件,而后Dalvik虚拟机会从其中读取指令和数据。

  Dalvik虚拟机非常适合在移动终端上使用,相对于在桌面系统和服务器系统运行的虚拟机而言,它不需要很快的CPU速度和大量的内存空间。根据Google的测算,64M的RAM已经能够让系统正常运转了。其中24M被用于底层系统的初始化和启动,另外20M被用于高层启动高层服务。当然,随着系统服务的增多和应用功能的扩展,其所消耗的内存也势必越来越大。归纳起来,Dalvik虚拟机有如下几个主要特征:

专有的DEX文件格式

  DEX是Dalvik虚拟机专用的文件格式,而为什么弃用已有的字节码文件(.CLASS文件)而采用新的格式呢?

(1) 一个应用中会定义很多类,编译完成后即会有很多相应的CLASS文件,CLASS文件中会有不少冗余的信息,而DEX文件格式会把所有的CLASS文件内容整合到一个文件中。这样,除了减少整体的文件尺寸和I/O操作,也提高了类的查找速度。

(2) 增加了新的操作码的支持。

(3) 文件结构尽量简洁,使用等长的指令,借以提高解析速度。

(4) 尽量扩大只读结构的大小,借以提高跨进程的数据共享。

DEX的优化

  DEX文件的结构是紧凑的,但是如果我们还想运行时的性能有进一步提高,我们就仍然需要对DEX文件进行进一步优化。优化主要是针对以下几个方面:

(1) 调整所有字段的字节序(LITTLE_ENDIAN)和对齐结构中的每一个域。

(2) 验证DEX文件中的所有类。

(3) 对一些特定的类进行优化,对方法里的操作码进行优化。

基于寄存器

  相对于基于堆栈实现的虚拟机,基于寄存器实现的虚拟机虽然在硬件、通用性上要差一些,但是它在代码的执行效率上却更胜一筹。一个应用,一个虚拟机实例,一个进程

  每一个Android应用都运行在一个Dalvik虚拟机实例中,而每一个虚拟机实例都是一个独立的进程空间。虚拟机的线程机制、内存分配和管理、Mutex等的实现都依赖底层操作系统。所有Android应用的线程都对应一个Linux线程,虚拟机因而可以更多地依赖操作系统的线程调度和管理机制。不同的应用在不同的进程空间里运行,加之对不同来源的应用都使用不同的Linux用户来运行,可以最大程度地保护应用的安全和独立运行。


Linux内核层

Android的核心系统服务基于Linux2.6内核,如安全性、内存管理、进程管理、网络协议栈和驱动模型等都依赖于Linux2.6内核。Linux内核同时也作为硬件和软件栈之间的抽象层,全部都是驱动.

Android更多的是需要一些与移动设备相关的驱动程序,主要的驱动如下所示。

  显示驱动(Display Driver):基于Linux的帧缓冲(Frame Buffer)驱动。

  键盘驱动(KeyBoard Driver):作为输入设备的键盘驱动。

  Flash内存驱动(Flash Memory Driver):基于MTD的Flash驱动程序。

  照相机驱动(Camera Driver):常用的基于Linux的v4l2(Video for Linux)驱动。

  音频驱动(Audio Driver):常用的基于ALSA(Advanced Linux Sound Architecture)的高级Linux声音体系驱动。

  蓝牙驱动(Bluetooth Driver):基于IEEE 802.15.1标准的无线传输技术。

  WiFi驱动(Camera Drive):基于IEEE 802.11标准的驱动程序。

  Binder IPC驱动:Android的一个特殊的驱动程序,具有单独的设备节点,提供进程间通讯的功能。

  Power Management(能源管理):比如电池电量等。

USB Driver(usb驱动)

Android四层体系架构的更多相关文章

  1. android体系架构

    android体系架构总结: android体系架构分为四层 第一层:应用层:applications 第二层:开发层 第三层:

  2. 精通android体系架构、mvc、常见的设计模式、控制反转(ioc)

    1.请看某个著名的it公司一则招聘信息的其中一条要求:“熟悉android系统架构及相关技术,1年以上实际android平台开发经验:”,里面非常明确的说道要求熟练android系统架构,这从某种程度 ...

  3. 2020再见&新的计划(建立Android体系架构)

    2020,再见 关于2020,我心中有四个关键词: 疫情 年初突如其来的疫情,打破了原本生活的节奏,也没想到会笼罩全世界整整一年,希望这个世界早点好起来吧. 科比 初三的早晨,噩耗传来,我一度不敢相信 ...

  4. Android的系统架构

    转自Android的系统架构 从上图中可以看出,Android系统架构为四层结构,从上层到下层分别是应用程序层.应用程序框架层.系统运行库层以及Linux内核层,分别介绍如下:     1)应用程序层 ...

  5. Android系统框架构

    写此本文是为了对Android系统框架有一个整体的认识和了解,对于开发和测试人员脑子里要有整体认识以便对工作有所帮助. 进入正题 首先Android系统架构采用了分层架构的思想,共分为四层由上到下分: ...

  6. Android基础-系统架构分析,环境搭建,下载Android Studio,AndroidDevTools,Git使用教程,Github入门,界面设计介绍

    系统架构分析 Android体系结构 安卓结构有四大层,五个部分,Android分四层为: 应用层(Applications),应用框架层(Application Framework),系统运行层(L ...

  7. iOS消息体系架构详解-融云即时通讯云

    iOS SDK 体系架构 本文档将详细介绍融云的 SDK 产品架构和消息体系,以便于您更深入的了解融云并更快速的开发自己的产品. 融云 SDK 系统架构 IMKit IMKit 的功能主要是封装各种界 ...

  8. Android 源码架构

    我们都知道Android系统是一个开源工程,在网上可以下载到源代码. 一般在网上搜索一下,就会找到各种下载源代码的方法,比如使用Git和Repo,android源代码下载的网址是http://andr ...

  9. 说说面向服务的体系架构SOA

    序言 在.Net的世界中,一提及SOA,大家想到的应该是Web Service,WCF,还有人或许也会在.NET MVC中的Web API上做上标记,然后泛泛其谈! 的确,微软的这些技术也确实推动着面 ...

随机推荐

  1. 我理解的epoll(二)——ET、LT的实例分析

    https://www.cnblogs.com/yuuyuu/p/5103744.html 这篇文章已经写的很清楚了,暂时不展开论述了. http://blog.csdn.net/weiyuefei/ ...

  2. Image Processing and Analysis_8_Edge Detection:Finding Edges and Lines in Images by Canny——1983

    此主要讨论图像处理与分析.虽然计算机视觉部分的有些内容比如特 征提取等也可以归结到图像分析中来,但鉴于它们与计算机视觉的紧密联系,以 及它们的出处,没有把它们纳入到图像处理与分析中来.同样,这里面也有 ...

  3. Mysql系列-性能优化神器EXPLAIN使用介绍及分析

    MySQL 提供了一个 EXPLAIN 命令, 它可以对 SELECT 语句进行分析, 并输出 SELECT 执行的详细信息, 以供开发人员针对性优化. EXPLAIN 命令用法十分简单, 在 SEL ...

  4. 用VNC远程无线站

    用VNC远程无线站 第一步: 远程一台我们可以vnc连接的linux电脑(IP1为实际IP地址) vim /etc/ssh/sshd_config 修改:69行为 X11Forwarding no 为 ...

  5. 命令ls按文件大小来排序

    有时候我们想按照文件的大小来排序,一直忘记,为此特记下如下操作 按照文件所占的大小从大开始排列 # ls -lS total 64 -rw-r--r-- 1 root root 55895 Nov 5 ...

  6. Python Flask学习笔记(1)

    1.搭建虚拟环境 a. 安装 virtualenv : pip3 install virtualenv b. 建立虚拟环境 : 任意目录下建立一个空文件(我的是 Py_WorkSpace) ,在该文件 ...

  7. 求 无向图的割点和桥,Tarjan模板

    /* 求 无向图的割点和桥 可以找出割点和桥,求删掉每个点后增加的连通块. 需要注意重边的处理,可以先用矩阵存,再转邻接表,或者进行判重 */ const int MAXN = 10010; cons ...

  8. bitcoind搭建

    https://degreesofzero.com/article/installing-bitcoind-on-ubuntu.html1. sudo apt-get install python-s ...

  9. mybatis分页未明确的列定义

    问题出现原因是 集成mybaits时 会自动加上 select tmp_page.*, rownum row_id from ( abc )tmp_page 我的问题是 abc区域的列名有重名的,保持 ...

  10. PHP流协议

    目前对PHP流协议的定义是数据传输过程中,不同数据类型采用不同处理函数的技术规范(个人理解)这一规范比起传统文件处理函数来的更规范(诸如fget,fwrite,fopen,fclose等) $opts ...