自 2008 年第一部 Android 手机发布至今,虽然在操作体验上一直生活在 iOS 阴影之下,但不可否认,Android 是越来越强了,与 iOS 的差距越来越小,尤其是一向被诟病的流畅度,在 Android 5.0 之后更是有了质的飞跃。如今的 Android 手机,在八核处理器 4GB 内存加持下,一样也可以做到如丝般的顺滑,然而 ……
" 野火烧不尽,春风吹又生 ",非常应本文之景
" 安卓越用越卡,有本事用半年再比比!",好像真是这样,竟然反驳不了。
以前,Android 为什么不如 iOS 流畅?
以前,Android 的流畅度不如 iOS,其实原因也很简单:
一是先天不足,在 Linux 上跑个虚拟机,再用 JAVA 做开发,虽然能减轻开发负担,获得浩瀚资源,但在后期优化上的成本增加更多,在上次的《Android 手机需要清内存吗?》中提过,Java 没有提供任何操作来释放内存(iOS 的开发语言 Object C 能自行控制内存释放),是通过系统的内存回收机制来进行管理,但内存回收是个双刃剑,GC(Gabage Collection,垃圾回收)时所有线程都要暂停,也就是所谓的卡顿。
Android 的系统架构
二是后天开放带来的混乱,强制与封闭,给 iOS 的应用带来了高度的统一和标准,而开放的 Android 必然带来混乱这样的负面作用,碎片化是众所周知的恶果,一些应用为了兼容更多旧款设备,只得继续使用低 level 的 API,如微信,现在还是使用 API level 9,就是为了能在 Android 2.3 系统上使用,而 Android 5.1 支持的 API level 已达到 22 了,效率上显然大打折扣,除此之外,开发上的开放性更是一个非常大的隐患,这也是今天要谈的主要问题。
iOS 为了流畅度,其实做了非常多的妥协来换取用户体验上的好感,比如墓碑式内存管理、优先 UI 渲染等,Google 在 2012 年提出了黄油计划(Project Butter),开始着手解决 Android 卡顿这个老大难问题,并从 Android 5.0 开始,将 Dalvik 虚拟机全面转向 ART 虚拟机,后者在安装应用的时候会进行预编译,将代码转换为机器语言存储在本地,这样在运行程序时就不用每次都编译一次,执行效率得到大大提升,同时,新的 ART 模式也降低了每次 GC 的时间,一些额外的优化也可以避免 GC 的频繁发生。
黄油计划的垂直同步与三重缓冲让操作更一致顺滑
Google 的这些作为让 Android 系统在流畅度上有了实质性的突破,从宏观上讲,Android 是越来越不卡越来越流畅,那么,在如今这么强大的硬件支持下,为什么还会让很多人觉得越用越卡呢?
现在,Android 越用越卡:APP 在后台不断重生
到了今天,随着硬件的发展及系统的不断改良优化,Android 架构上的先天不足已经是影响甚微,从那些旗舰新机的表现足以证明了,秒开、流畅、顺滑 …… 绝不输于 同级别 iPhone,但是,这通常是指出厂状态下的表现,如果装上几十个国产 APP,情况可能会发生些变化——流畅度明显下降了,用户开始叫卡了。
显然问题出在这些 APP 上,前面说过,Android 的开放是把双刃剑,在自由的背后往往潜伏着危险,善恶存乎一心,开发商掌控着进退大权,而以国人之尿性,抢占市场、提升 APP 活跃度往往是最重要的,既然我不流氓别人也会流氓,我为什么不更流氓呢?
Android 应用开发有四大组件,广播接收器(BroadcastReceiver,以下简称 Receiver)就是其中之一,它用来接收来自系统和应用中的广播,你也可以理解它是一个监听器,比如当电量变化时,系统会产生一条广播,接收到这条广播就能在电量低时告知用户保存进度或进入省电模式等;当有电话进来,也会产生一条广播,就会通知电话接听或电话号码判断等。
各色各样的系统 Receiver(采集于 ROM Toolbox)
在 Android 中,全局的 Receiver 就近百种,可以监听各色各样的状态变化,比如开关机、通电断电、网络状态变化、电量变化、安装卸载应用、电话呼出呼入、SD 卡变化等。开放的 Android 允许应用程序注册任意个 Receiver, 这也成为流氓应用滋生的温床,不良的开发者向系统注册多个静态 Receiver,接受各种广播通知,然后执行相应的 Activity,比如自启动。
Android 越用越卡的主要原因在于,后台有大量应用在默默运行,而这些应用根本就是清理不掉的,它们会在收到各种各样的 Receiver 通知后并再度启动,我能想到最好的描述就是 " 野火烧不尽,春风吹又生 "。作为对比,iOS 中被杀掉的后台进程再启动的方法很有限,简单的说,iOS 是真的能清理内存,而 Android 中许多应用挥之不去,不断重生,各种进程与服务在后台偷偷运行,从而引起系统卡顿与耗电,其实又有几个开发商会为你手机的电池着想呢?
Android 不良应用的重生,主要有两种途径:自启动和关联唤醒。
你想都想不到的自启动
自启动,可能在我们意识里它就等于开机自动运行,在 Windows 下倒也没差,但在 Android 下你就太小瞧它了,开机自动运行只是众多自启动方式中的一种。在 Windows 中,你关闭某个软件后,它基本上不会再自行启动了,然后 Android 中由于有 Receiver 这种东东,让自启动变得很容易。
还是来点具体实例,看看国外 APP 与国内 APP 的节操对比:
eBay 与 " 手机淘宝 " 应用的自启动方式对比
作为同类型电商 APP,eBay 只有在收到三种 Receiver 后可能会启动,而且这三种都是比较规范的,反观 " 手机淘宝 ",共有九种自启动行为,除了 eBay 那三种外,还可能在收到应用卸载等六种 Receiver 后启动,我只是想问,我设置时间、卸载应用和你淘宝有半毛钱关系?
很可惜,国外的 APP 在国内基本没办法用,而国内的不管是优秀的 APP 还是山寨国外的 APP,大多数以抢占市场、提高应用活跃度为主,拼着命变着法子让自家 APP 处于活动状态,一键清理内存还有什么用呢,过几分钟又如野草般齐刷刷地长了出来。其实 " 手机淘宝 " 这个 APP 还算好的,看个更变态的:
百度云有 19 种自启行为
百度云 APP 高达 19 种自启行为,打电话、发短信、充电、连网、换个 WIFI 等等,这些日常的手机操作,都能让百度云不断重生自启,与你如影随行,而且是隐蔽不可见的。
当你接到电话(呼入电话 Receiver)后,还会发生这些事:
接到电话的同时,在后台已启动了 " 百度云 "" 有道云笔记 " 等
当你收到短信(接收短信 Receiver)时,还会发生这些事:
收到短信的同时,后台会启动 " 支付宝 ",并且 ……
打电话是最基本的手机功能,但是当你打电话 / 发短信时,后台早已是波涛汹涌。除了一些应用会完成自启行为外,还可能会唤醒其它的应用,如收到短信时 " 支付宝 " 会自启动," 支付宝 " 启动后还会唤醒 " 手机淘宝 ",这就是大家平常所说的 " 全家桶 ",也就是 APP 重生的另一途径——关联唤醒。
打虎亲兄弟的关联唤醒
关联唤醒大家多少有些了解,也是极具中国特色的产物,简单地讲就是当一款应用启动后,它会在后台偷偷启动另一款应用,基本上这些应用都有裙带关系,以臭名昭著的百度系、阿里系为代表,真是应了 " 打虎亲兄弟,上阵父子兵 " 那句话。
典型的关联唤醒
上图中,当运行 " 百度地图 " 时,后台会打开 " 百度云 ",当运行 " 手机淘宝时 "," 支付宝 " 也同时在后台开启,这些都是你看不见的,你手机中的 APP 越多,那么关联唤醒的 APP 就会越多。
如果你不怕死,装了百度这一系列 APP,就会很热闹:
连环唤醒,一人得道,鸡犬升天
当你打开 " 百度地图 " 后,百度系的其它 APP 会连环唤醒(我这个手机上唤醒了八款,因为只装了这么多,像百度手机助手、爱奇艺视频都能被唤醒),首先 " 百度地图 " 会唤醒 " 百度云 "," 百度云 " 紧接着会唤醒 " 手机百度 " 和 " 百度视频 ",然后 " 百度视频 " 不遗余力地唤醒几个好兄弟 " 百度新闻 "、" 百度音乐 "、" 百度贴吧 "、" 百度浏览器 " 和 " 百度糯米 "。
" 百度云 " 的唤醒路径及百度系的唤醒记录
一人得道,鸡犬升天," 全家桶 " 实在是形容得太贴切了。不过说实在的,关联唤醒的 APP 毕竟都沾亲带故,主要集中于那几大派系,和无处不在的自启动相比,关联唤醒的影响相对要小一些。
面对野火烧不尽的重生式 APP,怎么办?
面对这些不断重生的 APP,显然手动清理内存是没什么卵用,刚清理了它又启动了,没办法从根本上至少是极大程度上制约这些流氓 APP 频繁地被唤醒。好在这种现象已引起了极大关注,有些手机 ROM 已开始着手从底层来解决这些问题,像最新的魅族 Flyme 5 就能手动切断关联唤醒,算是迈进了一小步。
Flyme 5 的自启动管理
不管你用的手机 ROM 是不是作了针对性改进,都可以参考以下的解决方法,让负面影响降到最小:
1、尽量不要安装使用频率极低的 APP,对于百度系、阿里系、腾讯系等产品,尽量选用可替换的应用,如 " 百度浏览器 "、" 百度视频 " 等都可以弃之。
2、对于高级玩家,推荐 Xposed 框架 + 绿色守护的解决方案。
Android 手机必装 APP 之绿色守护
绿色守护除了日常的应用休眠外,其深度休眠能更大程序上保证 APP 不被关联唤醒,虽然还是有可能被唤醒,但是不用担心,被唤醒的 APP 会被继续休眠。绿色守护是 Android 手机必装神器之一,它更像一个内存无限清理工具,启动多少清理多少(只清理指定的应用),以不变应万变,能应付各种疑难杂症,有效改善系统的流畅性与续航能力,非常推荐,它需要 Xposed 框架配合,安装上有小小难度。
3、如果你觉得 Xposed 框架安装起来比较麻烦,可以直接使用一些第三方管理工具,利用它能主动禁止掉每个 APP 的自启动行为和切断唤醒,理论上效果更好,就是需要针对操作。
Android 手机为什么越用越卡,相信看完这篇文章的朋友会有答案,Android 系统上先天不足的影响现在已经不足道了,主要原因是开放性造成的混乱,国产 APP 的不良行为(各种自启、关联唤醒)成为越用越卡的罪魅祸首,通过上面的解决方法可以让负面影响最小化,你的手机能再现流畅顺滑。但是要从根本上解决这些问题,我们真的需要一个安静的 APP,不要在后台各种胡天胡帝,几时 Android 的应用能像 iOS 应用那般规范标准,一统天下就指日可待了。
另外,除了各种应用在后台自启或唤醒外,国内 APP 的消息推送机制也是一大奇葩,同样会影响到系统的流畅与续航,限于篇幅,我们下次再聊聊这个话题。