“看,系统又自动将PPTV安装了回来!”
许达展示了他手中的小米手机,在那些号称能被删除的预装应用里,有好几款在被用户卸载后,过一段时间又会在用户不知情的情况下自动安装回来。许达任职于国内一家互联网公司的测试部门,他每天的工作就是和Android系统打交道。每当这个时候,他就会熟练地卸载它们,然后等待它们下一次“作乱”。
因为太过习惯且不在意,许达反而记不清到底是哪几款应用。只不过PPTV恰好在前两天“作乱”过一次。46岁的老张生活在中国西部一座二线城市。前不久,他刚刚换了自己的第四部Android手机——儿子买给他的三星S7 Edge。为了和身边绝大多数用Android手机的人显得合群,他一直都没想着用iPhone。
老张不懂手机系统,但这并不代表他对Android没有看法。新手机使用差不多半年时间,他就会向儿子抱怨,“我这手机怎么越用越慢啊,电池也越来越不经用,而且变得越来越容易发烫。”没办法,他儿子每次回家,都会帮老张清理一次手机里的垃圾,并解决掉导致老张手机变慢的病根——那些开机启动并常驻在手机后台的顽固应用。
某种意义上,许达和老张代表了中国Android用户最典型的两种类型:懂Android、追求开放和自由的用户,甚至是行业从业者;不懂Android,只是将手机当做通信上网工具的普通用户。
他们角色不同,使用的Android手机型号不同,但似乎都面临着同一个困扰——Android手机不听从他们的意愿,总是会越用越慢,越来越容易发热。
这一切是如何诞生的?为何到了今天,Android系统更新到7.0版本,Android手机性能配置不再落后,但“慢”和“易发热”依然是所有Android手机的通病?这背后,其实是一件很复杂的事。
“罪魁祸首”
杨光说,要搞清楚这个问题,“得先从Android的后台机制说起。”通常意义上,Android其实存在两种后台机制,缓存和服务。
缓存指的是,用户之前打开过但暂时闲置的应用。按照Android的逻辑,系统不建议用户清理缓存,这实际会造成先前加载过的应用需要再次加载,反而浪费了手机资源。如果内存紧张,系统会自动释放长时间未打开过的应用缓存,为新打开应用腾出空间。
而服务,可以理解为看不见界面,但隐藏在手机深处的应用。理论上来说,只要开发者愿意,服务可以在任何时间做任何事情——调用手机传感器,每秒钟与服务器轮询通信,隔一段周期扫描手机SD卡,等等。
正是由于服务的独特存在,Android应用可以与手机硬件和系统本身达成更密切的连接,实现很多苹果iOS应用无法实现的功能。
“这是Android开放的优势,但也造成了问题。”独立开发者杨光说,“服务不像缓存那样任系统宰割,内存不足时,系统会杀掉一部分应用缓存,但系统无法杀掉服务。如果某个或某几个服务占据了大量的内存、CPU等资源,手机自然就卡顿变慢。”
对一些想要保证推送消息随时可达的应用来说,利用服务占据系统后台成为了它们的必要选择。而如何实现,开发者又利用到了Android另一项机制——开机自启动。
顾名思义,开机自启动是允许应用在开机时自启并以服务的形式常驻在系统后台。自启动机制的初衷,是为了方便应用服务和推送消息。对一些如果关闭容易对用户造成损失的应用而言,这个机制非常有价值,比如闹钟。
但是,当各家应用开发者从自身利益角度出发时,这个机制就被滥用了。在用户看不见的手机系统底层,自启动的“服务”们不停的调用系统资源,与服务器通信,耗费着手机电量,影响手机运行速度。杨光认为,自启动机制没有问题,被滥用的自启动机制称得上是手机变慢的“罪魁祸首”。
记者拿手中一部2014年出品的某品牌旗舰Android手机做了一项测试。手机安装了微信、QQ、微博、百度外卖、百度地图、美团、天猫、淘宝等12款大厂应用之后,它们无一例外均在下载时就默认设置成了开机自启动。仅开机,不使用,闲置一天时间不到,手机就会耗尽电量自动关机。
杨光坦言,国内绝大多数Android应用都会设置开机自启动,而在大公司出品的应用,比例会高达99%。“他们更看重商业利益,推送消息多触及一个用户就能带来多一份应用分发推广的收入。”
斗智斗勇
Google和手机厂商自然都不会对这一现象坐视不管。2012年6月,在推出Android 4.1系统时,Google还推出了自家的推送服务体系——Google Cloud Messaging(GCM)。类似于苹果的推送服务体系(apple Push Notification Service,APNs),GCM不要求应用常驻在系统后台,只需要用户设备的一个标识符(Device Token),就能保证应用的推送消息能到达用户的设备。
在Android 6.0中,Google还推出了Doze Mode和App Standby两项功能,来保证熄屏状态一段时间后,设备进入休眠状态,最近没有使用的应用将处于空闲状态。此举将减少应用自启情况,并降低电池消耗。显然,Google也意识到了自启动机制被一些“流氓应用”滥用了。
不过在中国由于一些特殊原因,需要连接Google服务器的GCM无法使用,导致Google官方的治理手段失效。于是,对Android进行深度定制的各家手机厂商推出了它们的应对方法——自启动管理。自启动管理,即在手机里有一款内置工具允许用户管理设置允许哪些应用自启动,禁止哪些应用自启动。
一名猎豹移动安全工程师告诉记者,“从功能本身来看自启机制是利大于弊的,但如果不加以控制,各家应用都默认自启的话,那这个机制就没有意义,只会让手机越用越慢。手机厂商对自启动机制的正确管理,将一定程度上引导自启动机制被有效的利用。”
在杨光看来,自启动管理做的好的手机厂商真的能帮助用户管理系统后台应用,提高手机运行速度。“毕竟没有哪一个手机厂商愿意用户使用自家手机留下一个‘慢’的印象。”
杨光认为,华为和一加应该是属于自启动管理最严苛的手机厂商。华为手机默认禁止任何应用自启动,并且系统设置里有一个白名单机制,不在白名单里的应用会在熄屏一段时间后被强制杀掉。同样,一加手机也有一个原理类似的自启白名单。不过,事情远没有这么简单,应用开发者与手机厂商之间斗智斗勇的戏码仍在上演。
即使用户曾关闭了应用自启动,但有些应用仍会在用户打开过几次之后,偷偷的在系统后台默认自启。而在自启动机制之外,广播(Broadcast)机制也成为了应用自启动的触发条件。Android允许应用通过“广播”监听系统事件的发生,而开发者可以设置成,只要特定的系统事件发生,应用就能够自启动。这些事件包括解锁屏幕、切换网络等。
开发者如果使用了这些唤醒机制来让它的应用自启动,对用户来说,简直防不胜防。更为大众熟知并深恶痛绝的另一现象是,“全家桶”应用相互唤醒。举个例子,当打开百度地图,系统将唤醒“百度全家桶”旗下的其他应用,用户也能收到百度糯米的推送消息——即使你手机并未打开过百度糯米应用。
对于这一现象,Google和Android手机厂商也有新的对策。华为工程师就表示,华为手机在EMUI 4.0(基于Android 6.0)系统中添加了禁止关联唤醒功能。比如用户打开淘宝,淘宝会唤醒“阿里全家桶”旗下的微博、支付宝、咸鱼等应用,而EMUI现在会帮助用户禁止这一整条唤醒链。
在此之前,一款名为“绿色守护”的第三方应用管理工具被称作Android上的“神器”。它的最主要作用就是彻底杀掉自启动并常驻在后台的应用,并且禁止全家桶应用唤醒链条。
绿色守护开发者Oasis Feng认为,国内Android用户面对的应用生态实在是“太恶劣”了,即使是高端手机都无法避免普遍性的性能及电量消耗黑洞。“一些应用简直是性能杀手,置用户设备体验于不顾,用户的手机绝不应沦为它们的KPI工具。”
另一条路
对开发者而言,难道就只有“自启动机制常驻系统后台”这一种对抗系统和用户的手段吗?当然不是。举个例子,一个创业团队“小世界”就尊重了Android的设计逻辑,没有设置应用自启动。为了保证消息能顺利到达至用户手机,他们使用了第三方推送服务平台。而第三方云推送平台被看作是目前能避免陷入自启机制滥用怪圈的一大方案。
连这样的小创业团队都可以做到,那些大厂的开发者们不可能不知晓。第三方云推送平台的机制类似于GCM和APNs,开发者将消息推送至第三方平台服务器,它利用长链接与用户手机保持通信,消息就能再到达用户手机。
使用第三方云推送平台的好处显而易见,开发者应用不需要常驻在手机后台,仅有云推送平台与手机连接,因此只消耗极少的系统资源,不会拖慢手机运行速度。对创业团队来说,初期使用第三方云推送平台,更是一个省时省钱的方案。
小世界产品负责人阿星说:“使用第三方推送服务平台后,小世界的消息到达率基本能保持在98-99%。在推送方面我们很克制,只做最必要的应用功能层面的推送,尽量不打扰用户。”根据DevStore公开的报告显示,目前市面上百度云推送占据市场第一,在此之后是极光、个推、友盟等。而小米、腾讯、华为都有自建的云推送平台,但市场份额较小。
在资本眼里,第三方推送行业目前也是一块前景不错的蛋糕。2016年4月,个推获得海通开元、民生银行、赛富基金等联合的7亿元C轮融资。6月,极光推送也宣布完成数千万美元C轮融资。
不过,也会有人产生疑问——开发者如果使用百度、腾讯的云推送平台,是否意味着也算是它们广义的“全家桶”中的一员?杨光称,使用云推送平台不会有加入全家桶一说。“利用这个推送平台只是为了在需要时给用户推送有价值的信息,便于开发者对应用推送的管理。推送平台不会滥用推送,打扰用户。”
但也有技术人员表示了担忧,“百度、腾讯的应用也会使用自家的云推送平台,如果第三方应用使用百度腾讯的推送平台,而百度、腾讯的应用也会使用自家的推送平台,二者原理一致,理论上是存在相互唤醒的可能性。“
该技术人员举了一个真实存在的例子,某一家互联网公司在被BAT收购之后,使用了母公司的推送平台,推送消息到达率显著提升了,它的应用自然成为了母公司旗下应用唤醒链条中的其中一环。
从技术上,大公司应用和使用了它家推送平台的小公司应用互相唤醒是可行的。但意愿上双方是否同意,以及大公司是否留有技术后门,目前尚不可知。
值得注意的是,即便第三方推送平台能帮助开发者实现推送消息的及时到达,但是否保持应用自启动的决定权仍然掌握在开发者手中。有像小世界一样,遵循Android的系统逻辑,将后台还给用户的开发者,还是有一定要占据用户手机后台的开发者。只要后者持续存在,数量依然多,Android手机慢的问题就可能一直存在。