回目录
TE/OK6410 Android 应用程序开发指南
Application Framework(框架层),
框架层属于 Android 系统的核心层,里面含有各种组件,如 ActivityManager,PackageManger
等等,该层对上层的应用层软件提供 SDK 调用接口,和系统管理服务,主要采用 Java 语言开发.
Dalvik Virtual Machine,(达尔维虚拟机) :
Dalvik 虚拟机是 Google 等厂商合作开发的 Android 移动设备平台的核心组成部分之一。
它可以支持. d e (即 Dalvik Executable)
x 格式的 Java 应用程序的运行,.dex 格式是专为 Dalvik
设计的一种压缩格式,适合内存和处理器速度有限的系统。Dalvik 是由 Dan Bornstein 编写的,
名字来源于他的祖先曾经居住过名叫 Dalvik 的小渔村,村子位于冰岛的 Eyjafjörður。
大多数虚拟机,包括 JVM 都是一种堆栈机器,而 Dalvik 虚拟机则是基于寄存器的。两种架构各
有优劣,一般而言,基于栈的机器需要更多指令,而基于寄存器的机器指令更大.
Dalvik 虚拟机的介绍摘自维基百科 .
Linux
Linux 是 Android 系统的基石,有了 Linux 系统的存在,Android 这座大厦才能屹立起来,
这里的 Linux 系统与标准的 Linux 系统是存在差异的, Google 在标准 Linux 系统的基础上增
加了 Android 特有的功能,比如用于进程间通信的 Binder,高效的电源管理功能等等,如果您
需要移植 Android 的 Linux 部分,可以从 Linux 的官方网站上下载,然后加上 Android 特有
功能即可成为 Android 的 Linux 内核。
Linux 负责进程的管理,设备的管理等等,里面含有各种设备的驱动,我们提供的 Led 测试程
序 同 样 需 要 Led 的 驱 动 , Linux 含 有 Led 驱 动 , 驱 动 文 件 位 于 Linux 源 码 中
drivers/char/s3c6410_leds.c 文件中
-17-
www.witech.com.cn 2011.7.31
18.
回目录
TE/OK6410 Android 应用程序开发指南
2-2 Led 测试程序框架分析
我们提供的 Led 测试程序符合 Android 的系统框架,之所以我们重点讲述这个简单的 Led
应用是因为她不仅仅是个应用程序,更是 Android 系统的分层思想的体现,学习了 Led 相信您
对 Android 系统有一个新的深层次的认识。
如果您在发板上运行了 Android 系统, 相信您也看到了我们提供的 Led 测试程序,Forlinx Led
Test 和 com.forlinx.LedClient.LedClient,如图:
这里有两个 Led 的测试程序,他们的实现方式是不一样的。
ForlinxLedTest 体现了 Android 特有的进程间对象调用, 进程之间对象的调用就像一个进程间
上层模块对下层模块调用那么简单,开发人员不必关心过多的细节,只需要了解必要的接口即
可。
com.forlinx.LedClient.LedClient 是传统的单进程应用,这个进程直接调用 Android 的 SDK,
来操作开发板上的硬件,以下我们简称 LedClient.
下面我们会详细分析两种方式的实现过程。
-18-
www.witech.com.cn 2011.7.31
19.
回目录
TE/OK6410 Android 应用程序开发指南
2-3 Forlinx Led Test 实现过程
ForlinxLedTest 软件的实现是我们重点讲述的,他符合 Android 应用程序开发框架,有利
于您对 Android 系统的学习。
2-3-1 ForlinxLedTest 软件实现 Led 控制的系统调用图
-19-
www.witech.com.cn 2011.7.31
20.
回目录
TE/OK6410 Android 应用程序开发指南
c o m.l e d
ForlinxLedTest .a p k
A pplication
.LedSystemServer
ForlinxLedTest .a p k
F ramew ork fo rlin x _l e d .ja r
framew ork .ja r
s y s te m /framew ork /
JN I libforlinx_runtim e .s o
/s y s t e m /l i b/
HAL l e d.default .s o
/s y s t e m /l i b/h w/
L in u x L in u x
含l e c驱 动,提 供/d e v/le d s设 备 节 点
-20-
www.witech.com.cn 2011.7.31
21.
回目录
TE/OK6410 Android 应用程序开发指南
下面我们由下至上来说明每一层的功能:
Linux 层:
由 linux 系统组成 为 Led 测试 Demo 提供驱动支持,产生设备节点 /dev/leds
led 驱动代码位于 linux 内核目录 /driver/char/s3c6410_leds.c 中。
HAL 层:
硬件抽象层,该层主要操作 linux 系统中的硬件设备,如打开设备节点,控制设备节点等操
作,如果您的系统中有属于自己特有的硬件,这时您就需要编写 HAL 层了,该层对上层提供调
用接口,供 JNI 层进行调用。
Android HAL 层源码主要在 Android 源代码的 hardware 目录下,Led HAL 层 代 码 为 :
Stable-Android2.3/hardware/led .
HAL 模块以 MODULE_ID.platform.so 的名字存放在文件系统的 /system/lib/hw/ 下
面, MODULE_ID 可以在源代码中定义,这里定义 MODULE_ID 为“led”,所以该模块编译通
过后,动态库名称为 led.default.so,注意这里不能含有 lib 前缀.
JNI 层:
:
JNI 是 Java Native Interface 的缩写,译为 Java 本地接口。它允许 Java 代码和其他语言
编写的代码进行交互。在 android 中提供 JNI 的方式,让 Java 程 序可以调用 C 语言程序。
android 中很多 Java 类都具有 native 接口,这些接口由本地实现,然后注册到系统中 .
JNI 在 Android 系统中有着广泛的应用。Android 系统底层都是 C/C++实现的,上层提供的
API 都是 Java 的 ,Java 通过 JNI 调用底层的实现。比如:Android API 多媒体接口 MediaPlayer
类,其实底层通过 JNI 调用 libmedia 库。由于 JNI 的存在可以让我们重用很多已经存在 C/C++
的库,省去了重复开发的麻烦,并且可以利用很多开源的库(Android 库中就有很多开源库,
比如 libjpeg,libpng 等等) 并且让我们开发的程序更 有效率(C/C++代码发挥硬件最佳性能 )
,
在 Led 测试程序中我们也提供了 JNI 层文件,文件位于 Stable-
Android2.3/frameworks/base/services/forlinx_led_jni 下面,里面实现了向框架层注册
本地函数,供上层的 forlinx_led.jar 库调用。
JNI 层的文件编译成 libforlinx_runtime.so 动态库,位于/system/lib 目录下面.
-21-
www.witech.com.cn 2011.7.31
22.
回目录
TE/OK6410 Android 应用程序开发指南
Framwork 层:
Framwork 层提供了大量的 API 接口和系统组件,是 Android 系统中重要的模块,
在本例中 forlinx_led.jar 库文件处于框架层,且更新了 framework.jar 系统库,在里面
增加了 Led 的 API 调用,应用层的 LedSystemServer.apk 和 Forlinx LED Test .apk 会调用
框架层 framework.jar 和 forlinx_led.jar 提供的接口.
framework.jar 库文件增加了自己的 API,对应的源代码位于:
Stable-Android2.3/frameworks/base/core/java/android/forlinx
forlinx_led.jar 库文件对应的源代码位于:
Stable-Android2.3/frameworks/base/services/forlinx_led_server
framework 层代码采用 Java 语言编写,提供了大量的 API 接口供上层应用程序进行调用。
编译好的 framework.jar 和 forlinx.jar 位于开发板的 /system/framework/目录下面.
Application 层:
:
应用层位于 Android 系统架构的最高层,是给用户提供服务的最直接的程序,用户编写的
程序基本上位于这一层.
在本例中 Led 应用层有两个进程运行, 一个是 .LedSystemServer 进程,也可以称之为
服务进程,另外一个是 com.led 进程, 这两个进程合作来完成 Led 的控制, 他们由 Forlinx
LED Test.apk 创建,我们来说明一下各自的分工。
.LedSystemServer 进程:
.LedSystemServer 进程创建 LedService 对象,调用系统服务中的 API 函数来注册
LedService 服务,为进程间对象调用做准备。
com.led 进程:
用户操作界面,用户通过操作界面上的按钮来打开,关闭 Led。该进程的另外一个功能是从
系统服务列表中获取到 .LedSystemServer 进程注册的服务,也就是获取
到.LedSystemServer 进程中 LedService 对象提供的接口,com.led 进程调用这些接口,来
实现进程间对象调用,从而实现 Led 设备的控制。
-22-
www.witech.com.cn 2011.7.31
23.
回目录
TE/OK6410 Android 应用程序开发指南
下面的章节重点讲述的就是 Application 层中 Forlinx LED Test.apk 软件的开发过程.
进程间对象调用是 Android 系统的一个特色功能,如果您进行 Android 系统开发,您会看
到 Android 中大量使用了进程间对象互相调用的方法,这有点像组件对象模型的概念,一个服务
实现底层操作功能,另外的进程可以直接调用服务进程提供的接口,简化用户界面进程的实现
功能。
我们详细讲解 Led 测试 Demo 主要就是为用户讲解 Android 系统架构普遍采用的这种进程
之间对象调用的方法,对您理解 Android 架构,开发 Android 应用程序有所帮助.
Forlinx LED Test.apk 源码文件:
Stable-Android2.3/packages/apps/ForlinxLED
由于.LedSystemServer 进程调用了 Android 隐藏 API,Android 隐藏 API 是不能在 Eclipse
中调用的,需要在 Android 源码包中编译,所以当您编译 ForlinxLEDTest 时需要使用 mm 或
者 mmm android 模块编译指令.
下面我们来讲解一下使用 Eclipse 编写 Forlinx LED Test 用户界面程序的过程。
2-3-2 安装 droiddraw 软件 进行界面设计
在进行应用程序开发之前我们说一下 droiddraw 这个工具软件。
进行 Android 应用程序开发需要进行界面设计,我们在 Windows 上开发应用程序使用
过 VC++,VB 这样的集成开发环境,进行界面设计时一般就是拖放控件,比如把按钮控件,编辑
控控件拖放到窗口上,实现所见即所得的效果,但是进行 Android 应用程序开发进行界面设置
时需要编写 XML 文件,在该文件中定义 Android 程序的界面风格和控件大小,位置等,对于
不熟悉 XML 语言和对 Android 界面定义语法不是很清晰的开发者而言有点不太习惯,为此
droiddraw 工具诞生了。
droiddraw 是一个开源工具,用户可以使用该工具拖放控件设计 Android 应用程序界面,
然后保存成 XML 语言的文本文件,把该 XML 文件替换掉 Eclipse 工程的界面定义 XML 文件即
可,软件开发完成后,运行时的界面就是我们使用 droiddraw 这个开源工具制作的,是不是很
方便呢。
Droiddraw 下载地址:
-23-
www.witech.com.cn 2011.7.31
回目录
TE/OK6410 Android 应用程序开发指南
运行它,将会看到您设计的图形界面, 点击按钮就可以控制 Led 了.
2-4 LedClient 的实现过程
LedClient 是与 ForlinxLedTest 例子不同的另外一种编程思想,该软件相对比较简单,没
有涉及到进程通信,而是直接调用系统提供的 API 来实现底层硬件的控制.
2-4-1 LedClient 软件实现 Led 控制的系统调用图:
:
-43-
www.witech.com.cn 2011.7.31
44.
回目录
TE/OK6410 Android 应用程序开发指南
A pplication c o m.fo rlin x .LedC lient
LedC lient .a p k
F ramew ork fo rlin x _l e d.ja r
s y s te m /framew ork /
JN I lib fo rlin x _ru n tim e .s o
/s y s te m /l i b /
HAL l e d.default .s o
/s y s te m /l i b /h w/
L in u x L in u x
含l e c驱 动,提 供/d e v/le d s设 备 节 点
2-4-2 LedClient 软件实现
从上面的系统调用图可以看到 LedClient 与 ForlinxLEDTest 不同之处在于 LedClient 没
-44-
www.witech.com.cn 2011.7.31