安卓的后盾机制既是安卓的一个劣势,也是碎片化很重大的一个个性,作为三款依赖安卓后盾服务的 App 的开发者,写下这篇文章来比拟一下 EMUI 和 MIUI 这两个最常见的安卓零碎的后盾解决逻辑,先把要比拟的零碎列一下:
- EMUI 10.0.0,Android 10
- MIUI 12.0.6,Android 10
比拟后盾机制的前提是两个零碎均应用缺省设置,不思考诸如省电模式、极简模式等非凡状况,这样合乎大部分用户的应用状况。
概述
常见的安卓 App 驻留后盾形式有三种:
- 注册零碎服务,比方无障碍服务
- 应用安卓定时服务
- 常驻告诉栏的前台服务,即 Foreground Service
这三种后盾模式,我都开发过相应的 App,上面会别离举例来比拟。除此当前,还有一些匪夷所思,也非官方认可的谋取驻留后盾的形式,比方播放一个无声的音乐、开启一个单像素的悬浮窗等等,毕竟不属于邪道,本文就不比拟了。
在比拟之前,有必要阐明一下,对于当初各厂商安卓零碎,比方咱们要比拟的 EMUI 和 MIUI,仅仅依照这种正规形式注册服务是不够的,还是很容易被零碎解冻或杀掉,起因是因为按正规形式注册服务,所有的利用都能够做到,后盾多了,加上一些利用没有节制,手机就必然卡顿费电,所以厂商们的做法也很好了解,默认全杀,做一个只能手工配置的白名单,用户退出白名单才容许后盾服务,这样对于大部分普通用户,不必做任何设置就免受恶意软件之苦。
须要留神,不同零碎白名单配置稍有不同:
- MIUI 设置》利用设置》利用治理》抉择利用》设置省电策略、自启动
- EMUI 设置》利用》利用启动治理》抉择利用》设置容许后盾流动、自启动
上面开始测试三种后盾形式。
无障碍服务
我开发的微动手势,就是一个典型的无障碍服务类利用,安卓零碎反对利用注册为无障碍服务,无障碍服务不仅提供了一种驻留后盾的办法,其自身还提供了很多一般利用无奈做到的性能,比方模拟系统交互、模仿手势等。所以很多安卓 App 都借助无障碍服务来实现某些性能,比方就连抖音 App 都提供了一个无障碍服务。
这里就以微动手势为例,装置实现并关上无障碍服务,而后我别离测试以下四种状况:
- 默认:就是默认装置后不做任何设置
- 加锁:在多任务界面中给利用的卡片加锁
- 白名单:在零碎中将利用退出后盾白名单
- 锁 + 白名单:下面两个都设置
每种状况下我进行四种操作测试,这四种状况都是用户常做的一些操作,而后判断微动手势的后盾是否工作失常,四种操作别离如下:
- 锁屏:锁屏等一分钟后再解锁
- 划卡片:间接在多任务页面中划去利用
- 一键清理:在多任务页面中点一键清理
- 耗尽内存:通过启动多个大型软件或游戏挤占残余内存
测试后果,我绘制表格如下:
EMUI | MIUI | EMUI(加锁) | MIUI(加锁) | EMUI(白名单) | MIUI(白名单) | EMUI(锁 + 白名单) | MIUI(锁 + 白名单) | |
---|---|---|---|---|---|---|---|---|
锁屏 | 失常 | 解冻 | 失常 | 失常 | 失常 | 失常 | 失常 | 失常 |
一键清理 | 被杀 | 被杀 | 失常 | 失常 | 失常 | 被杀 | 失常 | 失常 |
划卡片 | 被杀 | 被杀 | 被杀 | 被杀 | 失常 | 被杀 | 失常 | 被杀 |
耗尽内存 | 失常 | 失常 | 失常 | 失常 | 失常 | 失常 | 失常 | 失常 |
咱们认真看下这里的后果,显著 MIUI 比 EMUI 的后盾管制更严格,大略总结一下:
- MIUI 认为用户操作优先于用户白名单,所以即便退出白名单,通过划卡片仍然将利用杀掉。
- EMUI 认为用户白名单优先,只有退出白名单,用户即便划卡片,后盾都能失常保留,只将前台界面敞开。
两种形式孰优孰劣,我不做评估,但显然 MIUI 的形式,如果想保留后盾,用户在设置白名单之后,还须要加锁并小心防止划卡片。揭示一点,如果你在零碎里同时为利用设置了容许自启动,那么一些后盾利用在被杀之后会立即重启,也就是杀的成果变成了重启。
定时服务
这里说的定时服务是个统称,指借助安卓的某个 ” 定时 ”API 来实现一个定时运行的后盾,安卓本人在这里也很乱,前前后后提供了 AlarmManager、JobSchedule、WorkManager 等很多不兼容的 API 来反对后盾的定时工作,我这里统称为定时服务,我开发的碎片记忆就是典型的定时服务,这是一个背单词的利用,须要定时来查看卡片是否须要温习,而后主动从后盾弹出。
仍然按上述测试方法,后果如下:
EMUI | MIUI | EMUI(加锁) | MIUI(加锁) | EMUI(白名单) | MIUI(白名单) | EMUI(锁 + 白名单) | MIUI(锁 + 白名单) | |
---|---|---|---|---|---|---|---|---|
锁屏 | 失常 | 解冻 | 失常 | 失常 | 失常 | 失常 | 失常 | 失常 |
一键清理 | 被杀 | 被杀 | 失常 | 失常 | 被杀 | 被杀 | 失常 | 失常 |
划卡片 | 被杀 | 被杀 | 被杀 | 被杀 | 被杀 | 被杀 | 被杀 | 被杀 |
耗尽内存 | 被杀 | 被杀 | 被杀 | 失常 | 失常 | 被杀 | 失常 | 失常 |
从这个后果来看,定时服务绝对无障碍服务,优先级要低一些,在某些无障碍服务依然能够失常工作的场景下(比方划卡片和内存耗尽),定时服务就被杀了,不过这次 MIUI 和 EMUI 体现的绝对统一一些。
这里有一点值得一提,安卓提供的定时机制里,有一部分是容许利用被杀后仍然能被定时唤醒的,但这样的话,恶意软件显然能够利用这一点做到永生不死,所以像 EMUI 和 MIUI 这样的系统对这种定时都做了额定的限度,这里不再开展详述了。
前台服务
Android 的前台服务是一个术语:Foreground Service,示意用户能够感知到的后盾服务,所以会在告诉栏给出一个常驻告诉,这是很多利用应用的后盾机制,我开发的电池守护就应用了这个机制,通过这个机制,让利用能够在后盾获取电量变动信息,从而对用户进行充电或拔除充电器的告警。
仍然应用雷同的测试方法,测试后果如下:
EMUI | MIUI | EMUI(加锁) | MIUI(加锁) | EMUI(白名单) | MIUI(白名单) | EMUI(锁 + 白名单) | MIUI(锁 + 白名单) | |
---|---|---|---|---|---|---|---|---|
锁屏 | 失常 | 失常 | 失常 | 失常 | 失常 | 失常 | 失常 | 失常 |
一键清理 | 被杀 | 被杀 | 失常 | 失常 | 失常 | 被杀 | 失常 | 失常 |
划卡片 | 被杀 | 被杀 | 被杀 | 被杀 | 失常 | 被杀 | 失常 | 被杀 |
耗尽内存 | 被杀 | 失常 | 被杀 | 失常 | 失常 | 失常 | 失常 | 失常 |
从耗尽内存的测试后果来看,前台服务的优先级级仿佛介于无障碍服务和定时服务之间,并且 EMUI 和 MIUI 仍然有不小的差别。
总结
从下面的测试来看,无障碍服务、定时服务、前台服务几种服务类型之间有奥妙的差别。而且 MIUI 和 EMUI 的的解决也有不少的差别,从我测试的两个版本看,MIUI 更严苛一些,某些状况下 EMUI 不杀,MIUI 会杀。对于开发者来说这是比拟苦楚的事件,而对于用户来说,就更难了解这些轻微的差别了。好在增加白名单和加锁之后,基本上还是能保住后盾,所以这类须要后盾的利用,通常只能疏导用户去做这些设置。
这个测试只比照了 MIUI 和 EMUI,我置信谷歌原生、三星以及其余厂商还是会有更多的差别,安卓的碎片化可见一斑。