在Android 的应用开发中,通常使用的是java 语言开发,除了需要熟悉JAVA 语言基础知识之外,还需要了解Android 提供扩展的java 功能。
一、Android的软件结构的几个层次:
1. 操作系统层(Linux,相关驱动)
2. 库(Libraries)和运行环境(RunTime)
3. 应用程序框架(Application Framework)
4. 应用程序(Application)
Android的第1层次由C语言实现,第2层次由C和/C++实现,第3、4层次主要由Java代码实现。
第1层次和第2层次之间,从Linux操作系统的角度来来看,是内核空间与用户空间的分界线,第1层次运行于内核空间,第2、3、4层次运行于用户空间。
第2层次和第3层次之间,是本地代码层和Java代码层的接口。
第3层次和第4层次之间,是Android的系统API的接口,对于Android应用程序的开发,第3层次以下的内容是不可见的,仅考虑系统API即可。
1.1 Linux操作系统和驱动:
Android 的核心系统服务依赖于 Linux 2.6 内核,如安全性,内存管理,进程管理, 网络协议栈和驱动模型。 Linux 内核也同时作为硬件和软件栈之间的抽象层。
1.2 Android本地框架和运行库:
1.2.1Android本地框架( C/C++):
Android 包含一些C/C++库,这些库能被Android系统中不同的组件使用。它们通过 Android 应用程序框架为开发者提供服务。
系统 C 库 :一个从 BSD 继承来的标准 C 系统函数库, 专门为基于嵌入式linux 的设备定制的。
媒体库 :基于 PacketVideo OpenCORE;该库支持多种常用的音频、视频格式回放和录制。
Surface Manager : 对显示子系统的管理,图层功能。
WebCore : 一个最新的web浏览器引擎用,支持Android浏览器和一个可嵌入的web视图。
SGL : Skia的2D图形引擎
3D libraries : 基于OpenGL 实现;该库可以使用硬件3D加速(如果可用)或者使用高度优化的3D软加速。
FreeType :位图(bitmap)和矢量(vector)字体显示。
1.2.2 Android 运行库:
Android 包括了一个核心库,该核心库提供了JAVA编程语言核心库的大多数功能。
每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik 虚拟 机实例。Dalvik被设计成一个设备可以同时高效地运行多个虚拟系统。
Dalvik虚拟机执行(.dex)的Dalvik可执行文件,该格式文件针对小内存使用做了 优化。同时虚拟机是基于寄存器的,所有的类都经由JAVA编译器编译,然后通过SDK 中 的 "dx" 工具转化成.dex格式由虚拟机执行。Dalvik虚拟机依赖于linux内核的一些功能,比如线程机制和底层内存管理机制。
1.3 Android应用程序框架:
开发人员也可以完全访问核心应用程序所使用的API框架。该应用程序的架构设计简化了组件的重用;任何一个应用程序都可以发布它的功能块并且任何其它的应用程序都可以使用其所发布的功能块(不过得遵循框架的安全性限制)。同样,该应用程序重用机制也使用户可以方便的替换程序组件。
隐藏在每个应用后面的是一系列的服务和系统, 其中包括;
丰富而又可扩展的视图(Views),可以用来构建应用程序, 它包括列表(lists),网格(grids),文本框(text boxes),按钮(buttons ), 甚至可嵌入的web 浏览器。
内容提供器(Content Providers):使得应用程序可以访问另一个应用程序的数据(如联系人数据库), 或者共享它们自己的数据
资源管理器(Resource Manager ):提供 非代码资源的访问,如本地字符串,图形,和布局文件( layout files )。
通知管理器 ( Notification Manager): 使得应用程序可以在状态栏中显示自定义的提示信息。
活动管理器( Activity Manager) :用来管理应用程序生命周期并提供常用的导航回退功能。
1.4Android应用程序:
Android会同一系列核心应用程序包一起发布,这些应用程序包也就是预置的应用程序,主要包括email客户端,SMS短消息程序,日历,地图,浏览器,联系人管理程序等。所有的应用程序都是使用JAVA语言编写的。
二、Dalvik虚拟机和Android的JAVA程序环境:
1.Dalvik虚拟机:
Dalvik是Android程序的虚拟机,它执行(.dex)的Dalvik可执行文件,该格式文件针对小内存使用做了 优化。同时虚拟机是基于寄存器的,所有的类都经由JAVA编译器编译,然后通过SDK 中 的"dx" 工具转化成.dex格式由虚拟机执行。
Dalvik虚拟机依赖于linux内核的一些功能,比如线程机制和底层内存管理机制。
2.Android的JAVA程序环境:
Android的API的层次结构:
JAVA标准API
JAVA扩展API(javax包)
企业和组织提供的java类库(org包)
Android的各种包
相比标准JAVA,Android中的JAVA API名称相同的API功能,但这些API并不是一个全集。
3.JNI的使用:
JNI是Java Native Interface的缩写,中文为JAVA本地调用。从Java 1.1开始,Java Native Interface (JNI)标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI 是本地编程接口。它使得在 Java 虚拟机 (VM) 内部运行的Java 代码能够与用其它编程语言( 如 C、C++ 和汇编语言)编写的应用程序和库进行互操作。
在Android中提供JNI的方式,让JAVA程序可以调用C语言的程序。很多Android中JAVA的类都具有native的接口,这些nantive接口就是由本地实现,然后注册到系统中。
在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。
Android中使用JNI主要有两种方式:
1. 在框架层实现,连接JAVA框架和本地框架
2. 在应用程序的Apk包中实现
三、Android平台体系的编程语言结构
1、源代码方面:
Linux操作系统知识
Linux内核知识(C语言)
Linux驱动程序知识(C语言)
Android底层库(C语言、C++)
Dalvik虚拟机(C++、JAVA)
Android GUI系统(C++、JAVA)
音频、视频和多媒体(C语言、C++、JAVA)
电话部分(C语言、C++、JAVA)
连接部分(C语言、C++、JAVA)
传感器部分(C语言、C++、JAVA)
2、SDK方面:
JAVA语言知识
应用程序架构
GUI设计基础知识
各种视图的使用
2D/3D图形API
应用程序的设计思想
3、Android的GUI系统:
GUI系统的C语言部分包括:
PixelFlinger
libui(框架库)
SurfaceFlinger(Surface的管理)
Skia图形图像引擎
OpenGL 3D 引擎
各种JNI(向JAVA提供接口)
GUI系统JAVA语言的核心包括:
android.graphics(对应Skia底层库)
android.view.Surface(构建显示介面)
android.view.View及其继承者(用于构建UI元素)
OpenGL的功能类
javax.microedition.khronos.opengles(由com.google.android.gles_jni实现)
四、Android 的相关文件类型、文件格式描述:
Java---应用程序源文件:
Android 本身相当一部分是由java 编写而成,而且android 应用必须使用java 开发。
class---java 编译后的目标文件:
是由java 虚拟机编译而成一个字节码文件,在之前我们用所学的j2ee 以及j2se 它是一个可执行文件,但是在Android 当中它只是一个目标文件即过渡文件。
dex---Android 平台可执行文件:
Android 自己提供了一个虚拟机(Dalvik),这种虚拟机执行的并非java 字节码,而是另一种字节码:dex 格式的字节码,在JVM 将java 文件编译成Class 文件后,再次通过Android平台工具将此Class 文件转换成dex 字节码。
apk 文件---Android 上的安装文件:
Apk 是Android 安装包的扩展名,一个Android 安装包包含了与某个Android 应用程序相关的所有文件,apk 文件将androidManifest.xml 文件,应用程序代码(dex 文件)资源文件和其他文件打成一个压缩包,一个工程只能打进一个apk 文件(有点类似exe 文件)。
五、Android重要包的组成体系
1、主要包的描述:
android.app 封装了Android 应用程序全局模型的高级类。
android.content 包含用于在设备上访问和发布数据的类。
android.database 包含了用于浏览内容提供源返回数据的类。
android.database.sqlite 包含了SQLLite 数据库管理类,应用程序可以利用这些类来管理其私有数据库。
android.graphics 允许你直接在屏幕上绘图的绘图工具,比如画布、颜色过滤器、点和矩形等。
android.graphics.drawable 提供了用于管理多种可视界面元素的类,这些可视界面元素仅用于显示,例如bitmap 和gradient。
android.graphics.glutils 提供了大量能够在Android 设备上使用OpenGL 嵌入式系统版(OpenGL ES)绘图的类.
android.hardware 提供对硬件设备的支持,这些硬件设备不一定会出现在每一个Android 设备上。
android.location 定义Android 定位和相关服务的类。
android.media 定位,视频,音频和相关的服务
android.net 用于网络连接的类,功能比ava.net.* 强大。
android.opengl 提供OpenGL(高性能图形算法行业标准)工具。3D 加速等
android.os 提供设备上基础的操作系统服务、信息传递和进程间通信。
android.provider 提供用于方便地访问Android 支持的内容提供源的类。
android.sax 一个可以方便地编写高效、健壮的SAX handler 的框架。
android.speech.recognition 提供用于语音识别的类。
android.telephony 提供了用于拨打、接收以及监听电话和电话状态的工具。
android.telephony.gsm 提供了用于从GSM 电话上控制或读取数据的类。
android.text 提供了用于在屏幕上绘制或跟踪文本和文本跨度的类。
android.text.method 提供了用于监听或修改键盘输入的类。
android.text.style 提供了用于预览或修改视图对象中文本跨度形式的类。
android.util 提供了通用的工具方法,例如日期/时间操作、64 位编码解码器、字符串数组互换方法和与XML 相关的方法。
android.view 提供了用于处理屏幕布局和用户交互的基本UI 类。
android.view.animation 提供了动画处理的类
android.webkit 提供了浏览网页的工具。
android.widget widget 包包含了用在应用程序屏幕上的UI 元素(绝大部分可视)。
android.net 为Android 网络访问socket。该包包括URI 类,不仅仅是传统的联网方面。
android.net.http 处理Android 有关Http 协议类。
android.net.wifi 在Android 平台上管理有关WiFi(802.11 无线Ethernet)应用的类。
android.telephony.gsm 包含用于管理和发送SMS(文本)消息的类。
2、Android图形系统软件构成:
Android 中的图形系统采用Client/Server 架构。Server (即SurfaceFlinger)主要由c++代码编写而成。Client 端代码分为两部分,一部分是由Java 提供的供应用使用的api,另一部分则是由c++写成的底层实现。
例如Android 图形系统中通过surface 为view 创建一个Canvas 对象,管理view 在surface上的绘图操作。View 及其子类(如TextView, Button)要画在surface 上。
3、Android SDK中提供的面向硬件的类:
android.hardware.Camera 相机交互的类,可以截取照片、获取预览屏幕的图像,修改理相机操作的参数。
android.hardware.SensorManager 允许访问Android 平台传感器的类。并非所有配备Android 的设备都支持SensorManager 中的所有传感器。
android.hardware.SensorListener 在传感器值实时更改时,希望接收更新的类要实现的接口。用以监视硬件中一个或多个可用传感器。
android.media.MediaRecorder 用于录制媒体的类。
android.FaceDetector 人脸进行基本识别类。
android.os.* 可以与操作环境交互的包,包括电源管理、文件查看器、处理器和消息类。
传感器类型:方向、加速表、光线、磁场、临近性、温度等。并非所有支持Android 的设备都支持SDK 中定义的所有传感器。