夜雨聆风学习资料网

ARTICLE · 1136928

安卓演化史 · 01|起点:一套原本写给相机的系统

安卓演化史 · 01|起点:一套原本写给相机的系统

2003–2009:从相机系统、开放手机联盟到 1.6 Donut,安卓最初六年打下的地基

今天全球大多数智能手机跑的是安卓,但它最初是一家小公司给数码相机写的系统。从 2003 年成立,到 2009 年的 1.6 Donut,安卓用六年把地基打好:Linux 内核、专用虚拟机、应用沙箱,还有一套免费开放的授权方式。

图1|六年,从相机系统到手机平台

一家想给相机写系统的公司

2003 年 10 月,一家名叫 Android 的公司在美国加州帕洛阿尔托成立。它最初的目标不是手机,而是数码相机:做一套更先进的相机操作系统,让相机能联网、能把照片同步到电脑和网络上。

这个方向没能说服投资人。数码相机市场的规模有限,增长也看得到头;而手机的出货量是相机的许多倍,正处在从功能机向智能机过渡的阶段。2004 年 4 月,团队把方向改成了手机操作系统。

当时的手机系统市场并不空。诺基亚主导的 Symbian 份额最大,微软有 Windows Mobile,黑莓有自己的系统,Palm 也还在。厂商要用这些系统,往往要按台付授权费,或者干脆只能用自家系统。这家小公司想做的是另一条路:系统本身免费,靠系统之上的服务赚钱。

2005 年夏天,Google 收购了这家公司,团队整体并入,继续做手机系统。此后两年,外界只知道 Google 在做手机相关的东西,具体是什么并不清楚。

iPhone 来了,原型机回到图纸上

早期的安卓原型机长得很像当时的黑莓:一块不支持触控的屏幕,下面是一排完整的实体键盘。这在 2006 年是主流的商务手机形态。

2007 年 1 月,苹果发布了 iPhone:没有实体键盘,整面是电容触控屏,用手指直接操作。这台手机让整个行业重新思考手机该长什么样,安卓团队也不例外。原来的设计被推倒,系统改为以触控为中心,而那台键盘原型机最终没有上市。

不过转向并不彻底。2008 年上市的第一款安卓手机,同时保留了触屏、侧滑全键盘和一颗轨迹球,三种输入方式都在。这也是早期安卓的一个特点:先把能想到的方式都支持上,再看用户选哪个。

开放手机联盟:先找盟友,再发产品

2007 年 11 月 5 日,安卓第一次正式公开,但发布的不是一台手机,而是一个组织:开放手机联盟。

联盟成立时有 34 家成员,覆盖手机产业链的每一环。运营商有中国移动、T-Mobile、Sprint、NTT DoCoMo 等;手机厂商有 HTC、摩托罗拉、三星、LG;芯片和元器件厂商有高通、德州仪器、英特尔、英伟达、博通等;软件公司有 Google、eBay、Nuance、Wind River 等。

这个顺序本身就说明了安卓的打法。iPhone 是一家公司从芯片选型到应用商店全部自己做;安卓则是先把运营商、手机厂商和芯片厂商拉到一起,大家共用一套免费的系统,各做各擅长的部分。厂商省下自研系统和授权费的成本,运营商多了一个能和 iPhone 抗衡的选择,芯片厂商的方案能直接适配,Google 则让自己的搜索、地图和邮件出现在更多手机上。

一周之后的 11 月 12 日,安卓 SDK 早期版本向开发者开放。Google 同时宣布了一项总奖金 1000 万美元的开发者挑战赛,鼓励开发者在第一台手机上市之前就开始写应用。

图2|开放手机联盟的四类成员

地基长什么样:一套四层的系统

安卓从一开始就是分层设计的,从下往上大致四层。

最底下是 Linux 内核,负责驱动硬件、管理进程和内存、处理网络和文件系统。安卓在标准内核上做了不少修改,比较重要的有几项:Binder,一套高效的进程间通信机制,应用和系统服务之间的调用几乎都走它;wakelock,让应用在需要时阻止手机进入休眠,这是手机省电和后台任务之间反复拉扯的起点;ashmem,匿名共享内存;还有 low memory killer,内存不够时按优先级结束后台进程,而不是让整台手机卡死。

往上一层是 原生库和运行时。原生库包括 WebKit 浏览器引擎、SQLite 数据库、OpenGL ES 图形库、媒体框架,以及安卓自己写的 C 标准库 Bionic。运行时就是 Dalvik 虚拟机,所有应用都跑在它上面。

再往上是 应用框架。它把系统能力包装成开发者能直接调用的接口,并定义了应用的四种基本组件:Activity 负责界面,Service 负责后台任务,Content Provider 负责在应用之间共享数据,Broadcast Receiver 负责接收系统广播。组件之间用 Intent 互相调用,比如一个应用想拍照,只需要发出一个拍照的 Intent,由系统找到能处理它的应用。

最上面才是 应用,包括系统自带的电话、短信、浏览器,以及用户自己安装的应用。在这套设计里,系统应用和第三方应用用的是同一套接口,原则上可以被替换:用户可以装一个别的桌面、别的短信应用来代替自带的。这在当时的手机系统里并不常见。

图3|安卓的四层架构

Dalvik:为小内存手机设计的虚拟机

安卓应用用 Java 语言编写,但运行它们的不是标准的 Java 虚拟机,而是安卓自己的 Dalvik。

原因主要是内存和效率。第一台安卓手机只有 192MB 内存,还要同时跑系统和多个应用。Dalvik 做了几处针对性的设计。

第一,换了字节码格式。标准 Java 编译出的是一个个 .class 文件,Dalvik 把它们合并转换成一个 .dex 文件,多个类共用的字符串、方法名等常量只存一份,文件更小,加载时读的数据也更少。

第二,换了虚拟机结构。标准 Java 虚拟机是基于栈的,Dalvik 是基于寄存器的,完成同样的计算需要的指令条数更少,在当时性能有限的手机处理器上更合适。

第三,用 Zygote 进程加快启动。系统开机时先启动一个叫 Zygote 的进程,把常用的系统类和资源提前加载好。之后每启动一个应用,就从 Zygote 复制出一个新进程。Linux 的写时复制机制让这些预加载的内容在多个应用之间共享,只有被修改的部分才会单独占用内存。这样每个应用不用从零开始加载,启动更快,整体占用的内存也更少。

Dalvik 早期是逐条解释执行字节码的,速度并不快。这个问题要到后面几个版本才逐步解决,这是本系列后面几篇的内容。

图4|Dalvik 的三处针对性设计

每个应用一个用户:沙箱与权限

安卓的安全模型直接借用了 Linux 的多用户机制,只是用法变了:在服务器上,一个用户代表一个人;在安卓上,一个用户代表一个应用。

每个应用安装时会被分配一个独立的 Linux 用户 ID,它的数据目录只有它自己能读写,别的应用碰不到。应用之间想共享数据,必须通过 Content Provider 或 Intent 这类系统提供的通道。

在此基础上是权限。应用要访问网络、读通讯录、获取位置,都要在安装包的清单文件里声明。早期安卓采用的是安装时一次性授权:安装前列出全部权限,用户要么全部接受,要么不装。这个设计简单,但用户很难判断一个手电筒应用为什么要读通讯录,又没有办法只拒绝其中一项。这个问题后来被反复诟病,直到 2015 年的 6.0 才改成运行时按需申请,本系列第四篇会讲到。

许可证的设计:内核开源,上层随意改

安卓常被称为开源系统,但它的开源方式是经过设计的,不同层用的许可证不一样。

Linux 内核使用 GPLv2 许可证,规定修改后发布就必须公开修改的源代码。这一层安卓没得选。

但内核之上的大部分代码,安卓选择了 Apache 2.0 许可证。它允许厂商修改代码后不公开、闭源发布。连 C 标准库都专门重写了一个 Bionic,采用更宽松的 BSD 许可证,而没有直接用 Linux 世界常用的 glibc,其中一个考虑就是避开 GNU 许可证对应用层的要求,另一个考虑是体积更小、更适合手机。

这样设计,对手机厂商的吸引力很直接:可以随意修改系统界面、加自己的功能,不用把改动公开给竞争对手。这正是开放手机联盟能拉来这么多厂商的原因之一。

同时也要看到,不是所有东西都开源。Gmail、地图、应用商店这些 Google 自己的应用和服务,不在开源代码里,厂商需要和 Google 单独签协议才能预装。开源的系统加上不开源的服务,这个结构从第一天起就定下来了,后来一直延续。

图5|开源的边界:每一层用什么许可证

2008 年秋天:第一台安卓手机

2008 年 9 月 23 日,安卓 1.0 和第一台安卓手机一起发布。手机由 HTC 制造,在美国由运营商 T-Mobile 以 G1 的名字销售,10 月正式上市。

它的配置放在今天看很朴素:3.2 英寸电容触屏,分辨率 320×480;向侧面滑出的全键盘;屏幕下方一颗轨迹球;192MB 内存。

安卓 1.0 已经具备了一个智能手机系统的基本面:WebKit 内核的浏览器;与 Gmail、通讯录、日历同步;地图和 YouTube;支持 Wi-Fi 和蓝牙;可以同时运行多个应用。最有安卓特色的是两样东西:一是下拉通知栏,新邮件、短信、下载进度都集中显示在屏幕顶部,往下一拉就能看到全部,这个设计后来被几乎所有手机系统采用;二是 Android Market,也就是应用商店,开发者可以直接把应用发布给用户,2009 年初又开放了付费应用。

1.0 的短板也很明显:没有屏幕虚拟键盘,打字必须滑出实体键盘;不能录像;界面也比较粗糙。

10 月,安卓的完整源代码以 Apache 2.0 许可证公开,任何人都可以下载、编译、修改。

一年三个版本:从 1.1 到 1.6

接下来一年,安卓的更新节奏非常快。

1.1(2009 年 2 月)主要是修复问题和小的改进,比如地图里可以查看商户详情、邮件附件可以保存。

1.5(2009 年 4 月)是第一次大更新,也是第一个正式使用甜点代号的版本,代号 Cupcake,从此安卓的代号按英文字母顺序排下去。这一版补上了几个关键缺口:屏幕虚拟键盘,并且允许第三方输入法替换;桌面小部件,让应用可以把信息直接显示在主屏上;录像和视频播放;立体声蓝牙耳机支持;屏幕自动旋转。有了虚拟键盘,手机厂商终于可以做没有实体键盘的安卓手机了。

1.6(2009 年 9 月)代号 Donut。这一版加入了快速搜索框,可以同时搜索手机里的内容和网络;支持多语言的文字转语音;应用商店开始显示应用截图;增加了电量使用统计;还支持了 CDMA 网络。

1.6 最重要但最不显眼的改动,是支持多种屏幕尺寸和分辨率。在此之前,安卓基本只考虑 320×480 一种屏幕;1.6 引入了按像素密度适配的机制,开发者用与密度无关的单位来设计界面,系统负责在不同屏幕上缩放。这意味着不同厂商可以用不同尺寸、不同分辨率的屏幕做安卓手机,而应用不用为每一款单独改。安卓日后机型数量远超其他系统,这个机制是前提。

图6|从 1.0 到 1.6 版本对照

回头看:这六年定下的几件事

把 2003 到 2009 年连起来看,安卓后来的很多特点在这段时间就已经定型。

第一,免费加开放的商业模式。系统不收授权费,上层代码可以闭源修改,厂商和运营商因此愿意加入;Google 通过预装的服务获得回报。

第二,分层的技术架构。Linux 内核管硬件,Dalvik 跑应用,应用框架提供统一接口。后来运行时换了、界面换了很多次,这个分层基本没变。

第三,应用之间平等、可替换。沙箱隔离加 Intent 调用,让第三方应用可以接管输入法、桌面、短信这类核心功能,这是安卓和 iPhone 早期最明显的差别之一。

第四,适配多种硬件。从 1.6 的多分辨率支持开始,安卓被设计成要跑在各种各样的设备上。

同样在这六年里埋下的,还有后来要花很多年才还清的账:安装时一次性授权的权限模型;厂商随意修改带来的系统版本碎片化;解释执行的 Dalvik 性能不足。这些问题,会在后面几篇里一个个出现,又一个个被解决。

写在最后

一套原本写给数码相机的系统,在六年里变成了一个手机平台的地基。它当时的样子并不完美:界面朴素,性能一般,机型只有寥寥几款。但它选择的那几条路,免费授权、分层架构、开放替换、适配多种硬件,决定了它后来能长成什么样子。

下一篇讲 2009 到 2011 年的 2.x 时代:Eclair、Froyo 和 Gingerbread 三个版本,第一批大屏幕全触控安卓手机,以及安卓从追赶者变成出货量第一的过程。

· · ·

免责声明

本文为公开资料的科普梳理,事实与时间主要来自公开的百科资料、官方发布信息与行业公开报道。不同资料对个别事件的日期、上市时间等记载存在细微差异,文中以较普遍采用的说法为准,具体以官方最新披露为准。

本文涉及的公司名称、产品名称仅用于说明历史事实,不代表对任何公司或产品的评价,也不构成任何购买或投资建议。

相关学习资料