推送调研
App为什么要进行应用保活
其实搞保活的目的倒不是为了干什么见不得人的坏事(但不排除动机不纯的开发者),主要是像IM即时通讯应用和资讯类应用等需要搞后台消息推送、运动类应用需要在后台实时监测用户的运动数据等,因为现在越来越多的手机厂商为了省电策略考虑,基本上如果你的应用没有被加入白名单,一旦处于后台就会被系统限制甚至干掉,但使用APP的用户才不听你这些解释——反正“我”就要你的APP能如期正常运行,开发者也是不得已而为之。
实际上,对于后台消息推送能力,Android原版系统早就内置了系统级推送服务(跟iOS上的APNS服务是一个东西),它就是GCM服务(现在升级为FCM了),但众所周之的原因,谷哥的服务在国内都是用不了的
Android各版本出现的保活技术
主要设计AB两个不同服务进程,A进程的服务轮询检查B进程的服务是否存活,没存活的话将其拉起,同样B进程服务轮询检查A进程服务是否存活,没存活的话也将其拉起
降低omm_adj值,尽量保证进程不被系统杀死
进程在内存中时活动主要有五种状态:即前台进程、可见进程、服务进程、后台进程、空进程,这几种状态的进程优先级由高到低,oom_adj值由低到高(在ProcessList定义)。然后Android系统会根据当前系统资源和进程oom_adj值来回收相应的进程,前台进程一般不会被回收,空进程最容易被回收
实现方案:前台Service 一像素锁屏 后台循环播放一段无声广播
JobScheduler是谷歌在Android 5.0引入的一个能够执行某项任务的API,它允许APP在将来达到一定条件时执行指定的任务。通常情况下,即使APP被强制停止,预定的任务仍然会被执行
第三方推送平台
极光推送
友盟推送
个推
阿里云移动推送
腾讯信鸽
百度云推送
特征:app级长连接通道;由系统事件广播保活进程,独立进程,共用长连接,链式唤醒等
厂商:提供推送及增值服务,如友盟推送、个推、腾讯信鸽、极光推送等
优点:通用性较强,各种ROM上都能用,app在活动时成功率与系统级推送相当
缺点:app被杀死后成功率较低,这点在国产ROM上尤为明显。进程保活、链式唤醒会导致耗电量增加。进程保活和唤醒机制受限于系统及各种优化软件
第三方推送一般使用长连接和应用间互相唤醒的方式来保证推送的到达率,但是此种方式用户体验很差,存在内存大量占用以及电量消耗加快等负面影响。而且 Andoird 5.0 之后,后台进程以及定时任务的限制,保持长连接正在变得越来越困难,所以即使是极光、友盟等这样专业的推送平台,达到率也不会有他们宣称的那么高,一般估计在 50%~70%,甚至更低。不过,可以考虑通过商务合作手段让手机厂家给应用开白名单
第三方平台的推送服务的优点是通道聚合,接入成本低。缺点除了上面提到的到达率不如系统级推送,另外还有用户数或设备数的限制,也就是说在量大的情况下部分推送平台需要收费。
第三方推送平台对比
平台 | 是否收费 | 厂商通道支持 | 到达率 | 集成难度 |
---|---|---|---|---|
友盟 | 否 | 支持 | 高 | 较高 |
极光 | 高级版收费 | 支持 | 高 | 一般 |
个推 | VIP收费 | 支持 | 高 | 一般 |
阿里移动推送 | 设备数>5万收费 | 支持 | 一般 | 一般 |
腾讯信鸽 | 否 | 支持 | 一般 | 一般 |
百度云推送 | 否 | 不支持 | 高 | 一般 |
通道
目前拥有厂商通道的厂商有:小米,华为,魅族,OPPO,VIVO
- 阿里云使用淘宝通道
- 腾讯信鸽使用的是腾讯系游戏的通道(没有微信或QQ通道)
- 个推有微博,网易新闻,滴滴等
- 小米推送在miui上使用系统通道,非miui手机上,自己一个通道,不共享通道
- 华为推送在华为手机上使用系统通道,在非华为手机上使用需要额外安装一个app
- 极光和个推都是有厂商通道服务,但是基本都是针对VIP收费用户
厂商通道
小米推送在miui上使用系统通道,非miui手机上,自己一个通道,不共享通道;app被杀死后在MIUI系统下仍能收到通知消息;非MIUI系统下,小米推送可以使用app级通道,此时与三方推送类似
华为推送在华为手机上使用系统通道,在非华为手机上使用需要额外安装一个app;app被杀死后在EMUI 5.0 系统下仍能收到通知消息;仅支持 EMUI 5.0以上版本,低版本和其他ROM 创建连接失败,完全不能使用
自启动管理:需要把应用加到【自启动管理】列表,否则杀进程或重新开机后进程不会开启,只能手动开启应用
后台应用保护:需要手动把应用加到此列表,否则设备进入睡眠后会自动杀掉应用进程,只有手动开启应用才能恢复运行
通知管理:应用状态有三种:提示、允许、禁止。禁止应用则通知栏不会有任何提醒
在Flyme上属于系统级服务,共享系统级长连接,客户端服务省电省流量
在ColorOS上使用系统级通道,共享ColorOS系统级长连接,服务稳定,保证消息的高到达率
在Funtouch OS上共享系统级通道
-
相对而言,小米推送的完成度更高,在系统推送的基础上实现了三方通道,兼容了非 MIUI 的 Android 机,而且有 IOS 平台的SDK,在一定程度上可以替代三方推送。华为推送仅支持自家EMUI 5.0以上系统。
-
使用厂商通道会有如下问题:
- 需要一家一家下载SDK、注册开发者账号、搞手机端对接、搞服务端对接;
- 各厂商的SDK都打包在一个APP里,可能存在各种兼容性问题;
- 因为ROOM版本问题,即使同一个厂商的手机的同一套SDK也存在新旧ROOM的兼容性问题;
- 这一堆的SDK,各种jar包让你的APP莫名变大了不少;
- 服务端要对接各种厂商的推送后台,各家的技术水平、SDK水准、服务稳定性参差不齐,对接起来有难度
- 有些手机小厂并没有自已的推送通道,仍然需要自建通道。
实际测试总结
- 接入小米推送,在小米手机上可以实现系统级的推送,只要手机系统不挂,推送都会秒到;在其它手机上(魅族),应用在前台时,推送秒到,应用在后台未被杀掉时,推送秒到,若应用被清理掉或时间过长被系统清理掉时,推送无法到达(会在下次启动APP时推送到)
- 接入魅族推送,在魅族手机上是系统级推送,有1秒左右的延迟
总结
- 如果选择第三方推送平台优先选择支持厂商通道的推送平台
- 如果是从零开开始开发,只接入小米推送,就可以覆盖到大部分 Android 机型,并且可以在 MIUI 上获得加成
- 如果项目中已经接入了三方推送而效果又不理想,可以考虑单独接入小米、华为等平台的 SDK 来提高在国产 ROM 上的送达率,需要自行处理数据整合的问题
- 如果追求高送达率和接入成本,可以考虑已有的支持厂商通道的第三方推送平台如:友盟,极光,腾讯信鸽,个推等等
- Amdroid7.0及之后,进程保活手段很难奏效;Android越往后迭代,限制越严格。