《Learning Android中文版》学习笔记01
概述
Android是一个为移动设备设计的开源系统。它由Google主导的开放手持设备联盟(Open Handset Alliance)维护。
Android是一个开放源码的平台。Android选择了对商业行为比较友好的许可证(Apache/MIT),
Android是为移动设备而设计的系统。Google把它做成一个通用的平台,为各种手机和其它设备都提供支持。
Android的架构
Android 是基于 Linux 系统构建的。最主要的因素,在于它的可移植性、安全性以及丰富的特性。
- Linux可以轻松地移植到各种不同的硬件平台上。有了Linux做硬件抽象层,Android就不必为不同硬件的兼容性而劳心。Linux 的绝大多数底层代码都是用可移植的 C 代码编写,因此第三方开发者可以将 Android 移植到很多不同的设备上。
- Linux 已经在一些苛刻的环境下使用和测试了数十年,被证明是一个非常安全的系统。Android 依赖 Linux 实现其安全特性。 所有的 Android 应用都在独立的 Linux 进程中执行,可以直接应用Linux进程的权限机制。由此,Android得以将大部分安全措施交由底层的Linux实现。
- Linux 系统本身就具有很多实用的特性。 Android 从中受益良多,例如内存管理、电源管理和网络部分。
本地库
来自开源社区的 C/C++ 本地库为 Android 应用层提供了很多必需的服务。它们包括:
- WebKit: 一个高速的Web渲染引擎,这个引擎已经被 Safari , Chrome 和很多其他的浏览器所使用。
- SQLite: 一个全功能的 SQL 数据库
- Apache Harmony: 开源的 Java 实现
- OpenGL: 3D 图像渲染库
- OpenSSL: 安全套接字层
- 等等
这些库中的大部分都是被原封不动地拿过来的,但是 Bionic 是一个例外。 Bionic 基本上是 C 标准库的重写版。 使用 Bionic 的原因有如下两条:
- 技术方面: 专为电量有限的设备进行优化。
- 许可证方面: 对他人的使用和修改是许可证友好的。
Tip:
GNU libc 是 Linux 默认使用的C标准库,它使用的 GPL 协议要求修改者在发布产品时都必须开放源代码,并反馈给开源社区。 这样的许可证对于多数商业公司来说都是不友好的,因为他们通常需要保护自己的私有代码。Bionic 使用的 Apache/MIT 许可证对于这点就要宽松一些,并不强制修改者开放源码。
Dalvik虚拟机
Dalvik 是一个专为 Android 设计的虚拟机。
传统的Java虚拟机(JVM)是为了适应各种不同环境而设计的,强调泛用性。但Dalvik的开发团队认为专注于一个方面,针对移动设备问题,专门设计了Dalvik。
使用Dalvik VM代替传统Java VM的另一个好处在于许可证。
Java语言、Java开发工具以及Java类库都是自由的,但当时的Java VM不是。现在已经有了许多开源的 JVM 替代品,比如 OpenJDK 和 Apache Harmony 等等。但在2005年,这对Android来讲还是个大问题。
Android和Java
平常的Java开发都是先编写Java代码,然后通过Java编译器编译成字节码,最后在JVM上运行。但在Android中并非如此。相同的是仍需编写Java代码然后编译为字节码,但Dalvik编译器在执行前,会将Java字节码重新编译为Dalvik字节码。到最后真正执行的是Dalvik字节码。上图JVM和Dalvik展示了标准JVM(左侧)与Android的Dalvik(右侧)之间的区别。
Note:
提及Java,身为程序员像是有很多工作需要做。但实际上许多的复杂步骤都可以由Eclipse或者ant这样的工具自动完成,而你几乎不会感觉到这些步骤存在。
你也许想知道,为什么不直接把Java代码编译成Dalvik字节码呢这是有考虑的。让我们回到2005年 Dalvik 项目刚刚开始时,当时 Java 的语法修改很频繁, 但 Java 字节码基本上没有什么太大的改动。于是 Android 团队决定使用 JVM 字节码而不是 Java 源码来产生 Dalvik 代码。
好处: 理论上你可以使用任何可以编译成 Java 字节码的语言来开发 Android 应用,比如 Python 或者 Ruby 。 我说“理论上”是因为你还需要可用的 SDK 和库。不过有万能的开源社区在,未来会出现一套完善的解决方案也未可知。
另外需要注意的是 Android Java 并非来自标准的 Java 家族。 Java 一般分为:
- Java 标准版: 用于开发基本的桌面型应用。
- Java 企业版(也叫 J2EE 或者 JavaEE ): 用于开发企业级应用。
- Java 微型版(也叫 J2ME 或者 JavaME ): 用于移动平台的 Java 。
Android的Java类库比较接近 Java 标准版,它们的主要区别在于Java类库的GUI接口( AWT 和 Swing )被替换成了 Android 的专用接口。 Android在支持标准 Java 的类库之余,也提供了若干新功能。这一来你可以很快地上手Android开发。
应用程序框架
应用程序框架是Android程序的执行环境,也是开发者的强大工具箱。另外,它也拥有Android平台中最全面最完善的文档。
在应用程序框架中,你可以发现很多为Android设计的Java库。除此之外,也有系统服务的支持,比位置、传感器、WiFi、电话等等。
应用程序
架构的最上层是你和其他开发者创建的各种应用,也是Android系统对用户最有价值的一环。它可以预先安装在系统中,也可以从诸多的软件商店中下载。
APK文件
每个应用都是一个 APK 文件(Application PacKage,应用程序包 )。一个 APK 文件基本上由三个部分组成。
- Dalvik 代码: 由你的 Java 文件( Java 源文件可以自动编译成 Dalvik 代码)编译而来的 Dalvik 字节码。这是完成你程序功能的主要部分。
- 资源: 资源就是除了代码外剩下的部分,例如图像文件和布局文件。你的应用中可能包含若干图片,音频/视频,还有很多的 XML 文件描述用来表述UI布局、语言包等等。总之,这些都是资源。
- 本地库: 你的应用中可能会包含一些本地代码,比如 C/C++ 库。 这些库将一并打包在 APK 文件中。
应用程序签名
Android 程序在安装前必须进行签名。在开发时,我们可以使用开发者密钥(debug key)作为临时签名——这个密钥已经包含在开发环境中。 但作为商品发布时,你就必须使用自己的密钥进行签名。关于签名的具体步骤可以在 Android 网站的 Signing Your Application 页面找到。在后面我们将具体地讨论这个话题。
应用的发布
在多数的平台上(比如iPhone),应用的发布都由一个单独的提供商独揽。 而在 Android 中,可以存在很多不同的 Android 商店。
- 应用由不同的Android商店发布。
- 应用也可以通过 Web 发布。使用浏览器下载一个 APK 文件, APK 文件即可自动安装到你的手机上。
关于病毒、恶意程度和其他坏东西的一点讨论
Android的应用商店是一个去中心化的发布系统,自然就免不了有人利用用户的信任传播恶意软件来做坏事。
Android把这个问题交给市场去解决。如果你了解自由市场,就知道商店的信誉是良莠不齐的。 Google会根据用户的举报,通过人工移除Android Market 中的恶意软件(比如钓鱼软件)来保证用户的安全。其它商店也可以做出更多主动检测,并给出一个明显的提示。