[关闭]
@946898963 2020-02-23T08:10:56.000000Z 字数 3123 阅读 2012

Android进程保活

Android学习笔记


可以利用长连接来实现推送。在实现长连接的时候,我们需要单独开启一个Service进程来发送心跳,为了保持长连接的稳定,我们需要保证这个Service进程一直运行,这就涉及到进程保活。该文章主要介绍进程保活的一些知识。

Android中进程的优先级

前台进程

它表明用户正在与该进程进行交互操作,或者说进程中存在着正在和用户进行交互的组件。五种情况。android系统依据下面的条件来将一个进程标记为前台进程:

可见进程

它表明虽然该进程没有持有任何前台组件,但是它还是能够影响到用户看得到的界面。android系统依据下面的条件将一个进程标记为可见进程:

服务进程

除了前台和可见状态的service,其他状态的service都被归类为服务进程。

后台进程

持有不可见Activity(调用了onStop()方法)的进程即为后台进程。通常情况下都会有很多后台进程,当内存不足的时候,在所有的后台进程里面,会按照LRU(最近使用)规则,优先回收最长时间没有使用过的进程。

空进程

不持有任何活动组件的进程。保持这种进程只有一个目的,就是为了缓存,以便下一次启动该进程中的组件时能够更快响应。当资源紧张的时候,系统会平衡进程缓存和底层的内核缓存情况进行回收。

如果一个进程同时满足上述5种优先级中的多个等级条件,android系统会优先选取其中最高的等级作为该进程的优先级。例如,一个进程持有一个Service(服务进程等级)和一个前台Activity(前台进程等级),那么操作系统会将这个进程标记为前台进程。

Android中进程的回收策略

Low memory killer:通过一些比较复杂的评分机制,对进程进行打分,然后将分数高的进程判定为 bad 进程,杀死并释放内存。

Low memory killer根据OOM_ODJ这个阀值判断进程的优先级,这个值越小,进程优先级越高,Low memory killer不会回收; 这个值越大,进程优先级越低,Low memory killer会回收这个进程。

Low memory killer和OOM的区别:前者是定时进行的,而后者是当系统内存不足的时候才进行检查。

Android进程保活

关于进程保活,需要从两个方面来做:

下面说的方法就是从这两个方面着手的。

1. 利用系统广播拉活。

系统广播:开机,网络连接等广播事件。

缺陷:系统广播不可控,无法及时拉起进程;广播接受者被禁用的情况。

2. 提高Service优先级。

提高Service的优先级,比如说设置成前台进程,但是这种方法也只能说在系统内存不足需要回收资源的时候,优先级较高,不容易被回收,如果用户主动杀死的话仍然没法恢复,而且前台进程的话会在状态栏有个显示;

3. 利用系统Service机制拉活。

利用Service的onStartCommand方法的返回值来完成Service销毁后的重启。

缺陷:只适用于当系统内存不足的时候Service被回收的情况。

下面两种情况不会重启Service:

4. 在Service的onDestroy方法里重启service。

在onDestroy方法里重启service:这个倒还算挺有效的一个方法,但是,直接干掉进程的时候,onDestroy方法都进不来,更别想重启了;

5. 利用Native进程拉活。

开启守护进程,通过JNI的方式(NDK编程),fork()出一个子线程作为守护进程,在守护进程里开启一个死循环,轮询监听服务状态,如果服务销毁的话,重新启动服务,这种方式在Android5.0之前是有效的,但是在An droid 5.0之后失效了,因为Android5.0在应用退出后,ActivityManagerService不仅把主进程给杀死,另外把主进程所属的进程组一并杀死,这样一来,由于子进程和主进程在同一进程组,子进程在做的事情,也就停止了;

如何在fork出的子进程中监听主进程是否被kill:

如何在fork出的子进程中拉活主进程:通过am命令

更详细的内容建议阅读:通过JNI实现守护进程,使Service服务不被杀死

6. 利用定时器实现拉活

利用定时器开启定时任务,每隔一段时间来检查服务是否存活,不存活的话就重新启动Service。

缺陷:不及时。

关于执行定时任务,推荐使用:JobScheduler。

HelloDaemon
Android 7.0之JobScheduler 分析(一)——如何使用job
android 性能优化JobScheduler使用及源码分析

Android 进程保活系列:(三)利用定时器和系统广播
android 7 JobScheduler实现APP保活

7. 腾讯黑科技,QQ的一个像素常驻法

在应用退到后台后,另起一个只有1像素的页面停留在桌面上,让自己保持前台状态,保护自己不被后台清理工具杀死。

关于实现一个像素的Activity的代码,建议阅读:Android进程保活之一个像素保活&Android中1像素Activity进程保活&进程保活-探索篇之1像素保活Android 传说中的1像素保活大法实现谣传QQ中的手段——“1像素页面保活”

上面文章中的代码不能直接运行,直接运行的话,建议用这个工程OnePixelActivity

关于如何检测APP是否处于后台,建议阅读:Android应用前后台切换的判断&监听APP进入后台或切换到前台方案对比

8. 通过商务手段将应用加入各大平台的白名单中。

总结来说,在Android 5.0之后除了花钱加白名单之外,没有什么比较好的办法,可以让Service常驻内存。

关于具体的代码实现,建议参考:HelloDaemon

参考:

android空进程为什么能加快应用程序启动速度?

Android的进程优先级

Android Service 服务不被杀死的妙招

Service服务详解以及如何使service服务不被杀死

通过JNI实现守护进程,使Service服务不被杀死

linux系统编程之进程(八):守护进程详解及创建,daemon()使用

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注