聊聊 Android N 已经公布的新特性

本屌作为一个“谷粉”和“奶粉”,简直太没有职业操守了。在博客里写流水账倒罢了,反而还经常给初音、Cytus 等音游打广告。为了“表明”自己“的确”是“谷粉”,这篇日志写一片水文来简述一下 Google 将在 Android N 上加入的新特性,算是给“技术类”博文凑数吧(当然这也不能说是技术类文章 ^_^”’)。

Android N 的名字尚未确定,不像 M 的 Marshmallow 那么好猜,所以我就不猜了,反正我投的票是 Nougat(牛轧糖)。版本号按照谷歌最近刷版本号的尿性本人目测应该会是 7.0,不过也不太好说,毕竟 M 只更新到 6.0.1 有点比较水的感觉。

Android N 我只用 Nexus 9 体验过第一个 Alpha 版本,后来就回到稳定版的 6.0.1 了,等哪天闲得蛋疼了再刷一个最新的测试版。虽然回到正式版要清空所有数据,不过对于小容量的平板来说问题不大(如果我把我的奶6P这样折腾那应用都得装死)。

废话说完了赶紧切入正题谈谈 N 的新功能和改进吧!

一、多窗口(分屏)的支持

相比于坑爹的 Apple 只在最新的 iPad 上提供分屏的功能(以便忽悠你换机或购买新的 iPad Pro,当然也有原因是老版的设备内存太小),Google 就厚道了许多。从官方的文档上看,似乎对设备没有明确的限制。

在 Android N 上只支持两个应用分屏,但是屏幕大小用户可以自行调整,这点比较灵活。开启分屏很简单,按住“概览”的虚拟按钮不放,当前应用就会出现在上半部分,然后下半部分系统显示最近运行的应用以便用户拖拽。

虽然像三星之类的 ROM 早已由厂商自己实现过分屏,但是分屏的重点是要应用支持。强行分屏只会导致布局十分不协调甚至应用崩溃。另外,作为 Android 的官方系统,还得考虑到很多设备的特性,比如分辨率、内存、兼容性等。像苹果那样偷懒似乎是一个好办法,不过有点不像 Google 的风格。因此这个多窗口功能实际上已经开发了很久(从很早的版本就可以在隐藏选项中打开)。就我体验的第一个测试版来看,Google 已经支持得差不多了,不过还是有很多的问题需要解决。有些 app 的布局并不太符合规范,尤其是没有对分辨率做过多考虑的情况,可能出现显示不全而无法向下滑动,甚至直接崩掉。

不过对于开发者而言,除了布局方面的问题,其他方面的改动不会太大,因为 Android 的调度逻辑还是和以前一样:只有正在操作的 app 才是正在运行的状态,另一个是 Paused 状态(和以前的悬浮窗口的生命周期类似)。为了向应用通知分辨率的变化,系统会调用 onConfigurationChanged,在此处像以前处理竖屏、横屏那样进行类似处理就可以了。

此外在特定的设备上,Android N 还提供了 Picture-in-picture 功能,这个主要是为电视设计的,功能类似于在观看 Youtube 的时候可以把画面缩小到右下角,用户在此时同时浏览其他内容。此外开发者可以指定 app 支持的最小高度,偷懒的开发者干脆可以直接设置 resizeableActivity 为 false 禁止掉分屏功能。

二、通知栏的改进

Google 似乎在每一个版本都会改一下通知栏。在 Android N 里最大的变化是加入了“即时回复”功能。也就是应用可以在通知栏里显示一个文本框让用户直接输入文字,这样就不用切换到 app 进行回复了。这个功能其实以前借助悬浮窗也可以实现,比如回复 Whatsapp 的消息的时候会在屏幕中心显示一个小窗口,这样用户也不必切换窗口。

另一项改动是允许运行应用自己定义通知的样式,从而避免通知消息看起来都差不多的情况(其实老版本的 Android 通知 比 iOS 的通知要好多了, iOS 的就是一个千篇一律的标题+文字框,N 年不变)。

本人比较喜欢的改进是消息的分组功能,同时 Google 还去掉了单个消息的边框和边距,这样消息就能分类显示,并且更加紧凑。把不同应用的多个消息分组在一起,不同的组以不同标题颜色、边框来区分,使消息看起来一目了然。这样就避免了我把平板扔在家里,回来打开后发现十几条消息出现在屏幕上看起来都差不多的尴尬。在手机上同屏可以看到的消息也更多了,不像以前只显示少数几条屏幕就占满了。

国外的 app 比如 Whatsapp 之类的应该会在第一时间跟进这些功能。至于天朝的各大毒瘤,估计还得等个一两年才会有所改动吧。

三、编译器的改进

Google 一直在改 Android 的编译器。比如从 4.x 开始试验 ART,到 5.x 强制开启,然后 6.x 的时候又把编译器换成了 Jack…… 目的当然还是改进 Android 的性能。

Android N 开始又重新引入了 JIT 功能。因为 Google 发现完全使用 ART 有几个弊端:

首先,安装 app 的时间会变长很多,因为在安装时系统要对程序的代码进行预编译,尤其是一些大游戏可能要安装好几分钟(虽然你可以切换到别的页面做别的事情);其次,系统升级后程序优化的时间也超长无比,因为此时系统会对所有的 app 进行重新优化,特别是像我这种装好几百个 app 的人每次系统升级后都要等半个小时以上。

其次,预编译出的文件会增加存储空间的占用,对于那些小容量的用户来说这可不妙,完全是用极其有限的空间来换时间(还不如运行慢点呢!)。好在 Google 比 Apple 良心一些(你会发现我老在吐槽 Apple,其实有些地方 Apple 做的还是很不错的 ^o^),像 iOS 上随便装个应用基本在 100MB 以上(比如我们最近开发的 app,Android 版才 3MB 多一点, iOS 版得有 20MB 以上)。

更重要的一点,使用 ART 会抛弃掉 JIT 的一个很大的好处:根据运行情况进行优化。

所以 Android N 又把 JIT 复活了。在安装时,只会预编译一些系统认为有必要的部分,其他部分会在以后进行编译(官方说是在手机连接到充电器并且闲置的时候会逐步进行编译)。Google 把新模式称之为“Profile-guided JIT/AOT Compilation”,新编译器会根据 app 的运行状况随时进行调整(有点类似于数据库里的统计信息),从而对最常用的方法进行优化,同时可以减少内存的占用。

Google 优化内存占用的原因之一是为多窗口做准备。多窗口显然比较消耗内存资源,这样就会尽量避免用小内存的设备跑多窗口时挂掉的一些杯具局面。不得不说 Google 在内存占用这块还是下了不少功夫,不过 Chrome 还是有很大的优化空间啊。

今天的很多报道都说程序运行的速度会提高 600%,这个明显不现实。估计又是在断章取义了。目测是 Google 说大应用的安装时间以前要几分钟,现在只要几秒了,就被媒体理解成运行时速度快了 6 倍……

四、更加激进的 Doze(瞌睡) 模式

自从 6.0 引入 Doze 以来(本人称歇菜模式),我可以感觉到设备的待机时间明显增长。因为系统会限制后台服务的 CPU、网络、GPS的使用,同步和定时工作也会被推迟到一个特定时间(比如一个小时一次)。App Standby 则更严格,长期不用的 app 一天可能只有一次机会执行后台任务。当用户打开屏幕时或者插上充电器时,这些限制便会解除。

但是 Doze 模式开启的条件有些苛刻,根据别人的测试基本上闲置一个小时左右才会进入瞌睡模式,并且如果系统检测到设备有较大的震动,就会退出 Doze 模式(估计 Google 认为是你要拿起设备了,所以赶紧唤醒一些后台)。这样的弊端就是你拿着手机走路可能很难进入 Doze。

于是 Android N 采用了“Doze on the go”,在行走时也会限制应用的后台功能(但是不如放置状态那么严格)。另外虽然官方文档没有说明,但是本人目测进入 Doze 模式的时间会被缩短,并且对 app 的限制会更严格。

即便是这样,作为一个开放系统,Android 对后台限制还是相当宽松的,这样对于天朝这种存在众多毒瘤 app 的奇葩国度可能不是一件好事,不过至少在手机闲置状态对它们还是有一定的限制作用。

五、后台服务的限制

从 Android N 开始,Google 限制或移除掉了三种 Broadcast:

  • CONNECTIVITY_ACTION:非前台运行的 app 不会接收到网络情况变化的广播。因为移动设备的网络状况经常会变化(比如偶尔运营商没信号、4G掉到2G等),所以如果每次网络变化就通知相关 app (尤其是天朝的毒瘤 app)会是相当耗时以及耗电的操作。不过这个改动只有 Target SDK 是 N 的才会生效,老版本的 app 还是会继续收到这个广播,因此要想它对天朝的毒瘤生效还得等一段时间。
  • ACTION_NEW_PICTURE 和 ACTION_NEW_VIDEO:不同于网络变化只对 Target to N 并且是后台运行的 app 生效,这两个 Broadcast 无论如何都会失效。

开发者可以用从 5.0 开始引进的 JobSchedule 实现上面类似的功能。有些人会问:咦,那不还是可以用么,和没移除掉有啥区别?不要忘了,Broadcast 基本是即时执行的,比如你有 100 个 app 注册了这个广播,那会执行这 100 个 app 的相关代码;而 JobSchedule 是在系统的调度下执行的,系统会根据设备的状况(比如电量、网络状况、内存等)按照一定的规则去调度各个 job。

在这里要再喷一下天朝的毒瘤,Broadcast 本是 Android 里一个超级好的机制。比如你可以设定 Whatsapp 的聊天记录备份方式,这样当你的手机连上 Wifi 并且插上电源后,系统会给 Whatsapp 发广播,此时它可以开始备份你的聊天记录而不用担心流量和耗电的问题。可是天朝的某度等垃圾厂商把它当成了“借尸还魂”的工具。

可以预计在今后版本的 Android 里 Google 会进一步限制 Broadcast 的使用,这样对于度娘这种流氓厂商来说好像不太有利哦。

六、节省数据流量模式

对于以前版本的 Android 和各种第三方 ROM 提供的功能,当你的数据流量用完的时候系统唯一可以做的时候就是帮你断网,或者你可以直接关掉某些 app 使用移动数据流量的功能。这种一刀切的方式貌似并不太友好。

所以从 Android N 开始引入了 Data Saver功能。当数据流量快用完时(比方说你可以设定 85%),系统会限制后台运行的 app 的数据流量使用,同时会给 app 发通知“要求”它们节省数据流量(可以类似于 Doze 那样设置白名单)。当然具体的响应取决于正在运行的 app,比如 Facebook 可以降低图片的质量、减少新消息的收发频率等等。

当然具体怎么使用还是取决于各个厂商,因为系统没法知道每个 app 的使用场景,也不知道诸如降低图片质量应该如何去访问各个 app 的 API。

七、新的图形引擎 Vulkan

Vulkan 是一个比较新的引擎(据说暴雪的某个游戏正准备使用),这次 Android N 直接内置了这个引擎。Vulkan 的好处包括更少的 CPU 占用(貌似每次都会这样说)、更直接的访问 GPU 方式、多个线程同时执行 buffer 上的命令等等。

Vulkan 只能在它兼容的平台上运行,所有不是每个手机都可以使用(当然新的奶机是支持的)。而且距离它大规模地被采用那还有不少时间,况且现在很多游戏都是 Unity 开发的情况下……

八、自定义下拉快捷菜单

这个其实是一个比较“老掉牙”的功能,比如刷了 Gravity Box 的原生系统和大多数第三方 ROM (比如 MIUI)都支持。用户可以自定义快捷选项并且还可以多页显示。

当然相比于第三方的实现,Android N 提供了相关的 API,应用可以对图块的操作进行自定义(比如展开设置也等)。

九、短信的黑名单

由于 Android 可以自己设定默认的短信应用,所以这个功能显得不是那么重要。当然原生支持这个的好处是系统会提供相关 API,这样用户在用不同短信应用的时候名单就会共享了,当然大多数人不会如此蛋疼老是换短信应用,而且目测原生 API 提供的功能相当有限。

十、自定义来电页面

在以前版本的 Android 系统中,虽然用户可以自由指定电话和通讯录的默认 app,但是来电界面是一样的。从 N 开始,系统暴露相关 API 允许第三方应用获取到来电者的信息或者拒接、拦截等,这样电话应用就可以做更多的事情了。

比如我一直不太喜欢原生来电界面尚未接通时头像蒙上的那一层阴影,在我接听之前我和来电者合照的那些帅气的图片基本看不清啊……

十一、多语言的支持

以前 app 的语言基本都是跟着系统的设定走的(当然部分 app 比如微信可以单独在设置里面选用其他语言)。这样大多数情况没什么问题,但是遇到特殊情况就不太好了。

如果应用没有自己实现切换语言的功能,那系统会根据当前的系统语言匹配应用提供的语言列表,并显示相匹配的。比如我最近玩了“勇者斗恶龙I”,它只提供了繁体中文版,这样如果我的系统是简体中文的话,文字就会显示成默认的英语。这样如果我想用使这个应用显示繁体中文的话,得去系统设置里面改变语言,然后不玩了再切换回去,有些麻烦。

Android N 开始可以对各个应用设置默认的显示语言和优先级。虽然使用场景不高,但是却是一个有时候能用上的贴心功能。

十二、新的 Emoji 表情

Android 的 Emoji 比 iOS 版的要活泼不少。

此外,从 Android N 开始,系统支持 Emoji 的“皮肤”功能。虽然 Google 没给出范例,但是可以想象应该大部分是和颜色相关的。

十三、Java 8

这个应该是开发者最期待的了,总算可以用上 Java 8 的新特性。而且由于 Google 与流氓公司 Oracle 闹得越来越厉害,现在 Android 开始转向 OpenJDK,这样以后 Android Studio 上 Java 版本的更新也会比较快了。

其他一些改进:

还有一些改动就不一一列举了,以后有时间把重要的拿出来研究一下:

  • 改进的 VR 模式:更小的延迟、更高的性能以及减少眩晕。
  • 支持 OpenGL ES 3.2,支持 ICU4J。
  • 电视的录制功能。
  • Direct Boot:对于全盘加密的设备,用户必须要绘制正确的图案才能启动设备。但是如果用户正在歇菜时设备重启了,在解锁设备前,此功能可以先启动部分应用,这样来电、闹钟等提醒就不会丢失。
  • Scoped Directory Access:用户可以控制各个 app 允许访问的存储空间的特定文件夹,而不是像以前那样只能授权访问全部的外部存储空间。(目测此功能对微信等流氓 app 无效)
  • 持续的高性能 API:CPU 达到一定温度后,系统都会对它进行降频以防止发热过多而损害设备。使用这个 API 可以让设备持续在高性能状态运行,突破一定的温度控制。
  • 其他改进参见这里:https://developer.android.com/preview/api-overview.html#scoped_directory_access
✏️ 有任何想法?欢迎发邮件告诉老夫:daozhihun@outlook.com