与iOS相比,Android是一个更加开放的平台,它带来了更多的自由,也允许了更多的“无法无天之地”。Android系统中的应用比iOS的限制更小,这使得Android催生了很多流氓应用。尽管谷歌一直在努力增加后台限制,厘清Android生态,但流氓应用见识了他们的伎俩,使出了各种变态手段以待在后台。流氓应用在后台有哪些花招和技巧?让我们来看看。很多APP都会注册大量的后台服务,而这些后台服务会消耗额外的资源和电量。Android系统的后台机制。先说一下Android的后台机制,可以让我们更清楚的知道为什么流氓应用容易滞留在后台。Android是基于Linux的操作系统,因此其后台机制与Linux类似——正常情况下,程序返回桌面时不会退出后台,而是继续在后台运行。当系统需要更多的资源时,相应的程序就会被请出来。Android不只是清理后台进程。在Android系统中,App分为Foreground_App(前台应用)、Visiable_App(可见应用)、Secondary_App(二级应用)、Hidden_??App(隐藏应用)、Content_Provider(内容提供者)、Empty_App(空应用)等状态。当内存不足时,系统会先终止Empty_App进程和服务,释放内存;如果内存再次紧张,它会开始操作Content_Provider,依此类推。因此,越重要的进程会保留得越多,越不重要的进程会先被清理出内存。这个方案乍一看似乎没什么问题。Android将App状态分为不同类型,自动管理后台是否常驻。然而,事情并不尽如人意。流氓APP之所以流氓,是因为不守规矩。Android系统空间太大,App无法在后台自由发挥。即使Android6.0引入了Doze打瞌睡机制,AndroidO提倡后台纯净(Background-free),流氓App依然可以在后台安静运行。盘瓠蹲了下来。如果不使用专门的后台查杀工具或对后台进行特殊限制的ROM,流氓应用甚至可以让你的手机变成一个续航两小时的暖手宝。流氓应用后台驻留小窍门:注册状态乱序前文提到,Android将应用划分为几种状态,但流氓应用不会遵守这些规则,让后台按照这些状态运行。例如,流氓应用可以通过startForeground将自己注册为前台应用,使其后台成为最高优先级,永远不会被系统杀死。在Android7.0中,很多后台运行的应用都是在通知栏中公布的。后来,这些App不得不改变了后台停留的方式。不过这个方法已经得到了谷歌官方的回应。注册此状态,通知栏会显示“XX正在后台运行”。虽然流氓应用曾经通过一些手段绕过了它,但谷歌在Android7.0中堵住了这个漏洞。如果你升级到安卓7.0后,某个应用一直在通知栏显示“XX正在后台运行”,毫无疑问这是流氓应用。流氓应用留在后台的技巧:透明悬浮窗这是一个脑洞大开的技巧。我们知道,与iOS不同,App可以在系统中显示悬浮窗,为用户提供各种实时信息。打开浮窗的app会一直运行,不会随便清理进程。所以流氓应用程序正在思考这个问题。流氓应用会设置一个1像素大小的透明浮窗,用户是看不到的,但浮窗是存在的。App退到后台后,由于浮窗的存在,进程也得以保留。这个方法也被谷歌注意到了。在新版本的安卓系统和很多第三方ROM中,App已经不能随便申请悬浮窗的权限了。流氓应用留在后台的小窍门:随机请求唤醒用过安卓的朋友都知道,流氓应用最讨厌的地方就是乱启动,这和流氓应用的随机请求唤醒是分不开的。Android系统有唤醒机制,App可以通过某些特定的事件触发特定的动作。例如,时间到了,应用可以触发铃声;例如,当它连接到网络时或在一定时间后,应用程序可以触发数据同步动作。这些动作需要唤醒应用程序才能运行,因此流氓应用程序频繁使用“Alarm”、“SyncAdapter”等周期性任务来唤醒自己,让自己继续在后台启动。这就是为什么很多后台查杀APP无法彻底查杀流氓APP后台进程的原因。流氓应用通常使用广播接收器来触发后台自启动。谷歌官方也尝试使用对齐唤醒机制来解决这个问题。在Android6.0中,谷歌引入了Doze机制,让后台进程在一个统一的周期内尽可能同时唤醒,让CPU尽可能长时间的休眠。然而,这种机制还不够彻底。它需要在没有任何操作的情况下长时间静止才能工作。总的来说,效果有限。如果用户更频繁地使用手机,Doze机制甚至不会生效,流氓应用程序将继续消耗手机电池。Android6.0引入的Doze模式旨在让App统一唤醒,但不能彻底解决RogueApps在后台停留的问题提示:进程间相互唤醒除了使用Android唤醒机制外,RogueApps也可以使用进程相互唤醒。一方面,流氓应用程序可以在后台注册多个进程。即使一个进程被杀死,它也可以被其他进程唤醒——如果你仔细观察,你会发现很多应用在后台注册了多个进程。不断唤醒;另一方面,流氓应用程序可以聚集在一起互相唤醒!当你启动应用程序A时,它的进程可能会唤醒应用程序B,应用程序B的进程会陆续唤醒应用程序C。“叫醒”在国内APP中尤为常见,防不胜防。观察到许多应用程序被其他带有GreenGuard的应用程序唤醒的情况如此普遍是有原因的。由于没有谷歌服务,国内很多APP不得不借助一些第三方SDK来实现推送、广告等功能。这些第三方SDK往往会分组唤醒应用。很多APP其实不想耍流氓,但是用了这些第三方SDK就不得不耍流氓了。当然,还是有办法解决的。有抱负的开发者在使用流氓SDK时可以访问开源库ProjectCondom(点此进入Github主页),避免“链唤醒”。谷歌也知道进程唤醒的问题,所以Android8.0的开发规范要求App一旦进入后台,需要在短时间内停止所有后台服务,不能随便开启新的后台服务.至于这样做的效果,Android8.0还没有普及,还有待观察。流氓App潜伏技能:相互勾结这应该是黑客的大招吧!如果流氓App本身和ROM勾结了,App无疑就拥有了访问权,反正也杀不死。比如你什么时候看到原生Android会干掉GooglePlay(更何况PlayServices不是流氓)?国内一堆ROM不会把自己的流氓推送打死,还得靠推送卖广告。面对这种情况,用户基本无能为力。或许基于AOSP的第三方ROM可以解决问题,但并非所有设备都符合刷机条件。综上所述,Android生态已接近恶性循环。流氓应用不断寻找留在后台的方法,而各家ROM为了对付流氓应用,对后台的限制也越来越严,这让安卓逐渐失去了原本的卖点。为此,业界也在努力解决流氓应用的问题。比如有开发者提出了Android绿色应用公约(点此查看),中国也计划与开发者合作,建立统一的App推送机制,减少App后台驻留,希望Android生态最终会越来越好,更好的。
