写在前面的话:

保活不是让你的app杀不死,用户主动清理后台,app必死(厂商定制的白名单app除外),用户不主动杀后台(比如内存不足),你的app使用了保活可能会活下来

Android 进程保活包括两个层面:

提供进程优先级,降低进程被杀死的概率

在进程被杀死后,进行拉活(比如王者荣耀拉起京东金融)

本文下面就从这两个方面做一下总结。

1. 进程的优先级

Android 系统将尽量长时间地保持应用进程,但为了新建进程或运行更重要的进程,最终需要清除旧进程来回收内存。 为了确定保留或终止哪些进程,系统会根据进程中正在运行的组件以及这些组件的状态,将每个进程放入“重要性层次结构”中。 必要时,系统会首先消除重要性最低的进程,然后是清除重要性稍低一级的进程,依此类推,以回收系统资源。

进程的重要性,划分5级:

前台进程(Foreground process)

可见进程(Visible process)

服务进程(Service process)

后台进程(Background process)

空进程(Empty process)

1.1. 前台进程 —— Foreground process

用户当前操作所必需的进程。通常在任意给定时间前台进程都为数不多。只有在内存不足以支持它们同时继续运行这一万不得已的情况下,系统才会终止它们。

拥有用户正在交互的 Activity(已调用 onResume())

拥有某个 Service,后者绑定到用户正在交互的 Activity

拥有正在“前台”运行的 Service(服务已调用 startForeground())

拥有正执行一个生命周期回调的 Service(onCreate()、onStart() 或 onDestroy())

拥有正执行其 onReceive() 方法的 BroadcastReceiver

1.2. 可见进程 —— Visible process

没有任何前台组件、但仍会影响用户在屏幕上所见内容的进程。可见进程被视为是极其重要的进程,除非为了维持所有前台进程同时运行而必须终止,否则系统不会终止这些进程。

拥有不在前台、但仍对用户可见的 Activity(已调用 onPause())。

拥有绑定到可见(或前台)Activity 的 Service

1.3. 服务进程 —— Service process

尽管服务进程与用户所见内容没有直接关联,但是它们通常在执行一些用户关心的操作(例如,在后台播放音乐或从网络下载数据)。因此,除非内存不足以维持所有前台进程和可见进程同时运行,否则系统会让服务进程保持运行状态。

正在运行 startService() 方法启动的服务,且不属于上述两个更高类别进程的进程。

1.4. 后台进程 —— Background process

后台进程对用户体验没有直接影响,系统可能随时终止它们,以回收内存供前台进程、可见进程或服务进程使用。 通常会有很多后台进程在运行,因此它们会保存在 LRU 列表中,以确保包含用户最近查看的 Activity 的进程最后一个被终止。如果某个 Activity 正确实现了生命周期方法,并保存了其当前状态,则终止其进程不会对用户体验产生明显影响,因为当用户导航回该 Activity 时,Activity 会恢复其所有可见状态。

对用户不可见的 Activity 的进程(已调用 Activity的onStop() 方法)

1.5. 空进程 —— Empty process

保留这种进程的的唯一目的是用作缓存,以缩短下次在其中运行组件所需的启动时间。 为使总体系统资源在进程缓存和底层内核缓存之间保持平衡,系统往往会终止这些进程。

A. 不含任何活动应用组件的进程

提升进程优先级的方案

2.1. 利用 Activity 提升权限

2.1.1. 方案设计思想

监控手机锁屏解锁事件,在屏幕锁屏时启动1个像素的 Activity,在用户解锁时将 Activity 销毁掉。注意该 Activity 需设计成用户无感知。

通过该方案,可以使进程的优先级在屏幕锁屏时间由4提升为最高优先级1。

2.1.2. 方案适用范围

适用场景: 本方案主要解决第三方应用及系统管理工具在检测到锁屏事件后一段时间(一般为5分钟以内)内会杀死后台进程,已达到省电的目的问题。

适用版本: 适用于所有的 Android 版本。

2.1.3. 方案具体实现

首先定义 Activity,并设置 Activity 的大小为1像素:

其次,从 AndroidManifest 中通过如下属性,排除 Activity 在 RecentTask 中的显示:

最后,控制 Activity 为透明:

Activity 启动与销毁时机的控制:

2.2. 利用 Notification 提升权限

2.2.1. 方案设计思想

Android 中 Service 的优先级为4,通过 setForeground 接口可以将后台 Service 设置为前台 Service,使进程的优先级由4提升为2,从而使进程的优先级仅仅低于用户当前正在交互的进程,与可见进程优先级一致,使进程被杀死的概率大大降低。

2.2.2. 方案实现挑战

从 Android2.3 开始调用 setForeground 将后台 Service 设置为前台 Service 时,必须在系统的通知栏发送一条通知,也就是前台 Service 与一条可见的通知时绑定在一起的。

对于不需要常驻通知栏的应用来说,该方案虽好,但却是用户感知的,无法直接使用。

2.2.3. 方案适用范围

适用于目前已知所有版本。

2.3 利用Service后台播放一段空白的音频或者视频,提升优先级

耗电就不说了,现在在8.0上也是无法避免被杀(想想类似于酷狗音乐正在放着音乐,你主动杀后台),但是为啥酷狗一直在后台放音乐,有时候却不会被杀或者杀了以后音乐不会停止呢?

3. 进程死后拉活的方案

3.1. 利用系统广播拉活
3.1.1. 方案设计思想

在发生特定系统事件时,系统会发出响应的广播,通过在 AndroidManifest 中“静态”注册对应的广播监听器,即可在发生响应事件时拉活。

常用的用于拉起的广播事件包括:

3.1.2. 方案适用范围

适用于全部 Android 平台。但存在如下几个缺点:

广播接收器被管理软件、系统软件通过“自启管理”等功能禁用的场景无法接收到广播,从而无法自启。

系统广播事件不可控,只能保证发生事件时拉活进程,但无法保证进程挂掉后立即拉活。

3.2. 利用第三方应用广播拉活
3.2.1. 方案设计思想

该方案总的设计思想与接收系统广播类似,不同的是该方案为接收第三方 Top 应用广播。

通过反编译第三方 Top 应用,如:手机QQ、微信、支付宝、UC浏览器等,以及友盟、信鸽、个推等 SDK,找出它们外发的广播,在应用中进行监听,这样当这些应用发出广播时,就会将我们的应用拉活。

3.2.2. 方案适用范围

该方案的有效程度除与系统广播一样的因素外,主要受如下因素限制:

反编译分析过的第三方应用的多少

第三方应用的广播属于应用私有,当前版本中有效的广播,在后续版本随时就可能被移除或被改为不外发。

这些因素都影响了拉活的效果。

3.3. 利用系统Service机制拉活
3.3.1. 方案设计思想

将 Service 设置为 START_STICKY,利用系统机制在 Service 挂掉后自动拉活:

3.3.2. 方案适用范围

如下两种情况无法拉活:

Service 第一次被异常杀死后会在5秒内重启,第二次被杀死会在10秒内重启,第三次会在20秒内重启,一旦在短时间内 Service 被杀死达到5次,则系统不再拉起。

进程被取得 Root 权限的管理工具或系统工具通过 forestop 停止掉,无法重启。

3.4. 利用Native进程拉活(守护进程保活)
3.4.1. 方案设计思想

主要思想:利用 Linux 中的 fork 机制创建 Native 进程,在 Native 进程中监控主进程的存活,当主进程挂掉后,在 Native 进程中立即对主进程进行拉活。

主要原理:在 Android 中所有进程和系统组件的生命周期受 ActivityManagerService 的统一管理。而且,通过 Linux 的 fork 机制创建的进程为纯 Linux 进程,其生命周期不受 Android 的管理。

3.4.2. 方案适用范围

该方案主要适用于 Android5.0 以下版本手机,该方案不受 forcestop 影响,被强制停止的应用依然可以被拉活,对于 Android5.0 以上手机,系统虽然会将native进程内的所有进程都杀死。

3.5. 利用 JobScheduler 机制拉活
3.5.1. 方案设计思想

Android5.0 以后系统对 Native 进程等加强了管理,Native 拉活方式失效。系统在 Android5.0 以上版本提供了 JobScheduler 接口,系统会定时调用该进程以使应用进行一些逻辑操作。

3.5.2. 方案适用范围

该方案主要适用于 Android5.0 以上版本手机。

该方案在 Android5.0 以上版本中不受 forcestop 影响,被强制停止的应用依然可以被拉活。

3.6. 利用账号同步机制拉活
3.6.1. 方案设计思想

Android 系统的账号同步机制会定期同步账号进行,该方案目的在于利用同步机制进行进程的拉活。添加账号和设置同步周期的代码如下:

该方案需要在 AndroidManifest 中定义账号授权与同步服务。

3.6.2. 方案适用范围

该方案适用于所有的 Android 版本,包括被 forestop 掉的进程也可以进行拉活。

最新 Android 版本(Android N)中系统好像对账户同步这里做了变动,该方法不再有效。

4. 其他拉活方案

利用系统通知管理权限进行拉活

利用辅助功能拉活,将应用加入厂商或管理软件白名单。

接入 Google 的 GCM(国外版应用)

国内版应用:根据终端不同,在小米手机(包括 MIUI)接入小米推送、华为手机接入华为推送;其他手机可以考虑接入腾讯信鸽或极光推送

总结:

  • 保活就是个伪命题,利用Activity或者前台Service提升优先级效果不明显,kill以后拉起也不明显,保活黑科技,万年不死类的Service,各种保活框架,收效甚微,可能是针对低版本的rom有效

  • 截止到目前有效方案是:

    花钱进厂商白名单(微信,QQ)

    小米用小米推送,华为用华为推送,其他的统一使用三方推送(类似极光)

  • 值得期待的是统一推送联盟目前正在完善的推必达联盟联合三大运营商,共同推出信令级推送的解决方案——推必达。推必达利用信令级通道的高可靠及广播能力,帮助开发者推送提供基于场景及业务的短信/推送的增值服务,可以提供100%的到达率,支持银行服务提醒、移动办公通知、验证码下发等。由于采取信令通道进行推送,无需后台常驻进程,无额外耗电,无额外流量,无需安装SDK。

参考文章:https://blog.csdn.net/tencent_bugly/article/details/52192423

更多相关文章

  1. 高级Redis应用进阶课 一站式Redis解决方案
  2. Nginx系列教程(六)| 手把手教你搭建 LNMP 架构并部署天空网络电影
  3. 一款霸榜 GitHub 的开源 Linux 资源监视器!
  4. Android拾萃- Android(安卓)进程层次
  5. 获取Android设备唯一标识码
  6. android 权限问题分析
  7. Android(安卓)Binder IPC详解-Android学习之旅(96)
  8. 雷牛满面:Baidu 推出自己的移动操作系统
  9. Termux 详解—— Android(安卓)平台上完美移植的 Linux 工具集

随机推荐

  1. Android怎样修改系统时间?
  2. 炫酷的MaterialDesign Ripple水波纹动画
  3. android中的布局优化
  4. Android 的 Tweened animation
  5. Android移动view动画问题(让移动更平滑)
  6. android 9.0 10.0 修改默认字体大小
  7. android一些有用的View属性
  8. Android实现带图标的ListView
  9. 创建你的第一个AndroidApp
  10. Android(安卓)Annotations环境搭建(Andro