android 花式保活正确姿势求指教

2019-03-04 11:23:36 +08:00
 banixc

需求:需要开发一个 android app, 长时间保持后台,并建立 /保持 websocket 连接,服务端不定时从 ws 向客户端推送消息,客户端收到消息后进行语音播报(soundpool)。

目前实现:

  1. 开启一个进程整一个 service 并保持 foreground notification(通知栏可以持续看到)。
  2. 让用户设置省电优化白名单
  3. 让用户将进程锁定防止被清理(任务切换界面加小锁)

然而存在的问题:

  1. 部分手机如此设置后等一段时间就被 kill
  2. 部分手机锁屏后没有网络,ws 不通,断线或者延迟播报(十几秒,一分钟)。
  3. 部分手机锁屏后代码执行速度会下降,表现为定时 sleep1 分钟后打 log 到后面就变成几分钟打一次了(貌似是 doze 模式), 甚至到最后一条语音播报都会断断续续。

已知的一些应用的解决方案及优化点:

  1. 各大主流国产 OS 内置对一些应用增加白名单如微信等,无需手动设置
  2. 多进程保活后相互拉起(5.0 后失效,系统直接杀死进程组)
  3. 原生进程实现,降低内存占用,可以有效防止被杀
    • 目前新开的进程没有 UI,后台内存占用大概在 30-50M 左右
    • 原生进程能在 20M 以内。
    • 由于 soodpool 预先加载资源到内存,这部分看是否可以优化
  4. 设置 alarm/注册广播

另外还需要实现开机自启动,自动连接,无需每次开机都要打开 app 这样的功能。

如上所述,考虑 3,4 优化点,每个点的收益如何?或者诸位大佬有无更好的解决方案?

PS: 不要说应用流氓,用户的需求就是要常驻进程,但是应用总是被系统各种限制导致播报不及时,国产 OS 和应用的相爱相杀-。-,没有 GMS 或者类似统一推送平台的东西,最后就是是双输的局面。

11250 次点击
所在节点    Android
43 条回复
banixc
2019-03-05 10:39:16 +08:00
@codehz @torchmu
刚看到支付宝有个增强收款模式,直接全程亮屏,正在考虑增加一个选项让屏幕永远常亮。
banixc
2019-03-05 10:40:16 +08:00
@gam2046
这个操作有点厉害,但是我们的用户应该都有装白名单里的 app,这样搞用户会反感。
banixc
2019-03-05 10:42:28 +08:00
@nanaw @luckylo @ksssdh123
目前采取的措施指引就是让用户加入省电白名单,但是由于不同的手机设置方法不一样,还有很多小众机型,没办法兼容到所有的手机,更何况有的手机设置了也不顶用。用户是希望常驻后台的。
ksssdh123
2019-03-05 10:52:14 +08:00
@banixc
对于这个问题 我们是这么做的(有点暴力,但我们这边的用户能接受,因为我们是某一行业领域的 app,用户群体很确定)
产品经理 根据市场 根据用户等等因素 ,整理出一份需要适配的名单,最后让用户去选择这些机型去采购,开发只需要对这些名单上的机型做适配,每隔一段时间再对新机型做适配
2bab
2019-03-05 11:45:23 +08:00
这种用户允许下的保活,可以在 App 里给个设置,打开后起个前台的 Service,解决大部分的问题。
2bab
2019-03-05 11:46:26 +08:00
补一下,前台可以自己做 Polling 或者建个自己的 Socket Channel。
ysc3839
2019-03-05 13:02:51 +08:00
MIUI 挺坑的,用户开启了自启动和运行后台运行之后,一般情况下程序并不会被杀死。但是用户从最近任务里面划掉的话就会被杀死。不过程序开了自启动的话可以在后台再启动起来。
banixc
2019-03-05 17:32:34 +08:00
@ksssdh123 这个方法算是简单粗暴了,但是我们这种应该不太有可能试用这种方法。
banixc
2019-03-05 17:34:45 +08:00
@2bab 目前的做法就是起一个前台 Service,然后里面建立 websocket。但是会有网络断开 /进程被 kill/代码执行缓慢的问题。网络断开一般都是自动重连的,进程被 kill 就看怎么能恢复或者重新拉起。
banixc
2019-03-05 17:36:21 +08:00
@ysc3839 通常我们的用户不会手动干掉这个进程的,自启动不是在手机开机的时候启动吗?难道被系统杀掉之后过一段时间还会拉起来?
boboliu
2019-03-05 17:39:21 +08:00
要不……来个悬浮窗+持续亮屏?
ronaldong
2019-03-05 17:51:11 +08:00
之前做即时通讯的应用的时候,研究过这个问题,基本无解
pubby
2019-03-05 17:55:50 +08:00
加点其他触发几率比较大的一些广播事件监听,再加个定时器,然后在这些监听处理里面检查这个 Service 的状态。
息屏的问题,你 WakeLock 也处理一下

我这边一个类似需求的 app,分布在不同的地方,长时间插电运行,websocket 和服务器连接随时接收指令做出响应。
在 vivo,小米,华为几款手机都工作正常,基本上运行几周都不用管。

当然开机自启权限,电源白名单之类的要手工设置好。
0x8192dd
2019-03-05 18:04:30 +08:00
起一个前台 Service,保持运行,同时警告用户不要杀进程,反正明确一点,常驻后台不是没法做,但是“不经用户同意常驻后台”,在目前的高版本系统上是做不到的,也不要浪费时间去尝试了
ysc3839
2019-03-05 18:19:51 +08:00
@banixc 但是你不能保证用户不会不小心划掉。
自启动开了之后是可以在程序被杀死后重新启动的,不需要用户点开就能启动。
whitev2
2019-03-05 19:07:45 +08:00
不用花心思在保活上,我一般都是直接 小黑屋 /冰箱 冻结不需要后台的应用的。这个操作对于应用基本是无解的
luwies
2019-03-05 19:54:42 +08:00
不考虑耗电还是可以的吧,WakeLock 防止系统休眠,同时让你要保活的进程播放一个静音的音频...
unknowngas
2019-03-06 05:53:43 +08:00
Play soundless sound, so your app will be a music player which always play something (either voice message or soundless sound)
ivanchou
2019-03-06 09:54:29 +08:00
想了解下已经实现里的 2、3 是怎么做的
banixc
2019-03-07 15:31:30 +08:00
@boboliu 看了下各位大佬的回复,目前打算这样搞。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/540767

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX