ARTICLE · 1159272
安卓演化史 · 05|拆开系统:升级难怎么解,后台怎么管
2017–2019:8.0 Oreo 的 Project Treble 与后台限制,9 Pie 的手势与自适应电池,10 的模块化更新与告别甜点名

2017 到 2019 年,安卓开始从结构上解决两个老问题:系统升级为什么慢,后台为什么耗电。8.0 把系统和硬件驱动拆开,10 又把系统拆成可以单独更新的模块;后台则从请应用配合,逐步变成按使用习惯分级管理。这一篇讲这些拆分背后的原理。

图1|三年:把系统拆开
先回顾:升级为什么这么难
第二篇讲过,一次系统升级要经过芯片厂商、手机厂商、运营商好几道环节。到 2017 年,这个问题并没有好转:新版本发布一年后,用上它的手机往往仍是少数。
根子在于安卓系统内部的结构。安卓分两大部分:一部分是 Google 维护的系统框架,也就是应用看到的那一层;另一部分是芯片厂商和手机厂商写的硬件相关代码,负责驱动相机、基带、传感器这些具体硬件。在 8.0 之前,这两部分之间没有稳定的边界,框架一升级,硬件相关代码往往也要跟着改,而这些代码掌握在芯片厂商手里。每出一个新版本,厂商就得等芯片厂商先把自己那部分适配好,再在上面做自己的工作。
8.0 Oreo 与 Project Treble:在中间砌一道墙
2017 年 8 月 21 日,安卓 8.0 发布,代号 Oreo。它最重要的改动,在用户看不到的地方,叫 Project Treble。
Treble 的做法是在系统框架和硬件相关代码之间,定义一套稳定的 厂商接口。硬件相关代码被放进单独的厂商分区,只要它按这套接口实现,系统框架就可以升级到新版本,而不必改动下面的硬件代码。Google 还配套了一套厂商接口测试,检验厂商的实现是否符合规范。
可以把它理解为在楼房的结构层和装修层之间加了一层标准接口:以前换一层装修,往往要连带拆改结构;现在只要接口不变,上面怎么换都不影响下面。
为了验证这套接口真的可用,Google 还提供了通用系统镜像:一份不含任何厂商定制的纯净系统,理论上可以直接刷进任何符合 Treble 规范的手机里启动。2017 年之后出厂搭载 8.0 的新手机,都必须支持 Treble。
效果在第二年就看得到:2018 年 5 月,下一个版本还在测试阶段,就第一次同时提供给了多家厂商的手机试用,而不再只限于 Google 自己的机型。Google 当时明确把这归功于 Treble。

图2|Project Treble:在中间砌一道墙
8.0 的后台限制:把后台的门关小
第四篇讲过,6.0 的 Doze 只在手机静止不动、熄屏一段时间后才生效。8.0 把限制延伸到了平时。
面向 8.0 开发的应用,转到后台后不能再随意运行后台服务,过一会儿就会被系统停止;需要持续工作的,比如音乐播放、导航,必须改成前台服务,并在通知栏里常驻一条通知,让用户知道它在运行。
很多应用过去靠在清单里登记「系统广播」来自动启动,比如网络变化、充电状态变化时被系统叫醒。面向 8.0 开发的应用,大多数这类隐式广播不再通过清单登记送达,应用也就失去了一条自己启动自己的途径。
位置也收紧了:所有应用在后台获取位置的频率都被限制为每小时几次。
8.0 还加入了 通知渠道:应用要把通知分成不同类别,比如聊天消息、促销信息、系统提醒,用户可以只关掉其中一类,而不是要么全开要么全关。此外还有画中画小窗播放、系统级的密码自动填充,以及面向 1GB 及以下内存手机的精简版本。

图3|后台限制是怎么一步步收紧的
9 Pie:手势导航与自适应电池
2018 年 8 月 6 日,安卓 9 发布,代号 Pie。
用户最先感受到的是 手势导航:屏幕底部的三个虚拟按键可以换成一个小横条,上滑回到主屏或查看最近任务。这是为了配合越来越窄的边框和越来越高的屏幕,9 同时也正式支持了屏幕顶部的刘海和挖孔。
管理后台的方式也更进一步,叫 自适应电池。它把每个应用按用户的实际使用习惯分进几个 待机分组:正在用的、经常用的、偶尔用的、很少用的。系统用设备上的机器学习模型预测用户接下来可能打开哪些应用,越少用的分组,能执行后台任务、收推送、设闹钟的机会就越少。
这和 6.0 的 Doze 思路不同。Doze 是按手机状态来管,手机睡了就一起限制;待机分组是按应用来管,常用的应用照顾一些,不常用的就管得紧一些。

图4|应用待机分组
9 还有几项和隐私相关的改动:在后台的应用不能再使用摄像头和麦克风;系统支持加密的 DNS 查询,防止网络上的第三方看到你在访问哪些网站;对应用调用系统内部未公开接口加了限制,减少应用依赖隐藏功能带来的兼容问题。另外还加入了「数字健康」,让用户看到自己每天在每个应用上花了多少时间,并可以给应用设定使用时长。
10:模块化更新与告别甜点
2019 年 9 月 3 日,安卓 10 发布。和以往不同,它没有甜点代号。Google 在发布前宣布,从这一版起只用数字命名,理由是甜点名对很多国家的用户来说既不熟悉,也不好发音。从 1.5 的纸杯蛋糕开始、延续了十年的甜点命名就此结束。
模块化系统更新
10 在更新机制上又迈了一步,叫 Project Mainline,也就是模块化系统更新。
Treble 解决的是系统框架和硬件代码之间的依赖,但系统本身的更新仍然要由手机厂商打包推送。Mainline 把系统里的一部分底层组件拆成独立模块,首批包括媒体文件解析、DNS 解析、加密库、权限控制界面、时区数据等。这些模块用一种新的打包格式,可以像应用一样,通过 Google Play 的系统更新渠道直接推送给用户,不必等厂商做一次完整的系统升级。
第四篇讲过,Stagefright 漏洞就出在媒体文件解析上。有了 Mainline,类似的漏洞修复可以绕过厂商,直接送到用户手里。
把 Treble 和 Mainline 放在一起看,安卓等于把原来一整块的系统拆成了三层:硬件代码归厂商,系统框架随大版本升级,一部分关键组件按模块单独更新。

图5|一个修复怎么送到手机上
10 的隐私改动
10 在隐私上也继续收紧。位置权限多了一个选项,叫 仅在使用应用时允许,应用退到后台就拿不到位置。应用在后台时不能再突然弹出界面打断用户。
存储方面引入了 分区存储:应用只能自由访问自己创建的文件,以及相册、音乐、视频这几类公共媒体;要访问其他文件,必须通过系统的文件选择器,由用户自己挑。这改变了安卓应用长期以来可以随意读写整个存储卡的习惯,所以 10 先允许应用暂时选择不启用,到下一个版本才强制执行。
体验方面,10 提供了全面的手势导航,从屏幕左右边缘向内滑就是返回;加入了系统级的深色主题;开始支持折叠屏手机,应用可以在屏幕折叠和展开之间连续运行。

图6|8.0 到 10 版本对照
开发者这边:Kotlin 成为首选
这几年开发者的工具也在变。2017 年 5 月,Google 宣布 Kotlin 成为安卓官方支持的开发语言;2019 年,Google 又表示安卓开发将以 Kotlin 优先,新的开发库和文档优先提供 Kotlin 版本。安卓应用的主要开发语言,从 Java 逐渐转向了 Kotlin。
回头看:把系统拆开
把 2017 到 2019 年连起来看,安卓做的事可以概括为「拆」。
拆依赖:Treble 用稳定的厂商接口,把系统框架和硬件代码拆开,升级不再被芯片厂商卡住。
拆更新:Mainline 把一部分系统组件拆成独立模块,关键修复可以直接推送。
拆后台权限:后台服务、广播、位置、摄像头、麦克风、存储,一项一项从「默认可以」变成「需要理由」。
这些改动大多数用户感觉不到,但它们决定了一部安卓手机能不能及时收到更新、电量能不能撑过一天,以及应用能在用户看不见的地方做多少事。
写在最后
前面几篇里反复出现的那些问题,碎片化、升级慢、后台耗电、权限过宽,在这三年里第一次得到了结构性的回应。它们没有被完全解决,但解决的方向已经确定。
下一篇讲 2020 到 2022 年:11 的一次性权限和对话通知,12 的 Material You 个性化设计和隐私面板,13 的照片选择器和按应用设置语言,以及模块化更新继续扩大。
· · ·
免责声明
本文为公开资料的科普梳理,事实与时间主要来自公开的百科资料、Android 开发者官方文档与官方博客等公开信息。功能描述为原理说明,各手机厂商的实现、限制策略和更新节奏可能不同;具体以官方最新披露为准。
本文涉及的公司名称、产品名称仅用于说明历史事实,不代表对任何公司或产品的评价,也不构成任何购买或投资建议。