Domo Arigato Mr Androidato—新 Google 移动 Linux 框架 Android 简介
All your phones, are belong to Google — Google 为开放手机联盟创建的新软件堆栈 Android 概述。
开放手机联盟 (OHA) 是一个行业贸易团体,由 30 多家技术和移动公司组成。OHA 的重点是加速移动应用和硬件领域的创新,并为消费者提供更全面且廉价的移动设备体验。Android 是 Google 为 OHA 开发的新的移动应用开发框架,它代表了 OHA 成员为使开放平台成为行业成功的一部分而做出的更宏大承诺。
Along Came an Android
除了最近宣布有意竞标 700MHz 无线频谱的 C 频段外,Google 还在继续带头确保 FCC 授权频谱对所有移动设备和所有操作系统开放。这两个方面部分解释了 Android 发布如此重要的原因。想象一下,像现在这样使用您的手机,但可以选择像修改台式电脑一样修改它。借助 Android,您将能够根据自己的喜好调整手机上软件的子集——不仅仅是更改背景、选择铃声或下载运营商批准的软件。如果这个想法成为现实,它可能预示着个人计算新时代的开始,甚至可能促进新一代小型手机公司和软件供应商的诞生。在不就开放频谱、开放设备、开放软件和开放访问的好处进行过多哲学探讨的情况下,让我们来探讨问题的核心,或者我们应该说,Android 的逻辑。
The Meat
Android 软件开发工具包 (SDK) 的主要功能包括应用程序框架、名为 Dalvik 的内存优化运行时环境(之所以如此命名,是因为一位主要工程师对冰岛小镇的喜爱)、基于 WebKit 的集成浏览器、自定义 2D 图形库、基于 OpenGL ES 1.0 的 3D 图形库、通过 SQLite 进行结构化数据存储、支持各种媒体格式(MPEG-4、H.264、MP3、AAC、AMR、JPG、PNG 和 GIF),以及硬件相关的对多种组件(GSM、Bluetooth、EDGE、3G、Wi-Fi、摄像头、GPS、指南针和加速计)的支持。所有这些功能都可以通过 Eclipse IDE 访问,也可以通过用户自己的 Java 环境单独访问。该平台还包括模拟器、调试实用程序、内存和性能分析工具以及一组示例程序的源代码。
图 1. 在 Android 模拟器上使用基于 WebKit 的浏览器浏览 Linux Journal 网站。此特定屏幕截图突出显示了内置的缩放功能,使您能够查看网站的全尺寸视图。
图 2. 使用内置的地图功能查找我在俄亥俄州的家乡。地图功能的工作方式与互联网上的地图功能类似——首先提供世界视图,然后允许您选择特定区域并不断放大,直到达到放大倍数限制或对您看到的内容感到满意为止。
So Many Layers, So Little Time
如图 3 所示,Android 框架由四层组成。堆栈的顶部是恰如其名应用程序层,之所以如此称呼,是因为完成的应用程序在此层中组装并位于框架中。第二层是应用程序框架层,每个应用程序的构建块都使用底层系统库和关联的应用程序代码在此层中创建。接下来是库和运行时层,核心系统库、Google Java 库和 Dalvik 虚拟机驻留在此层中。第四层也是最后一层是内核层,Linux(版本 2.6.x)在此层中与底层硬件通信。
图 3. Android 框架的层次结构视图
表 1. Android 框架与现有移动框架的比较
Application Layer
Android 操作系统是一个多进程系统,其中系统进程和应用程序进程在其自己的 ID 空间内运行。应用程序和系统之间的安全性在进程级别使用标准 Linux 设施(例如,自由裁量访问控制 (DAC))来维护。安装应用程序后,将在系统上为其分配一个唯一的用户 ID,在其安装生命周期内有效。此唯一用户 ID 为应用程序在 Android 系统中提供专用且受保护的执行堆栈。
Android 应用程序的默认行为是在其拥有的对象上自己的容器内运行。换句话说,Android 应用程序无权执行可能对用户体验或关联数据产生不利影响的操作。此行为可以通过两种方式修改:1) 程序员可以与其他应用程序显式共享应用程序空间,或者 2) 程序员可以与其他应用程序和系统显式共享应用程序组件。这些例外通过应用程序清单文件进行设置。
清单文件 AndroidManifest.xml 是每个应用程序中都必需的文件,它位于应用程序文件夹的根目录中。它不仅提供了一种定义应用程序安全特性的方法,而且还以公开的应用程序组件(称为活动、intent、接收器、服务和提供程序)的形式提供了应用程序的轮廓。有关清单文件的更多信息,请访问 Android 网站(请参阅“资源”)。
Application Framework Layer
此层在设计时考虑了重用性,使程序员能够将五种类型的组件组合在一起,以创建应用程序的基本构建块
1. Views
2. Content Providers
3. Resource Managers
4. Notification Managers
5. Activity Managers
第一个组件 Views 代表用户界面的最基本部分。每个视图负责管理与其代表的屏幕区域关联的布局和事件。视图可以组合在一起形成 Viewgroups,并排列成层次结构树,其中包含其他视图和 Viewgroups。此树形成特定应用程序活动的用户界面,例如将新联系人输入到联系人簿中或向日记中添加注释。
下一个组件是 Content Provider。Content Providers 使程序员能够定义一个资源,从中可以使用内容通用资源指示符 (ContentURI) 包装器和通用资源指示符 (URI) 来拉取或推送数据。每个 ContentURI 都包装一种唯一的数据类型,例如联系人、设置和通话记录,并提供辅助方法来访问通过 URI 引用的关联数据。程序员可以自由决定他们希望如何存储、检索和修改公开共享的应用程序数据,但他们必须创建一个提供程序,其中包含可重复的方式来查询和返回数据。
为了实现此要求,每个 URI 必须至少包含三个组件:content:// 的标准前缀、数据授权机构以及内容提供程序的数据路径。如果程序员想要通过唯一 ID 请求特定数据,则可以在 URI 中添加一个附加组件,但仅当应用程序程序员必须知道记录的确切 ID 时,第四个组件才是必需的。组合在一起后,典型的 URI 可能类似于 content://contacts/people/42。
您还可以使用 URI 返回整组记录。例如,如果您想返回完整的联系人集,您将使用 content://contacts/people。非常有用,不是吗?但是,当您想在联系人簿中查找 Ford 却不记得相应记录的 ID 时会发生什么?Android 为每种类型的 ContentURI 提供了辅助类来应对这种情况,使用户能够轻松找到特定 Content Provider 提供的数据。有关如何创建、使用和修改 Content Provider 以及如何使用更高级概念(如托管游标)的确切详细信息,请访问 Android 网站了解更多信息。
下一个组件是 Resource Manager。Resource Managers 提供了一种处理与应用程序关联但不包含代码的文件的方法,例如图标、布局以及与应用程序国际化和本地化关联的文件。由于所有资源文件都在构建时由 Android 构建系统编译为二进制文件,因此 Resource Managers 对文件在源代码树中的位置很敏感。为了更容易避免与放错位置的外部文件相关的构建错误,通过 Eclipse 插件创建的所有 Android 项目都在应用程序源代码树的根目录中包含一个名为 res 的资源目录。资源目录包含特定数据类型的子文件夹,编译器会在构建时搜索这些子文件夹并根据应用程序代码进行验证。有关处理 Resource Managers 的确切详细信息非常复杂,并且处理本地化和国际化的规范尚未完成,因此,如果您想了解更多信息,请点击本文“资源”中提供的链接。
下一个组件是 Notification Manager。Notification Managers 为开发人员提供了向用户发出设备上发生的事件警报的能力。一些示例包括在收到电子邮件时以通知窗口的形式显示视图、通过闪烁背光来提醒用户来电,或者甚至在电池电量不足时通过响亮的 Britney Spears 铃声来催促用户。这些都是您可能在 Android 应用程序中使用 Notification Manager 的典型示例。有关如何实现 Notification Manager 的确切详细信息也位于 Android 网站上(请参阅“资源”)。
应用程序框架层的最后一个组件是 Activity Manager。Activity Managers 可以说是 Android 框架中运行的任何应用程序中最重要的部分。活动被定义为用户执行的原子任务,当用户启动这些任务时,会引发应用程序的新行为。此类行为可能会创建新视图、从内容提供程序检索数据或访问底层硬件以进行电话呼叫。此类任务是在 Android 框架中构建应用程序的基础。Activity Managers 是负责维护应用程序内导航堆栈并根据可用资源和活动的特定状态执行各种内务处理任务的组件。通常,Activity Managers 尝试尽可能长时间地保留与活动相关的进程,但有时,它们可能被迫通过终止特定活动来释放资源。有关实现 Activity Managers 的更多信息,请访问 Android 网站(请参阅“资源”)。
Library and Runtime Layer
Android 框架中的第三层由一组共享的 C/C++ 库、核心 Java 库和 Dalvik 虚拟机组成。Android SDK 中当前可用的一组库包括:BSD 派生的 libc 实现(针对嵌入式 Linux 设备进行了优化)、基于 PacketVideo 的 OpenCORE 的媒体库、名为 surface manager 的显示子系统和 2D/3D 管理库、LibWebCore、SGL 2D 图形引擎、与 OpenGL ES 1.0 API 关联的 3D 库、FreeType 和 SQLite。
除了这些库之外,还有各种核心 Google Java 库。有些人质疑 Android 的 Java 实现是专有的,尽管其他人声称该实现对于 Google 优化 Android 框架是必要的。要记住的重要一点是,Google Java 库仅提供 Sun Java 库提供的功能的子集。此层的剩余部分是 Dalvik。Dalvik 是 Google 创建的内存优化 Java 虚拟机 (JVM),用于运行优化的 .dex 字节码。除了 Google Java 库之外,Dalvik 和关联的字节码编译器 dx 仍然是自由和开源软件世界中潜在的争议来源。Google 声称源代码将很快可用,但对其为何决定不通过 Sun 的开源 Java 工作来追求这些更改保持沉默。
Kernel Layer
Android 框架中最接近物理硬件的层是 Linux 内核。Android 计划随版本 2.6.x 一起发布,它将依靠 Linux 来管理各种服务,例如安全性、内存管理、进程管理、网络以及各种设备的驱动程序。
The Android Eclipse
如果您有兴趣使用 Android SDK,可以通过 Eclipse 或其他开发环境或 IDE 进行操作。如果您想使用 Eclipse IDE,则需要安装 3.2 或 3.3 版本,以及 Eclipse JDT 插件,以及 Java 开发工具包 (JDK) 的 5 或 6 版本。您可能还需要使用以下链接通过“软件更新”菜单安装 Android 开发工具 (ADT) 插件:https://dl-ssl.google.com/android/eclipse。ADT 插件自动执行了许多您手动开发 Android 应用程序需要执行的操作,如果您是 Java 开发新手,或者如果您像大多数程序员一样通常很懒惰,则建议使用它。
完成环境设置后,您需要添加最重要的部分,即 Android SDK。您可以在 code.google.com/android/download.html 找到最新版本的 SDK。下载 SDK 后,建议您在解压缩内容之前验证 md5 校验和。验证内容后,您需要将内容解压缩到您选择的位置,并将相应的路径添加到 Eclipse 首选项菜单中的 Android 菜单。
图 4. 通过模拟器显示的 Android 的默认菜单。您可以通过用鼠标单击按钮或使用键盘选择按钮来导航菜单。
如果您不想使用 Eclipse,除了 Android SDK 之外,您仍然需要 JDK 5 或 6 和 Apache Ant 1.6.5 或更高版本。如果您选择不使用 Eclipse,我将由您来执行与将 SDK 组件源到正确路径相关的必要步骤。如果您遇到问题,请务必注意,不支持 Java 的 GNU 编译器 (GCJ),并且如果您安装了 JDK 1.4,您将无法使用 Android 框架。如果您对安装 Android SDK 和/或配置环境有疑问,Android 网站上提供了更深入的信息。
Robotic Memories
关于 Android SDK,最好的事情之一是它启动和运行有多么容易。使用我现有的 Eclipse Europa 环境,在下载所有组件后仅几分钟,我就能够开始开发我的第一个应用程序。我只用了几次鼠标点击和按键操作,就在 Android 模拟器中运行了相当于“Hello, world!”的应用程序,又过了几分钟就运行了一个 Notepad 应用程序。关于 Android 的下一个最好的事情是,它完全专注于应用程序开发,而不是外围要求,例如内核编译和安装。如果您想完全专注于移动 Java 应用程序开发,那么 Android 可能是适合您的移动 Linux 框架。简而言之,Google 煞费苦心地花时间为开发移动 Linux 应用程序提供了出色的抽象层,并且为现有 Java 应用程序程序员创建 Google 支持和 OHA 支持的应用程序提供了途径。
尽管有所有这些美好的事物,我必须承认,我对 Android 仍然感到有些不满意。一方面,我很高兴能够如此快速地开始从事应用程序开发,但另一方面,我感觉,就这些了吗?也许是因为我使用的是 SDK 的 beta 版本,而且并非所有组件都已发布,但由于某种原因,我感觉更像是一个将乐高积木拼在一起的孩子,而不是一个开发人员,在创建一个应用程序堆栈来运行我的新应用程序。因此,如果您像我一样想要控制整个堆栈,我仍然建议坚持使用更透明和灵活的方法,例如 OpenMoko 框架。请记住,像所有其他免费和开源软件项目一样,选择权在您手中。
Resources
Android: code.google.com/android
Android SDK: code.google.com/android/download.html
Open Handset Alliance: www.openhandsetalliance.com
A Java Developers Thoughts on Dalvik: www.oreillynet.com/onjava/blog/2007/11/dalvik_googles_tweaked_nonstan.h…
Eclipse: www.eclipse.org
Adam M. Dutko 是位于俄亥俄州肯特市的一家小型家族企业的首席网页设计师。他维护 Fedora 的 mrxvt 和 astyle 软件包,酿造啤酒,并在克利夫兰州立大学软件工程实验室从事无线传感器网络工作。他目前与他出色的妻子 Gretchen 一起住在俄亥俄州莱克伍德市。您可以在 littlehat.homelinux.org:8000 上阅读更多关于他的信息。
_________________________________________
本文最初刊登在 2008 年 3 月号的 Linux Journal 上。如需更多类似深度的文章,请立即订阅印刷杂志!