默认
打赏 发表评论 10
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
微信团队原创分享:Android版微信后台保活实战分享(进程保活篇)
阅读(195055) | 评论(10 收藏13 淘帖2
微信扫一扫关注!

本文来自微信Android客户端基础平台、性能优化负责人:杨干荣 的技术分享。


哪些部分需要“保活”?


按照我们的理解包含两部分:


最新推荐:Android保活从入门到放弃:乖乖引导用户加白名单吧(附7大机型加白示例)》(此文发布于2020年06月13日)。

进程保活概述


在Android系统里,进程被杀的原因通常为以下几个方面:

  • a. 应用Crash
  • b. 系统回收内存
  • c. 用户触发
  • d. 第三方root权限app.

原因a可以单独作为一个课题研究。原因c、d目前在微信上没有特殊处理。这里讨论的就是如何应对Android Low Memory Killer。

进程保活实施:进程拆分


微信团队原创分享:Android版微信后台保活实战分享(进程保活篇)_0 (3).png

上图表述的是微信主要的几个进程:

  • a. push主要用于网络交互,没有UI
  • b. worker就是用户看到的主要UI
  • c. tools主要包含gallery和webview

拆分网络进程,确实就是为了减少进程回收带来的网络断开。

微信团队原创分享:Android版微信后台保活实战分享(进程保活篇)_0 (4).png

可以看到push的内存要远远小于worker。而且push的工作性质稳定,内存增长会非常少。这样就可以保证,尽量的减少push 被杀的可能。这里有个思路,但限制比较多,也抛砖引玉。启动一个纯C/C++ 的进程,没有Java run time ,内存使用极低。

这种做法限制很明显,如:没有Java run time ,所以无法使用Android系统接口。缺乏权限,也无法使用各种shell命令操作(如am)。但可以考虑一下用途:高强度运算,网络连接,心跳维持等。比如Shadowsocks-android就如此,通过纯c命令行进程,维护着socks5代理 (Android M运行正常)。

tools进程的拆分也同样是内存的原因:

  • a. 老版本的webview 是有内存泄漏的
  • b. Gallery大量缩略图导致内存使用大

微信在进入后台后,会主动把tools进程kill掉。


进程保活实施:及时拉起


系统回收不可避免,及时重新拉起的手段主要依赖系统特性。从上图看到, push有AlarmReceiver, ConnectReceiver,BootReceiver。这些receiver 都可以在push被杀后,重新拉起。特别AlarmReceiver ,结合心跳逻辑,微信被杀后,重新拉起最多一个心跳周期。

而对于worker,除了用户UI操作启动。在接收消息,或者网络切换等事件, push也会通过LocalBroadcast,重新拉起worker。这种拉起的worker ,大部分初始化已经完成,也能大大提高用户点击微信的启动速度。

历史原因,我们在push和worker通信使用Broadcast和AIDL。实际上,我一直不喜欢这里的实现,AIDL代码冗余多, broadcast效率低。欢迎大家分享更好的思路或者方法。

进程保活实施:进程优先级


Low Memory Killer 决定是否杀进程除了内存大小,还有进程优先级:
微信团队原创分享:Android版微信后台保活实战分享(进程保活篇)_0 (5).png

上表的数字可能在不同系统会有一定的出入,但明确的是,数值越小,优先级越高。对于优先级相同的进程,总是会把内存占用多的先kill。提高进程优先级是保活的最好手段。

正常情况下微信的oom_adj:
微信团队原创分享:Android版微信后台保活实战分享(进程保活篇)_0 (6).png

而被提高优先级后:
微信团队原创分享:Android版微信后台保活实战分享(进程保活篇)_0 (7).png

从统计上报看,提高后的效果极佳。原理:Android 的前台service机制。但该机制的缺陷是通知栏保留了图标。

对于 API level < 18 :调用startForeground(ID, new Notification()),发送空的Notification ,图标则不会显示。对于 API level >= 18:在需要提优先级的service A启动一个InnerService,两个服务同时startForeground,且绑定同样的 ID。Stop 掉InnerService ,这样通知栏图标即被移除。

这方案实际利用了Android前台service的漏洞。微信在评估了国内不少app已经使用后,才进行了部署。其实目标是让大家站同一起跑线上,哪天google 把漏洞堵了,效果也是一样的。

QA环节


Q:之前看微信的架构分享,貌似是通过单一Activity,用多个Fragment切换来实现的多窗口。如果分进程的话,看起来Gallery和
WebView是单独的一个Activity,我的理解是否正确呢?以及进入后台之后,为何只kill tools而不一起释放work呢?

A:Fragment的改造只是用在有限的几个UI上,大部分的UI,对于切换时间要求不高,还是保留成activity,Gallery和WebView都是单独的
activity,所以才可能另外一个进程的。对于我们来说worker的保活仅次于网络的push,worker如果频繁被杀,用户每次启动微信都需要
等待,这个就不好了。所以,我们在后台,只会kill tools,不会主动kill worker。

Q:除了提高进程的优先级,微信在内存方面有什么处理或优化的技术吗?
A:不可否认,其实微信是内存大户了,现阶段我们主要关注内存泄漏,没有专门去减少内存的使用,毕竟内存意味着cache,意味着用户体验更快,后续对于内存优化我们有一些规划,比如说,在cache这块照顾一些低端机。

Q:我记得很久以前听说过微信使用一个像素的浮动窗口来保活,不知道现在还有没有呢?
A:我们有想过,也听说过有其他app是这样做的,但从来没实现过这个方案。

Q:你们push进程与worker进程采用过socket通信方案么?采用的话效果怎么样?
A:有考虑过用socket,后续也可能会有这种尝试,但因为push和worker依赖代码太多,伤筋动骨了,但估计也要比AIDL好,AIDL对于应用出问题后能做的事情太少了。

更多文章


微信对网络影响的技术试验及分析(论文全文)
移动端IM实践:实现Android版微信的智能心跳机制
移动端IM实践:WhatsApp、Line、微信的心跳策略分析
移动端IM实践:谷歌消息推送服务(GCM)研究(来自微信)

(本文上篇《微信团队原创分享:Android版微信后台保活实战分享(网络保活篇)》,原文链接:点此进入

附录:有关IM/推送的进程保活/网络保活的文章汇总


应用保活终极总结(一):Android6.0以下的双进程守护保活实践
应用保活终极总结(二):Android6.0及以上的保活实践(进程防杀篇)
应用保活终极总结(三):Android6.0及以上的保活实践(被杀复活篇)
Android进程保活详解:一篇文章解决你的所有疑问
Android端消息推送总结:实现原理、心跳保活、遇到的问题等
深入的聊聊Android消息推送这件小事
为何基于TCP协议的移动端IM仍然需要心跳保活机制?
微信团队原创分享:Android版微信后台保活实战分享(进程保活篇)
微信团队原创分享:Android版微信后台保活实战分享(网络保活篇)
移动端IM实践:实现Android版微信的智能心跳机制
移动端IM实践:WhatsApp、Line、微信的心跳策略分析
Android P正式版即将到来:后台应用保活、消息推送的真正噩梦
全面盘点当前Android后台保活方案的真实运行效果(截止2019年前)
一文读懂即时通讯应用中的网络心跳包机制:作用、原理、实现思路等
融云技术分享:融云安卓端IM产品的网络链路保活技术实践
正确理解IM长连接的心跳及重连机制,并动手实现(有完整IM源码)
2020年了,Android后台保活还有戏吗?看我如何优雅的实现!
史上最强Android保活思路:深入剖析腾讯TIM的进程永生技术
Android进程永生技术终极揭密:进程被杀底层原理、APP对抗被杀技巧》(* 推荐
>> 更多同类文章 ……

即时通讯网 - 即时通讯开发者社区! 来源: - 即时通讯开发者社区!

上一篇:微信团队原创分享:Android版微信后台保活实战分享(网络保活篇)下一篇:来自阿里OpenIM:打造安全可靠即时通讯服务的技术实践分享

本帖已收录至以下技术专辑

推荐方案
评论 10
这里提到了push进程可以通过localbroadcast与work进程通信…
但是测试发现Localbroadcast是无法跨进程的
一直对QQ的跨进程通信很感兴趣
如果要发送全局广播来进行通信的话,那么信息的安全性就很难保证了
引用:pye52 发表于 2016-12-17 13:12
这里提到了push进程可以通过localbroadcast与work进程通信…
但是测试发现Localbroadcast是无法跨进程的
...

像QQ微信这种很可能直接进入厂商的白名单了,不能跟他们比。建议像小米华为这种,直接考虑接入它们自已的推送通道才有可能。
签名: 《Web端IM聊天消息该不该用浏览器本地存储?一文即懂!》http://www.52im.net/thread-4745-1-1.html
毕竟是微信啊,自己开发APP 后台进程基本被杀。如果所有app都杀不死,只有祈祷用户用大容量Android手机了,但是总有很多低端手机。
签名: 愚人节开心的一天
引用:阮承志 发表于 2017-04-01 15:56
毕竟是微信啊,自己开发APP 后台进程基本被杀。如果所有app都杀不死,只有祈祷用户用大容量Android手机了, ...

微信这样的厂商必须主动给它白名单,不然谁买他手机,哈哈
签名: 《Web端IM聊天消息该不该用浏览器本地存储?一文即懂!》http://www.52im.net/thread-4745-1-1.html
引用:JackJiang 发表于 2016-12-17 14:10
像QQ微信这种很可能直接进入厂商的白名单了,不能跟他们比。建议像小米华为这种,直接考虑接入它们自已的 ...

这个和推送通道有什么关系啊?
LocalBroadcastReceiver不能跨进程通信这个和白名单没关系吧
提示: 作者被禁止或删除 内容自动屏蔽
签名:
不错不错不错不错
还是微信牛逼
看文章,这是微信7年前的保活方案了,有 最新的保活方案吗或目前市面上主流APP的解决方案吗?
引用:yangchanghong 发表于 2023-04-23 16:45
看文章,这是微信7年前的保活方案了,有 最新的保活方案吗或目前市面上主流APP的解决方案吗?

现在已经没有人去纠结保活了,因为保不了。。。

应用保活终极总结(一):Android6.0以下的双进程守护保活实践
应用保活终极总结(二):Android6.0及以上的保活实践(进程防杀篇)
应用保活终极总结(三):Android6.0及以上的保活实践(被杀复活篇)
Android进程保活详解:一篇文章解决你的所有疑问
Android端消息推送总结:实现原理、心跳保活、遇到的问题等
深入的聊聊Android消息推送这件小事
为何基于TCP协议的移动端IM仍然需要心跳保活机制?
一文读懂即时通讯应用中的网络心跳包机制:作用、原理、实现思路等
微信团队原创分享:Android版微信后台保活实战分享(进程保活篇)
微信团队原创分享:Android版微信后台保活实战分享(网络保活篇)
移动端IM实践:实现Android版微信的智能心跳机制
移动端IM实践:WhatsApp、Line、微信的心跳策略分析
Android P正式版即将到来:后台应用保活、消息推送的真正噩梦
全面盘点当前Android后台保活方案的真实运行效果(截止2019年前)
融云技术分享:融云安卓端IM产品的网络链路保活技术实践
一种Android端IM智能心跳算法的设计与实现探讨(含样例代码)
自已开发IM有那么难吗?手把手教你自撸一个Andriod版简易IM (有源码)
跟着源码学IM(一):手把手教你用Netty实现心跳机制、断线重连机制
跟着源码学IM(五):正确理解IM长连接、心跳及重连机制,并动手实现
2020年了,Android后台保活还有戏吗?看我如何优雅的实现!
史上最强Android保活思路:深入剖析腾讯TIM的进程永生技术
Android进程永生技术终极揭密:进程被杀底层原理、APP应对被杀技巧
Android保活从入门到放弃:乖乖引导用户加白名单吧(附7大机型加白示例)
签名: 《Web端IM聊天消息该不该用浏览器本地存储?一文即懂!》http://www.52im.net/thread-4745-1-1.html
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部