平台介绍
Android 是一种基于 Linux 的自由及开放源代码操作系统,由操作系统、中间件、用户界面和应用软件组成。主要使用于智能手机和平板电脑等移动设备,由 Google 和开放手机联盟领导开发。中国大陆较多人使用「安卓」或「安致」作为中文名称。
一、系统架构
Android 的系统架构和其操作系统一样,采用分层架构。
Google官方提供的经典分层架构图:
从架构图看,Android 分为四层,从高层到低层分别是应用程序层、应用程序框架层、系统运行库层和 Linux 内核层。
应用程序
应用程序层会同一系列核心应用程序包一起发布,包括客户端、SMS 短消息程序、日历、地图、浏览器、联系人管理等。所有应用程序都使用 Java 语言编写。
应用程序框架
开发人员也可以完全访问核心应用程序所使用的 API 框架。架构设计简化了组件重用:任何一个应用程序都可以发布功能块,其它应用可以使用(须遵循框架安全性)。这套重用机制也方便用户替换程序组件。
隐藏在每个应用后面的是一系列服务和系统,其中包括:
-
丰富而又可扩展的 视图(Views),用来构建应用程序,包括列表、网格、文本框、按钮,甚至可嵌入的 web 浏览器。 -
内容提供器(Content Providers)使应用程序可以访问另一个应用的数据(如联系人数据库),或共享自己的数据。 -
资源管理器(Resource Manager)提供非代码资源的访问,如本地字符串、图形和布局文件(Layout files)。 -
通知管理器(Notification Manager)使得应用程序可以在状态栏中显示自定义提示。 -
活动管理器(Activity Manager)用来管理应用程序生命周期并提供常用的导航回退功能。
系统运行库
Android 包含一些 C/C++ 库,能被 Android 系统中不同的 组件使用,通过应用程序框架为开发者提供服务。核心库包括:
-
系统 C 库:从 BSD 继承来的标准 C 系统函数库 Libc,专门为基于 Embedded Linux 的设备定制。 -
媒体库:基于 PacketVideo OpenCORE;支持多种常用音视频格式回放和录制,同时支持静态图片文件。编码格式包括 MPEG4、H.264、MP3、AAC、AMR、JPG、PNG。 -
Surface Manager:管理显示子系统,并为多个应用程序提供 2D 和 3D 图层的无缝融合。 -
LibWebCore:较新的 web 浏览器引擎,支持 Android 浏览器和一个可嵌入的 web 视图。
二、系统内核
Android 运行于 Linux kernel 之上,但并不是 GNU/Linux。一般 GNU/Linux 里支持的功能,Android 大都没有支持,包括 Cairo、X11、Alsa、FFmpeg、GTK、Pango 及 Glibc 等都被移除。Android 又以 Bionic 取代 Glibc、以 Skia 取代 Cairo、再以 OpenCORE 取代 FFmpeg 等。
为了达到商业应用,必须移除被 GNU GPL 约束的部分,例如把驱动程序移到 Userspace,使 Linux driver 与 Linux kernel 彻底分开。Bionic/Libc/Kernel 并非标准的 Kernel header files。Android 的 Kernel header 是利用工具由 Linux Kernel header 产生的,这样做是为了保留常数、数据结构与宏。
Android 的 Linux kernel 控制包括安全(Security)、存储器管理(Memory Management)、程序管理(Process Management)、网络堆栈(Network Stack)、驱动程序模型(Driver Model)等。下载源码之前先要安装构建工具 Repo 来初始化源码。Repo 是 Android 用来辅助 Git 工作的工具。
三、APK 文件
APK 是安卓应用的后缀,Android Package 的缩写,即 Android 安装包。APK 类似 Symbian 的 Sis 或 Sisx:把 APK 传到模拟器或手机中执行即可安装。APK 文件其实是 zip 格式,后缀改为 apk;UnZip 解压后可以看到 Dex 文件。Dex 是 Dalvik VM executes 的全称,即 Android Dalvik 执行程序,并非 Java ME 字节码而是 Dalvik 字节码。
一个 APK 文件结构为:
-
META-INF\(Jar 文件中常可以看到) -
res\(存放资源文件的目录) -
AndroidManifest.xml(程序全局配置文件) -
classes.dex(Dalvik 字节码) -
resources.arsc(编译后的二进制资源文件)
Android 运行一个程序时首先需要 UnZip,然后类似 Symbian 那样直接执行安装,和 Windows Mobile 中的 PE 文件有区别。这样做对程序的保密性和可靠性不是很高,通过 dexdump 可以反编译,但符合当时的发展规律;微软的 Windows Gadgets 或者说 WPF 也采用了这种架构方式。
dalvik vm 的执行文件被打包为 apk,最终运行时加载器会解压然后获取编译后 androidmanifest.xml 中 permission 分支相关的安全访问,但仍然存在很多安全限制。如果把 apk 传到 /system/app 文件夹下会发现执行不受限制。平时安装的文件可能不在这个文件夹;android rom 中系统 apk 默认会放入这里,它们拥有 root 权限。
四、硬件抽象层与中间件
Android 的 HAL(硬件抽象层)能以封闭源码形式提供硬件驱动模块。目的是把 Android framework 与 Linux kernel 隔开,让 Android 不至过度依赖 Linux kernel,达成 Kernel independent,也让 framework 开发能在不考虑驱动程序实现的前提下进行。
HAL stub 是一种代理人(Proxy)概念,Stub 以 *.so 形式存在。Stub 向 HAL「提供」操作函数(Operations),由 Android runtime 向 HAL 取得 Stub 的 Operations,再 Callback 这些操作函数。HAL 里包含许多 Stub。Runtime 只要说明「类型」即 Module ID,就可以取得操作函数。
中介软件是操作系统与应用程序的沟通桥梁,应用分为两层:函数层(Library)和 虚拟机(Virtual Machine)。Bionic 是 Android 改良 libc 的版本。同时包含了 Webkit(Apple Safari 浏览器背后的引擎)。Surface flinger 把 2D 或 3D 内容显示到屏幕上。工具链为 Google 自制的 Bionic Libc。
Android 采用 OpenCORE 作为基础多媒体框架,可分 7 大块:PVPlayer、PVAuthor、Codec、PacketVideo Multimedia Framework(PVMF)、Operating System Compatibility Library(OSCL)、Common、OpenMAX。
图形引擎以 Skia 为核心,搭配 OpenGL/ES。skia 与 Linux Cairo 功能相当,但当时相对还只是雏形。2005 年 Skia 公司被 Google 收购,2007 年初 Skia GL 源码公开;Skia 也是 Google Chrome 的图形引擎。
多媒体数据库采用 SQLite,又分为共用数据库及私用数据库。用户可通过 ContentResolver 类取得共用数据库。
中间层多以 Java 实现,并采用特殊的 Dalvik 虚拟机。Dalvik 是「寄存器型态」(Register Based)的 Java 虚拟机,变量存放于寄存器中,指令相对减少。可以有多个实例,每个 Android 应用程序都用一个自属的 Dalvik 虚拟机运行,便于优化。它并非运行 Java 字节码,而是运行 .dex 格式文件。
五、安全权限机制
Android 本身是权限分立的 操作系统。每个应用都以唯一的系统识别身份运行(Linux 用户 ID 与群组 ID),系统各部分也分别使用独立识别方式。Linux 就这样将应用与应用、应用与系统隔离开。
更多安全功能通过权限机制提供:可以限制某个特定进程的特定操作,也可以限制每个 URI 权限对特定数据段的访问。
安全架构的核心思想是:默认设置下,所有应用都没有权限对其他应用、系统或用户进行较大影响的操作。这包括读写用户隐私数据(联系人或电子邮件)、读写其他应用文件、访问网络或阻止设备待机等。
安装应用时,在检查程序签名提及的权限且经过用户确认后,软件包安装器会给予应用权限。从用户角度看,一款 Android 应用通常会要求如下权限:
拨打电话、发送短信或彩信、修改/删除 SD 卡上的内容、读取联系人、读取/写入日程、读取电话状态或识别码、精确的(基于 GPS)地理位置、模糊的(基于网络)地理位置、创建蓝牙连接、对互联网的完全访问、查看网络/WiFi 状态、避免手机待机、修改系统全局设置、读取同步设定、开机自启动、重启其他应用、终止运行中的应用、设定偏好应用、震动控制、拍摄图片等。
一款应用应该根据自身功能要求合理的权限。用户也可以分析所需权限,简单判定是否安全。如一款不带广告的单机版、没有任何附加内容需要下载,却要求访问网络,就比较可疑。
六、四大组件
Android 开发四大组件分别是:活动(Activity)用于表现功能;服务(Service)后台运行、不提供界面;广播接收器(BroadcastReceiver)用于接收广播;内容提供商(Content Provider)支持在多个应用中存储和读取数据,相当于 数据库。
| 组件 | 作用 |
|---|---|
| Activity | 一屏界面,程序流程运行其中,可互相跳转甚至带返回值 |
| Service | 无界面的长生命周期后台代码 |
| BroadcastReceiver | 过滤并响应广播,不能生成 UI |
| Content Provider | 对外共享数据的窗口,用 content:// URI 标识 |
Activity
Activity 是所有程序的根本,流程都运行在 Activity 之中,也是最基本的模块之一。一般代表手机屏幕的一屏。如果把手机比作浏览器,Activity 就相当于一个网页,其中可以添加 Button、CheckBox 等控件。
一般一个 Android 应用由多个 Activity 组成,它们之间可以相互跳转,例如按下 Button 后跳到其他 Activity。和网页跳转稍微不同的是,Activity 跳转有可能返回值:从 A 跳到 B,B 结束时可能给 A 一个返回值。
打开一个新屏幕时,之前的屏幕会被置为暂停并压入历史堆栈。用户可以通过回退返回以前打开过的屏幕。可以选择性移除一些没有必要保留的屏幕,因为 Android 会把每个应用从开始到当前的每个屏幕保存在堆栈中。
Service
Service 跟 Activity 级别差不多,但不能自己运行,只能后台运行,并且可以和其他组件交互。它是没有界面的长生命周期代码。例如打开音乐播放器后再打开浏览器,歌曲仍在后台播放,这就是由播放音乐的 Service 控制。也可以在检测 SD 卡文件变化、后台记录地理位置等场合使用。
开启 Service 有两种方式:
(1) Context.startService():Service 会经历 onCreate -> onStart(如果还没运行,先 onCreate 再 onStart;如果已经运行,则只调用 onStart,所以 onStart 可能被多次调用)。StopService 时直接 onDestroy。如果调用者自己退出而没有 StopService,Service 会一直在后台运行,调用者再启动后可以通过 stopService 关闭。多次调用 startService 不会嵌套,无论启动多少次,一旦 stopService 或 stopSelf 都会被停止。传给 startService 的 Intent 会传给 onStart。调用顺序:onCreate –> onStart(可多次)–> onDestroy。
(2) Context.bindService():经历 onCreate() –> onBind(),onBind 将返回给客户端一个 IBinder 接口实例,允许客户端回调服务的方法,比如得到运行状态。这时调用者(Context,例如 Activity)会和 Service 绑定在一起,Context 退出了,Service 就会 onUnbind –> onDestroy,所谓绑定在一起就共存亡。
BroadcastReceiver
Broadcast 是广泛运用的在应用程序之间传输信息的机制。BroadcastReceiver 是对发送出来的 Broadcast 进行过滤接受并响应的组件。可以让应用对外部事件做出响应,例如电话呼入、下载完成。BroadcastReceiver 不能生成 UI,用户看不到;通过 NotificationManager 通知用户。既可以在 AndroidManifest.xml 中注册,也可以在运行时用 Context.registerReceiver() 注册。只要注册了,事件来临时即使程序没有启动,系统也会在需要时启动程序。各种应用还可以通过 Context.sendBroadcast() 把 Intent Broadcasts 广播给其他应用程序。
Content Provider
Content Provider 是 Android 提供的第三方应用数据访问方案。对数据的保护很严密:除了放在 SD 卡中的数据,一个应用所持有的数据库、文件等,都不允许其他应用直接访问。Android 不会把每个应用做成孤岛,为所有应用准备了一扇窗,就是 Content Provider。想对外提供的数据,可以通过派生 Content Provider 类封装;每个 Provider 用一个 uri 作为独立标识,形如 content://com.xxxxx。看起来像 REST,但比 REST 更灵活:uri 可以带 id 或列表,实现者不必严格按这个模式,给 id 的 uri 也可以返回列表,只要调用者明白即可。
七、平台优势
开放性
Android 平台首先就是开放性,允许任何移动终端厂商加入 Android 联盟。显著的开放性可以使其拥有更多开发者,随着用户和应用日益丰富,平台也将很快走向成熟。开放性有利于积累人气(消费者和厂商);对消费者最大的受益是丰富的软件资源。开放也会带来更大竞争,消费者可以用更低价位购得心仪的手机。
丰富的硬件
同样与开放性相关:众多厂商会推出功能特色各具的多种产品。功能上的差异和特色却不会影响到数据同步甚至软件的兼容,如同从诺基亚 Symbian 改用苹果 iPhone,同时还可将 Symbian 中优秀的软件带到 iPhone 上使用,联系人等资料也可以方便转移。
方便开发
平台提供给第三方开发商一个十分宽泛、自由的环境,不会受到各种条条框框的阻扰,会有很多新颖别致的软件诞生。但也有两面性:血腥、暴力、情色方面的程序和游戏如何控制,正是留给 Android 的难题之一。
Google 应用
Google 从搜索巨人到全面的互联网渗透,地图、邮件、搜索等服务已经成为连接用户和互联网的重要纽带,而 Android 平台手机将无缝结合这些优秀的 Google 服务。
一句话总结:Android 是 Linux 上的分层系统:应用用 Java 跑在 Dalvik 上,经框架访问 C/C++ 库与内核;四大组件加上权限模型,构成整套平台。
转载请注明来源:平台介绍









