Android 使用MarsDaemon进程常驻
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 使用MarsDaemon进程常驻相关的知识,希望对你有一定的参考价值。
参考技术A在特定的业务场景中,我们可能会需要app在后台做一些事情,比如上传数据之类的操作,并且希望这种操作及时在程序退出之后依然可以继续进行。因此也就理所当然的想到了使用Service进行处理。 但是 ,在特定条件(app进入后台+设备内存不足+进程占用的内存足够大)的情况下,Service会非常容易在几分钟内被系统干掉,因此提高Service的存活率至关重要。
此方法企图利用Service是生命周期去调用其本身,事实证明这种方法是无效的,在进程被杀死时,Service根本不会执行onDestroy就被直接清出内存了,因此靠自身的力量提高存活率的方式也就不可行了。
导入项目之后
之后不要忘记导入module
此处将process1作为主要进程,process2作为守护进程。MainService中执行主要的业务逻辑,Receiver1、GuardService、Receiver2都是额外创建的,里面不要做任何事情,都是空实现就好。
由于我们的Application一般都会集成其他的Application,因此需要在attachBaseContext中初始化DaemonClient,然后调用onAttachBaseContext即可实现
使用Marsdaemon提高Service存活率的方式虽然有一定效果,但是在android5.0之后的版本中,并不可靠,并且还有如下几个缺陷。
因此,Marsdaemon不应是大家频繁使用的功能,特殊情况下可以应急即可。
常驻进程内存优化开机5分钟后常驻进程(Persistent)占用内存大小≤xxxMB,不达标
一、测试步骤:
【预置条件】手机刷机后过完开机向导,连接adb后重启手机
【操作步骤】
1.手机刷机后过完开机向导,连接adb后重启手机
2.开机等待5分钟后通过:adb shell dumpsys meminfo命令查看(若无法直接查看到ufree RAM值则使用:adb shell cat proc/meminfo)
3.内存查看ufree RAM值(内存ufree RAM值=MemFree+Buffers+Cached)
4.常驻进程查看Persistent值
二、分析方法简述:
2.1需求梳理:
需要按照内外部需求或标准完成常驻进程清理要求,针对mtk平台,需要提前清理一些mtk的常驻进程。如下:
28293 kB: com.mediatek.voicecommand (pid 1621)6799 kB: com.mediatek.voiceextension (pid 1863)
2.2什么是常驻进程
Android的常驻进程,就是需要让进程在内存中一直存在,处于保活状态,不能被杀死。
使用场景:
锁屏应用,必须在进程中接收锁屏的广播,因此需要保证进程常驻;
微信、QQ接收消息,为了消息的及时性,需要保证此进程存活。
2.3如何查看常驻进程
可以使用adb shell dumpsys meminfo去查看进程内存情况
查看Persistent此项的进程:
134,167K: Persistent
66,518K: com.android.systemui (pid 1083)
28,154K: com.android.phone (pid 1190)
13,121K: com.mediatek.ims (pid 1173)
10,792K: com.factory.mmigroup (pid 1637)
5,783K: com.factory.runintestii (pid 1672)
5,749K: com.wingtech.stability (pid 1657)
4,050K: org.simalliance.openmobileapi.service:remote (pid 1643)
2.4 处理手法
针对应用进行逐个排查,并拉通负责该进程的owner进行评估,非必要则去除perisit相关标记,必要的给出澄清报告。
以上是关于Android 使用MarsDaemon进程常驻的主要内容,如果未能解决你的问题,请参考以下文章
Android MarsDaemon实现进程及Service常驻