Android开发入门之三--Android Overview

来源:互联网 发布:车牌识别软件 编辑:程序博客网 时间:2024/04/30 02:33

【内容导航】
Android Overview
Android的学习内容和方法

1 Android Overview

Android就是架构在Linux Kernel上一套GUI系统,而Android中间层的完备强大远远强于传统GUI系统,比如MiniGui,QtEmbedded之类。当然其最最精华之处是引进了虚拟机,让广大的JAVA开发人员非常容易转到Android应用开发上,帮助其打造一个强悍的应用商店。这个应用商店就是粘住用户最最关键的东西。Android Market和App Store之间的竞争,是Android阵营和Iphone的竞争中最重要的部分。

首先来看Android Architeture:
AndroidOverview0

从上至下分为5部分:Applications,Application Framework,Android Runtime,Linux Kernel,其中蓝色部分使用JAVA语言,黄色部分为Dalvik虚拟机,绿色部分用C++和C,红色部分用C和汇编。

以下内容将对android的架构图从上至下(从APP至Linux kernel)做一个描述,每描述完一部分就在框图上补上一部分内容,这样当我们把这张图补全时,就能完全了解了Android包含的内容,从事Android开发需要需要关注的领域。

1.1 Applications

AndroidOverview1
常用的Application如上图所示,即基于Applicaiton Framework提供的API,开发出来的Android应用。绝大部分Android开发人员,都属于这一层。Application的开发基本都是脱离源码,使用Android SDK提供的标准API进行的,当然拥有自己硬件平台的手机/平板 OEM,可以修改源码扩展API,基于扩展API开发出来的应用只能在自己的平台上运行。

1.2 Application Framework

AndroidOverview2  
Application Framework向上对Application提供API,向下对系统提供的功能进行抽象封装。暴露给应用的Manager通常代码比较少,真正的工作通过bind service,让service来做,所以Manager作为提供API的部分,代码是比较干净清爽的。如Activity Manager的框架如下图所示:
AndroidOverview3
这种图中,绿色的部分是在SDK中开放给应用程序开发人员的接口,红色的部分是底层的服务实现,是真正的动作执行者,作为Client的Manager,和作为server的Service,是通过蓝色的部分Proxy模式联系起来的。Proxy Ibinder实现了Manager和Service之间的松耦合。

Applicaiton Framework的常见模块简介如下:
(1) Views System:用来建构一个应用程序的基本原件,包含了有lists,grids,text boxes,buttons,等等widget
(2) Content Providers:它可以用来让程序跟程序之间互相存取/分享数据。
(3) Resource Manager:提供各种资源让程序去使用,比如:区域性的字符串,图片,排版文件(layout files)。
(4) Notification Manager:提供程序在状态栏(status bar)的地方显示应用程序自有的警示(alert)讯息。 状态栏Android设定在手机的顶部,像短讯(short message),voice mail皆会出现在此。
(5) Activity Manager:管理所有运行着的Activity,与系统中所有运行着的Activity交互提供了接口,主要的接口围绕着运行中的进程信息,任务信息,服务信息等。
(6) Window Manager:管理所有的窗口程序。
(7) Location Manager:应该是用来做地图服务的功能。
(8) Telephony Manager:用来管理所有的移动设备(电话)的功能。
(9) Package Manager:Android系统内所有安装的程序管理。

1.3 Android Runtime
AndroidOverview4                                                            

Android Runtime包含如下2部分:

Core Libraries:JAVA核心库,包含了JAVA最基本的类库,比如File Access,Network Access,Graphics,String类等等。这就如同C语言的glibc一样,Android开发人员完全不需要关注修改这部分。

Dalvik Virtual Machine:按照Google的说法,Dalvik有如下优点:
(1)Provides application portability and runtime consistency
(2)Runs optimized file format(.dex) and Dalvik bytecode
(3)Java .clss/.jar files converted to .dex at build time
(4)Supports multiple virtual machine processes per device
(5)Highly CPU-optimized bytecode interpreter
(6)Uses runtime memory very efficiency

除Google的开发人员,其余Android开发者基本不需要关注Android Runtime的内容。

1.4 Native Libraries

AndroidOverview5

运行在虚拟机上的Application Framework的JAVA类想要使用Native Library中用C++实现的Native方法,必须通过JNI。Native Libraries太多太庞大,通常不可能每个模块都能了解清楚,从事android中间层开发的人,通常是对其中的某些模块比较熟悉和精通。一些常见和重要模块如下:
1 Bionic Libc:Android用户空间使用的C库,使用Bionic Libc的原因:在空间和速度上针对嵌入式设备做了优化;使用Glibc会受到GPL的束缚。因为使用了Bionic libc,Android使用的工具链和标准的gcc是有差别的。
2 Webkit:浏览器引擎,来自开源:http://webkit.org
3 Media Framework:多媒体框架,Android 2.3以前使用Opencore,从2.3开始使用Stagefright。
4 SQLite:经典的轻量级数据库
5 OpenGL ES:3D图形处理
6 Surface Flinger:Android的架构设计中,将图像和音频的输出,都与图像和音频数据的生产者独立开来的。Surface Flinger就是用来处理输出图像的叠加,然后将叠加好的数据送到Framebuffer。如下图:
AndroidOverview6
Surface Flinger可以使用OpenGL ES和 2D的硬件加速器进行图像合成 
7 Audio Flinger:类似于Surface Flinger,对音频生产者产出的PCM数据进行合成,然后输出,如图:
AndroidOverview7 
8 Hardware Abstraction Layer:硬件抽象层,处于User Space,定义好Android要求硬件驱动实现的接口,将平台和driver隔离开。HAL产生的最大原因是:如果将硬件驱动代码完全放在Linux Kernel下,就需要遵循GPL,OEM如三星/摩托/HTC需要开放驱动源码,那就暴露了使用的硬件型号。而HAL将驱动的逻辑代码全部放到了Android User Space,Linux Kernel仅仅保留寄存器操作部分,放在Android User Space的驱动逻辑代码就可以不公开了。

1.5 Linux Kernel

AndroidOverview0

Android使用的Linux Kernel仅仅是使用Linux的内核部分,不包含任何图形系统。并作了以下修改:Alarm,Low Memory Killer,Ashmem,Kernel Debugger,Binder,Logger,PowerManagement。而我们接触最多就是Binder和Power Management了。
Binder:用于处理进程间通信,而应用空间经常见到的情形是Manager用Binder bind上Remote Service,使用其提供的服务,如下图:
AndroidOverview8
Power Management:Andriod的电源管理最大的特点是使用更加Aggressive的策略,如果模块不想被睡眠,必须主动申请“wake locks”。

1.6 实例

至此,Android的整个架构从上倒下已经描述了一遍,现在通过一个实例来使我们对Android的整个架构有个更具体直观的认识。
AndroidOverview9 

这幅图在Froyo(Android2.2)上对应的源码路径如下:
Applications:MediaPlayerDemo.java (development/samples/apidemos/src/com/example/android/apis/media)
Application Framework:MediaPlayer.java (frameworks/base/media/java/android/media) 
JNI:android_media_MediaPlayer.cpp (frameworks/base/media/jni) 
Libraries:Mediaplayer.cpp (frameworks/base/media/libmedia) ;AudioFlinger.cpp (frameworks/base/libs/audioflinger)

2 Android的学习内容和学习方法

可以将Android的整个架构概括分成Android用户空间和Linux内核空间,这2部分相对独立,大部分从事Android开发的人员就只涉猎其中一个领域。而用户空间的开发又可分为应用开发和中间层开发,但有不少拥有自己硬件平台的研发人员应用和中间层都会涉及到。

所以Android的学习也可分成Android用户空间开发和Linux开发2部分。其中Android的学习内容和方法推荐如下:
1 Android应用开发:不涉及Android源码,使用Android SDK+eclipse+ADT+模拟器进行开发,最大的开发人群从事这一层,可以是个人也可以是公司,因为不需要依赖具体的硬件平台,只依赖于Android SDK提供的API。学习这部分最好的资料是SDK文档+API Demo。最最基础的部分的学习顺序可以为:
Android Overview-->Android4大组件-->eclipse及DDMS的使用和debug-->工程文件简介-->布局和常用控件比如Listview—>Looper Handler
学习的过程中最好自己去写一些小练习,不懂的地方再回去查阅SDK文档。这部分掌握后可以再去学学数据存储,多媒体,地图之类。总之,这部分还是很容易入手的。

2 中间层开发:不需要关注Android Runtime,需要关注的是Application Framework+Native Libraries。推荐掌握的部分有:
(1) Layer Interaction:APP一直到Kernel的调用路径
(2) 开机启动:看完这个对系统会更加了解。
(3) Ibinder
(4) 音频系统Audio Flinger和图形系统Surface Flinger
(5) 自己从事的模块:因为内容太多,前面的掌握后,关注自己从事的模块就可以了,学不完的。

原创粉丝点击