ARTICLE · 1154041
安卓演化史 · 04|大翻新:换设计、换运行时、管住权限和电量
2014–2016:5.0 Lollipop 的 Material Design 与 ART,6.0 Marshmallow 的运行时权限与 Doze,7.0 Nougat 的分屏与混合编译

2014 到 2016 年,安卓做了一次从里到外的翻新:界面换上 Material Design,运行时换成 ART,权限改成用时再问,电量改由系统强制管理。这一篇讲这些改动的原理,以及一次安全事件怎样改变了安卓的更新方式。

图1|三年:一次从里到外的翻新
2014 年:一次从里到外的翻新
2014 年 6 月 25 日,Google 在开发者大会上预告了下一个版本,当时只叫「L」。这年 11 月,安卓 5.0 正式推出,代号 Lollipop,首发机型是 Nexus 6 手机和 Nexus 9 平板。
5.0 常被认为是安卓 1.0 之后变化最大的一个版本:界面换了一整套设计语言,运行时换了,电量、通知、安全也都有大改动。同一年,Google 还推出了面向手表、电视和汽车的安卓版本,安卓从一个手机系统变成了一个覆盖多种设备的平台。
Material Design:纸和墨水
5.0 的新设计语言叫 Material Design。它的核心比喻是纸和墨水:界面由一层层有厚度的「纸片」组成,纸片之间有高低之分,用阴影表示;颜色更大胆,常用整块的主题色;动画要有意义,比如点开一张卡片,它会从原来的位置展开,让用户知道新内容从哪里来。
这套规范不只给安卓用,Google 自己的网页产品也采用同一套设计。它以完整文档的形式公开,第三方应用照着做,就能和系统保持一致的观感。Holo 时代主要规定了「长什么样」,Material Design 则连「怎么动」都做了规定。
通知也跟着重做:通知以卡片形式直接显示在锁屏上;正在使用其他应用时,重要通知会以横幅的形式从屏幕顶部滑下,叫作浮动通知,不用离开当前应用就能处理。
ART:安装时就编译好
5.0 在底层最大的变化,是用 ART 正式取代了 Dalvik。
第二篇讲过,2.2 起 Dalvik 用 JIT 即时编译提速:应用每次运行时,再把最常跑的代码编译成机器码。ART 的思路不同,叫 提前编译:应用安装时,系统就用一个叫 dex2oat 的工具,把整个应用的字节码一次性编译成机器码存起来,以后每次运行直接执行,不用再边跑边编译。
好处是应用启动更快、运行更流畅,也省去了运行时编译消耗的电量。ART 还改进了垃圾回收,回收造成的停顿更短;同时原生支持 64 位处理器,2014 年前后,手机芯片正好开始转向 64 位。
代价也很明显:安装应用变慢了,编译后的文件占用更多存储空间;每次系统升级后,所有应用都要重新编译,开机时会出现「正在优化应用」的提示,应用多的手机要等好几分钟。这个问题,要到两年后的 7.0 才找到平衡。

图2|三种运行方式:JIT、提前编译、混合编译
Project Volta:先搞清楚电去哪了
续航一直是安卓的短板。5.0 有一个专门的项目叫 Project Volta,思路是先把耗电看清楚,再管起来。
Google 给开发者提供了电量分析工具,可以按时间线看到手机什么时候被唤醒、哪个应用在用网络、处理器什么时候忙。系统还新增了 任务调度接口:应用可以把不急的工作,比如同步、上传、下载更新,交给系统,并注明条件,比如「连上 Wi-Fi 再做」「充电时再做」。系统把多个应用的任务攒在一起集中执行,减少反复唤醒手机的次数。另外还加入了省电模式,电量低时自动降低性能、限制后台活动。
2015 年的一次安全警报
2015 年 7 月,安全研究人员公开了一个后来被称为 Stagefright 的漏洞。问题出在安卓系统处理音视频的媒体库里:攻击者只要给手机发一条特制的彩信,系统在后台自动解析其中的视频时就可能被攻破,用户甚至不需要点开。当时大部分正在使用的安卓手机都受影响。
修复漏洞本身不难,难的是把修复送到用户手里。第二篇讲过,一次系统更新要经过芯片厂商、手机厂商、运营商好几道环节,很多手机根本收不到。Stagefright 让这个问题变得无法回避。
2015 年 8 月,Google 宣布 Nexus 设备改为 每月推送安全更新,并开始每月公开发布安全公告,列出当月修复的漏洞,三星、LG 等厂商也随即作出类似承诺。从 6.0 开始,手机设置里能看到「安全补丁级别」,标明这台手机的安全修复更新到了哪个月。功能大版本和安全补丁从此分开:前者一年一次,后者每月一次。

图3|从一个漏洞到每月安全更新
6.0 Marshmallow:权限改成用时再问
2015 年 9 月底,安卓 6.0 随 Nexus 5X 和 Nexus 6P 发布,代号 Marshmallow。
这一版最重要的变化是权限。第一篇讲过,早期安卓在安装时一次性列出所有权限,用户要么全部接受,要么不装。6.0 改成了 运行时权限:读取位置、通讯录、相机、麦克风这类涉及隐私的权限,在应用第一次真正要用的时候才弹窗询问;用户可以只拒绝其中一项,应用的其他功能照常使用;之后还可以在设置里随时收回。
为了不让老应用崩溃,新规则只强制作用于面向 6.0 开发的应用,老应用安装时仍按原来的方式授权,但用户同样可以在设置里手动关掉某项权限。

图4|权限:安装时一次给完 vs 用时再问
6.0 还统一了指纹识别接口,第三方应用可以用指纹登录和支付;可以把存储卡格式化为内部存储使用;网页链接可以直接在对应应用里打开,不再每次弹出选择框。
Doze:手机放着不动时,该睡就睡
6.0 另一项影响深远的改动是 Doze,可以理解为手机的深度睡眠。
Project Volta 的思路是请应用配合,但总有应用不配合,在后台频繁联网、频繁唤醒手机。Doze 改成由系统强制执行:当手机没插电、屏幕熄灭、并且一段时间静止不动,比如晚上放在床头柜上,系统就进入 Doze。这时应用无法联网,后台任务和定时唤醒被推迟,阻止手机休眠的请求被忽略。
系统会每隔一段时间打开一个短暂的维护窗口,让积压的任务集中执行一次,然后继续睡;手机静止得越久,窗口间隔越长。真正紧急的消息,比如即时通讯的高优先级推送,仍然可以穿透 Doze 及时送达。
同时引入的还有 应用待机:用户很久没打开的应用,后台联网会被限制。
到了 7.0,Doze 又扩展到了手机放在口袋里移动时:只要屏幕熄灭一段时间,就先进入一个较轻的睡眠状态。

图5|Doze:手机怎么睡觉
7.0 Nougat:分屏与混合编译
2016 年 8 月 22 日,安卓 7.0 发布,代号 Nougat。
用户能直接感受到的是 分屏:两个应用可以上下或左右各占半个屏幕同时使用。通知也再次改进:同一个应用的多条通知可以折叠成一组,消息类通知可以直接在通知栏里回复。
底层的重要变化是编译方式。5.0 的提前编译解决了运行速度,却让安装和系统升级变慢。7.0 改成 混合编译:
应用刚装上时不做完整编译,先用解释执行加 JIT 运行,所以安装很快;运行过程中,系统记录下哪些代码最常用,写成一份使用记录;等手机空闲并且在充电时,再按这份记录,只把常用的那部分提前编译成机器码。
这样安装快了,存储占用少了,常用功能的速度又不输提前编译。从 5.0 到 7.0,安卓等于把 2.2 的 JIT 和 5.0 的提前编译结合了起来,各取所长。
7.0 还加入了新一代图形接口 Vulkan,游戏可以更直接地控制图形芯片;新机型开始支持 无缝更新,系统准备两套分区,在后台把更新装到当前没在用的那一套上,装好后重启一次就切换过去,不用再长时间等待;还加入了按文件加密,手机重启后未解锁时,闹钟、来电等功能也能正常工作。
7.1 与 Pixel:Nexus 的终点
2016 年 10 月 4 日,Google 发布了 Pixel 手机,预装安卓 7.1。和 Nexus 由合作厂商主导设计不同,Pixel 由 Google 自己定义产品、以自己的品牌销售,Nexus 系列就此结束。7.1 本身加入了长按应用图标弹出快捷操作等小功能。

图6|5.0 到 7.1 版本对照
回头看:大翻新的三条线
把 2014 到 2016 年连起来看,安卓在三条线上同时推进。
体验线:Material Design 统一了外观和动效,通知、分屏让日常使用更顺手。
性能线:从 Dalvik 的 JIT,到 ART 的提前编译,再到 7.0 的混合编译,运行速度、安装速度和存储占用之间终于找到平衡。
权利线:权限从一次性授予变成按需授予、随时收回;电量从靠应用自觉变成系统强制管理;安全修复从跟着大版本走变成每月推送。这条线上,系统越来越站在用户一边,对应用的约束越来越多。
写在最后
这三年,安卓不再只是追赶别人或者补齐功能,而是开始系统性地处理大平台才会遇到的问题:怎么让成千上万的应用守规矩,怎么让修复送达数以亿计的手机。前者有了运行时权限和 Doze,后者有了每月安全更新,但只是开了个头。
下一篇讲 2017 到 2019 年:8.0 的 Project Treble 怎样从结构上解决升级难,越来越严的后台限制,9 的手势导航,以及 10 为什么不再用甜点命名。
· · ·
免责声明
本文为公开资料的科普梳理,事实与时间主要来自公开的百科资料、官方发布信息与行业公开报道。性能、续航相关描述为原理说明,实际效果因机型、厂商定制和使用习惯而异;安全事件部分仅作科普,不涉及任何漏洞利用细节。具体以官方最新披露为准。
本文涉及的公司名称、产品名称仅用于说明历史事实,不代表对任何公司或产品的评价,也不构成任何购买或投资建议。