第一章 Android系统介绍
星期二, 06/08/2010 - 12:10 — williamAndroid系统是由Google主导的,由OHA(开放手机联盟,Open Handset Alliance)开发的一个操作系统,最初它主要应用于手机设备。它设计之出就表现出了完全的开放性和强大的可扩展性,因此已经成为最为流行的潜入式设备操作系统之一,如上网本、机顶盒、全球定位设备、车载设备、电视机等。Android给设备带来了全新的网络应用体验。
1.1 Android系统框架
Android系统是基于Linux和Java技术,它在底层采用Linux内核和本地库,在上层提供Java支持框架和开发接口。它借助于Linux强大的稳定性、开放性和可移植性,Java语言开发的广泛性、简单性和可移植性,一经推出就受动广泛关注和欢迎,在嵌入式开发中产生比较深远的影响。
图1.1 Android系统架构
考虑到性能的问题,Google没有采用Sun的基于堆栈的虚拟机,而是开发了一个基于寄存器的Android虚拟机 -Dalvik虚拟机。当然Android系统提供了一个工具用来把Java虚拟机格式转换为Daleik虚拟机格式。不过Android仅支持有限的Java运行库,因此不是所有的Java程序都可以在Android里直接编译运行。
当然任何一个系统都有其固有个缺点,而且它就隐藏在它的优点之中,Android也不例外。首先Android系统的开放性导致任何厂家都可以修改定制而推出自己的Android系统,这就导致了尽管设备运行的系统都是Android,但运行的程序就或多或少不兼容,这对第三方程序开发员人来说不是个好消息,标准的不统一势必会影响的Android程序的开发使用。其次,尽管Android系统是基于Linux和Java的,但由于它开发了一套独立的UI系统,它完全不兼容现有的Linux和Java应用程序,这不仅是浪费了现有的开发资源,而且是极大的浪费了未来的开发资源。不管Android社区有多大,比起Linux开源社区来说,它也是大海中的一点水,这是否会给对手以机会呢?如Intel的Moblin系统、Nokia的Maemo系统以及Ubuntu的上网本系统,还有最新的由Intel和Nokia联合开发的MeeGO系统。
回到Android系统本身,如图1.1,它主要包括五个部分,分别是Linux 内核(红色部分)、本地库(绿色部分)、Dalvik 虚拟机(黄色部分)、应用程序框架和应用程序(蓝色部分)。
- Android Linux内核
最初的Android内核是基于2.6.25的,但由于采用的同样的版本管理系统,Android内核紧跟Linux内核的进度,目前最新的开发版本是2.6.31,但版本其实已经不重要了,你只要记住Android内核基本上同步于Linux内核就可以了,在此基础上Android对Linux内核做了些修改和功能添加使之Android化,如著名的Binder、匿名共享内存(ashmem)等。
目前在Android的源代码仓库中有4个关于Linux的项目,他们分别是:
- kernel/common.git:Common Android Kernel Tree
- kernel/experimental.git :Experimental Kernel Projects
- kernel/msm.git :Kernel Tree for MSM7XXX family on Android
- kernel/omap.git :Kernel Tree for OMAP family on Android
- 本地库
说到本地库,首先我们想到的一定是libc库。是的,Android也不例外,他支持c库,但不是glibc或其他常见的小型仓库,比如uclibc,而是一个额称为Bionic的C库。尽管它不是很强大,但足够用了。按照Google的说法,选择Bionic的原因是因为:
- 尽量移除GPL License的模块
- 更小的代码密度和更快的运行速度
但Bionic C库也有它的局限性:首先,不完全支持posix标准;其次,不支持libm和libthread_db;第三,不能使用标准的Toolchain来编译Android本地应用。Android的编译链也是依赖于Bionic库的,它的动态链接库加载使用的是linker,而不是ld.so。它的prelink使用的是apriori(build/tools/apriori),strip 工具使用的是soslim(build/tools/soslim)而不是strip。
Android的本地库基本上位于源代码树的external和system目录下。
- Dalvik虚拟机
Dalvik是Google Android平台最重要的一个部分,是Google专门为Android开发的Java虚拟机,被称为Dalvik虚拟机。按照Google的说 法,Dalvik具有高效、简洁、节省资源的特点,非常适合资源有限的嵌入式系统。
Dalvik是按照Apache License v2方式发布的,Google尽量把GPL Licnse的软件移除Android系统。这就避免了非免费的Java ME版权问题,也移除了GPLv2的Java SE。
以前也有些公司搞过Linux/Java平台,即底层支持Linux系统、上层采用Java技术,但都因为效率的问题而放弃。Google的Dalvik虚拟机很好的解决了这个问题,同其他的Java虚拟机相比,Dalvik虚拟机有如下特点:
- Dalvik虚拟机采用了基于寄存器的虚拟机技术。与Java虚拟机不同,Dalvik采用了基于寄存器(register based)的技术,而不是基于堆栈(stack based)的技术。我们不去争论基于寄存器的虚拟机是不是更好,如果有兴趣,你可以去比较他们的性能差异。
- Dalvik虚拟机使用自定义的字节码格式(称为DEX文件,.dex),不兼容现有Java字节码格式。Android里的dx工具负责把Java字节码转换成Dalvik字节码。
- Dalvik虚拟机运行效率高,同事代码密度小,节省资源。
- Dalvik虚拟机常量池只使用32位的索引。
- Dalvik虚拟机不支持JIT编译技术(Just In Time Compiler)。
对于Android应用程序开发者来说,我们必须清楚如何在Android Dalvik虚拟机上使用内存,下面是内存使用上的一些限制:
- Dalvik默认的栈大小是12K(3个页,每个页4K)。
- Dalvik堆(heap)默认启动大小:2M,默认最大值16M。
- Dalvik堆(heap)支持的最小启动大小:1M,支持的最大值1024M。
- Dalvik的堆和栈参数可以通过–Xms 和–Xmx更改。
对于Android的Java应用程序来说,每一个应用对对应于一个独立的Dalvik虚拟机实例进程,当然每个Android Java应用程序的线程也对应于一个Linux线程。这相当于每个Android Dalvik应用程序都运行在自己的沙盒里面从而保证Dalvik应用程序的安全性。当然Android系统也充分利用了这个特性,每个Android Dalvik应用程序都被赋予了一个独立的Linux PID(app_*)。
- 应用程序框架
Android应用程序框架完全使用Java语言编写,运行在Android Dalvik虚拟机之上,它通过Java JNI接口调用本地库的接口。
Android应用程序框架向下封装了系统的各种系统服务及硬件的访问接口,向上提供统一的应用程序开发接口,即Android API。Android应用程序通过调用Android应用程序框架接口来实现各种功能。
Android应用程序框架封装了大部分的系统服务功能,它们包括:
- Activity Manager
- Windows Manager
- Content Provider
- View System
- Resource Manager
- Notification Manager
- Packet Manager
- Telephony Manager
- Location Manager
对于Android开发者来说,Android应用程序框架是最重要的一部分,只有真正理解了这个框架说包含的内容,才能写出高效的Android应用程序。
- 应用程序
Android是一个功能完全的移动设备操作系统,它自带了核心应用程序,这样你就不需要额外的开发而直接在你的设备上使用Android系统了,这些应用程序开起来中规中矩,如果你想要一个更加绚丽的操作界面,你可以修改他们来实现自己的应用程序。
很明显,Android应用程序都是用Java语言开发的,它依赖于Android应用框架(framework.jar),同时运行在Android Dalvik虚拟机之上。
我们简单的介绍了Android系统的架构,有些地方也许你可能不是很理解,不要紧,这里我们仅近是粗略的介绍,在后面会有更加详尽的描述。下面的内容是为初学者准备的,以便让他们能容易的建立Android环境,从而对Android系统有个认识。如果你已经熟悉了这部分内容,请跳过下面 1.2和1.3章节。
1.2 Android开发环境
Android为第三方Android应用程序开发者提供了完备的开发工具支持,即Android SDK,它包括开发工具(ADT Eclipse 插件)、调试工具(ADB、DDMS、Logcat等)、Android设备模拟器(Emulator)。在Google官方网站(developer.android.com)上有详细的SDK安装和使用手册,我们在这里简单对它作简单的介绍,以便读者可以很容易的上手。
- 下载
登录Android SDK官方网站(http://developer.android.com/sdk)下载最新版本的Android SDK。
登录Eclipse官方网站,下载Eclipse(支持的版本是3.3/3.4/3.5),推荐你下载最新的版本
- 安装
Android SDK安装包是一个zip压缩包,直接解开就可以使用了,一般需要把SDK目录下的/tools目录添加到系统目录中,这样你在任何目录下都可以运行SDK命令了。
安装ADT Eclipse插件:以Eclipse3.4/3.5为例:
- 进入Help → Software Updates....
- 选择Available Software标签,
- 单击Add Site...
- 输入https://dl-ssl.google.com/android/eclipse/
- 单击OK
- 选择安装Developer Tools插件
这里要注意的就是,如果你位于公司防火墙的后面,请在Eclipse的网络设置里面设置好代理服务器,否则Eclipse会由于找不到以来的插件而安装失败。
- 设置使用
Android ADT插件安装好后,Eclipse会重新启动,在windows->选项->Android里面设置好Android SDK的安装路径,好了创建一个Android项目并运行它吧...
1.3 从源代码编译Android系统
Android是一个开源的移动设备操作系统,你可以从Android的官方网站上下载Android的源代码。Android采用GIT源代码版本管理系统。请到http://source.android.com/了解更多信息。为了获取源代码,你首先需要安装GIT和REPO系统。
由于Kernel跟硬件设备关系十分紧密,Android也提供了多个针对不同设备的Linux kernel项目,如没有特别说明,本书中我们主要针对应用于模拟器的Android common kernel和Goldfish平台。
准备工作:(以Ubuntu904和Ubuntu910为例)
- 安装JDK,需要安装JDK 1.5_12以上版本
- 安装以来包:sudo apt-get install git-core gnupg sun-java5-jdk flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zipcurl libncurses5-dev zlib1g-dev
- 安装repo:curl http://android.git.kernel.org/repo >~/bin/repo & chmod a+x ~/bin/repo
同步代码:(以Eclair为例)
- repo init -u git://android.git.kernel.org/platform/manifest.git -b eclair
- repo sync
编译:
- make(生成的映像位于out/target/product/generic/)
- make sdk (生成的sdk位于out/host/linux-x86/sdk/)
获取common kernel代码:
- mkdir android_kernel
- cd android_kernel
- git clone git://android.git.kernel.org/kernel/common.git
由于Android的文档并不是很丰富,因此浏览源代码是深入的掌握Android系统的一个有效途径,我们已经把Android源代码同步到本地了,好好利用它吧!这些代码在下面的介绍中还会用到的