返回顶部
首页 > 资讯 > 精选 >如何对Android中的进程进行保活
  • 215
分享到

如何对Android中的进程进行保活

android进程保活roi 2023-05-31 10:05:11 215人浏览 泡泡鱼
摘要

本篇文章给大家分享的是有关如何对Android中的进程进行保活,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。保活手段当前业界的Android进程保活手段主要分为 黑、白、灰 三

本篇文章给大家分享的是有关如何对Android中的进程进行保活,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

保活手段

当前业界的Android进程保活手段主要分为 黑、白、灰 三种,其大致的实现思路如下:

黑色保活:不同的app进程,用广播相互唤醒(包括利用系统提供的广播进行唤醒)

白色保活:启动前台Service

灰色保活:利用系统的漏洞启动前台Service

黑色保活

所谓黑色保活,就是利用不同的app进程使用广播来进行相互唤醒。举个3个比较常见的场景:

场景1:开机,网络切换、拍照、拍视频时候,利用系统产生的广播唤醒app

场景2:接入第三方SDK也会唤醒相应的app进程,如微信sdk会唤醒微信,支付宝sdk会唤醒支付宝。由此发散开去,就会直接触发了下面的 场景3

场景3:假如你手机里装了支付宝、淘宝、天猫、UC等阿里系的app,那么你打开任意一个阿里系的app后,有可能就顺便把其他阿里系的app给唤醒了。(只是拿阿里打个比方,其实BAT系都差不多)

没错,我们的Android手机就是一步一步的被上面这些场景给拖卡机的。

针对场景1,估计Google已经开始意识到这些问题,所以在最新的Android N取消了 ACTioN_NEW_PICTURE(拍照),ACTION_NEW_VIDEO(拍视频),CONNECTIVITY_ACTION(网络切换)等三种广播,无疑给了很多app沉重的打击。我猜他们的心情是下面这样的

而开机广播的话,记得有一些定制ROM的厂商早已经将其去掉。

针对场景2和场景3,因为调用SDK唤醒app进程属于正常行为,此处不讨论。但是在借助LBE分析app之间的唤醒路径的时候,发现了两个问题:

很多推送SDK也存在唤醒app的功能

app之间的唤醒路径真是多,且错综复杂

我把自己使用的手机测试结果给大家围观一下(我的手机是小米4C,刷了原生的Android5.1系统,且已经获得Root权限才能查看这些唤醒路径)

如何对Android中的进程进行保活

15组相互唤醒路径

如何对Android中的进程进行保活

全部唤醒路径

我们直接点开 简书 的唤醒路径进行查看

如何对Android中的进程进行保活

简书唤醒路径

可以看到以上3条唤醒路径,但是涵盖的唤醒应用总数却达到了23+43+28款,数目真心惊人。请注意,这只是我手机上一款app的唤醒路径而已,到了这里是不是有点细思极恐。

当然,这里依然存在一个疑问,就是LBE分析这些唤醒路径和互相唤醒的应用是基于什么思路,我们不得而知。所以我们也无法确定其分析结果是否准确,如果有LBE的童鞋看到此文章,不知可否告知一下思路呢?但是,手机打开一个app就唤醒一大批,我自己可是亲身体验到这种酸爽的......

如何对Android中的进程进行保活

白色保活

白色保活手段非常简单,就是调用系统api启动一个前台的Service进程,这样会在系统的通知栏生成一个Notification,用来让用户知道有这样一个app在运行着,哪怕当前的app退到了后台。如下方的LBE和QQ音乐这样:

如何对Android中的进程进行保活

灰色保活

灰色保活,这种保活手段是应用范围最广泛。它是利用系统的漏洞来启动一个前台的Service进程,与普通的启动方式区别在于,它不会在系统通知栏处出现一个Notification,看起来就如同运行着一个后台Service进程一样。这样做带来的好处就是,用户无法察觉到你运行着一个前台进程(因为看不到Notification),但你的进程优先级又是高于普通后台进程的。那么如何利用系统的漏洞呢,大致的实现思路和代码如下:

思路一:API < 18,启动前台Service时直接传入new Notification();

思路二:API >= 18,同时启动两个id相同的前台Service,然后再将后启动的Service做stop处理;

public class GrayService extends Service {  private final static int GRAY_SERVICE_ID = 1001;  @Override  public int onStartCommand(Intent intent, int flags, int startId) {    if (Build.VERSION.SDK_INT < 18) {      startForeground(GRAY_SERVICE_ID, new Notification());//API < 18 ,此方法能有效隐藏Notification上的图标    } else {      Intent innerIntent = new Intent(this, GrayInnerService.class);      startService(innerIntent);      startForeground(GRAY_SERVICE_ID, new Notification());    }    return super.onStartCommand(intent, flags, startId);  }  ...  ...    public static class GrayInnerService extends Service {    @Override    public int onStartCommand(Intent intent, int flags, int startId) {      startForeground(GRAY_SERVICE_ID, new Notification());      stopForeground(true);      stopSelf();      return super.onStartCommand(intent, flags, startId);    }  }}

代码大致就是这样,能让你神不知鬼不觉的启动着一个前台Service。其实市面上很多app都用着这种灰色保活的手段,什么?你不信?好吧,我们来验证一下。流程很简单,打开一个app,看下系统通知栏有没有一个 Notification,如果没有,我们就进入手机的adb shell模式,然后输入下面的shell命令

dumpsys activity services PackageName

打印出指定包名的所有进程中的Service信息,看下有没有 isForeground=true 的关键信息。如果通知栏没有看到属于app的 Notification 且又看到 isForeground=true 则说明了,此app利用了这种灰色保活的手段。

下面分别是我手机上微信、qq、支付宝、陌陌的测试结果,大家有兴趣也可以自己验证一下。

如何对Android中的进程进行保活

微信

如何对Android中的进程进行保活

手Q

如何对Android中的进程进行保活

支付宝

如何对Android中的进程进行保活

陌陌

其实Google察觉到了此漏洞的存在,并逐步进行封堵。这就是为什么这种保活方式分 API >= 18 和 API < 18 两种情况,从Android5.0的ServiceRecord类的postNotification函数源代码中可以看到这样的一行注释

如何对Android中的进程进行保活

当某一天 API >= 18 的方案也失效的时候,我们就又要另谋出路了。需要注意的是,使用灰色保活并不代表着你的Service就永生不死了,只能说是提高了进程的优先级。如果你的app进程占用了大量的内存,按照回收进程的策略,同样会干掉你的app。感兴趣于灰色保活是如何利用系统漏洞不显示 Notification 的童鞋,可以研究一下系统的 ServiceRecord、NotificationManagerService 等相关源代码,因为不是本文的重点,所以不做详述。

唠叨的分割线

到这里基本就介绍完了 黑、白、灰 三种实现方式,仅仅从代码层面去讲保活是不够的,我希望能够通过系统的进程回收机制来理解保活,这样能够让我们更好的避免踩到进程被杀的坑。

进程回收机制

熟悉Android系统的童鞋都知道,系统出于体验和性能上的考虑,app在退到后台时系统并不会真正的kill掉这个进程,而是将其缓存起来。打开的应用越多,后台缓存的进程也越多。在系统内存不足的情况下,系统开始依据自身的一套进程回收机制来判断要kill掉哪些进程,以腾出内存来供给需要的app。这套杀进程回收内存的机制就叫 Low Memory Killer ,它是基于linux内核的 OOM Killer(Out-Of-Memory killer)机制诞生。

了解完 Low Memory Killer,再科普一下oom_adj。什么是oom_adj?它是linux内核分配给每个系统进程的一个值,代表进程的优先级,进程回收机制就是根据这个优先级来决定是否进行回收。对于oom_adj的作用,你只需要记住以下几点即可:

  • 进程的oom_adj越大,表示此进程优先级越低,越容易被杀回收;越小,表示进程优先级越高,越不容易被杀回收

  • 普通app进程的oom_adj>=0,系统进程的oom_adj才可能<0

那么我们如何查看进程的oom_adj值呢,需要用到下面的两个shell命令

ps | grep PackageName //获取你指定的进程信息

如何对Android中的进程进行保活

这里是以我写的demo代码为例子,红色圈中部分别为下面三个进程的ID

  • UI进程:com.clock.daemon

  • 普通后台进程:com.clock.daemon:bg

  • 灰色保活进程:com.clock.daemon:gray

当然,这些进程的id也可以通过AndroidStudio获得

如何对Android中的进程进行保活

接着我们来再来获取三个进程的oom_adj

cat /proc/进程ID/oom_adj

如何对Android中的进程进行保活

从上图可以看到UI进程和灰色保活Service进程的oom_adj=0,而普通后台进程oom_adj=15。到这里估计你也能明白,为什么普通的后台进程容易被回收,而前台进程则不容易被回收了吧。但明白这个还不够,接着看下图

如何对Android中的进程进行保活

上面是我把app切换到后台,再进行一次oom_adj的检验,你会发现UI进程的值从0变成了6,而灰色保活的Service进程则从0变成了1。这里可以观察到,app退到后台时,其所有的进程优先级都会降低。但是UI进程是降低最为明显的,因为它占用的内存资源最多,系统内存不足的时候肯定优先杀这些占用内存高的进程来腾出资源。所以,为了尽量避免后台UI进程被杀,需要尽可能的释放一些不用的资源,尤其是图片、音视频之类的。

从Android官方文档中,我们也能看到优先级从高到低列出了这些不同类型的进程:Foreground process、Visible process、Service process、Background process、Empty process。

以上就是如何对Android中的进程进行保活,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注编程网精选频道。

--结束END--

本文标题: 如何对Android中的进程进行保活

本文链接: https://lsjlt.com/news/224931.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何对Android中的进程进行保活
    本篇文章给大家分享的是有关如何对Android中的进程进行保活,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。保活手段当前业界的Android进程保活手段主要分为 黑、白、灰 三...
    99+
    2023-05-31
    android 进程保活 roi
  • 详解Android进程保活的方法
    关于 Android 平台的进程保活这一块,想必是所有 Android 开发者瞩目的内容之一。你到网上搜 Android 进程保活,可以搜出各种各样神乎其技的做法,绝大多数都是...
    99+
    2022-06-06
    方法 Android
  • Android进程保活之提升进程优先级
    一、1 像素 Activity 提高进程优先级 使用 Activity 可以提升进程的 oom_adj 值 ; APP 进入后台后 , 使用 BroadcastReceiver 广播...
    99+
    2024-04-02
  • Android 应用进程保活方案实战
    前台服务:将应用运行的服务设置为前台服务,让用户知道应用正在后台运行,系统会给予一定的优先级,减少被系统杀掉的概率。但是需要注意,使用前台服务保活不能大量占用用户的通知栏,否则用户可能会感到烦躁而卸载应用。 JobScheduler:A...
    99+
    2023-08-31
    android java 开发语言
  • Android 12.0进程保活白名单功能实现
    1.概述   在12.0的系统产品开发中,在某些重要的app即使进入后台,产品需求要求也不想被系统杀掉进程,需要app长时间保活,就是app进程保活白名单功能的实现,所以需要在系统杀进程的时候不杀掉白名单的进程 2. app进程保活白名单功...
    99+
    2023-09-26
    android java frameworks 进程保活 进程保活白名单
  • Android应用中如何对xml进行解析
    本篇文章给大家分享的是有关Android应用中如何对xml进行解析,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。XmlActivity package com.And...
    99+
    2023-05-31
    android xml roi
  • 如何在Android中对字符串进行压缩
    这期内容当中小编将会给大家带来有关如何在Android中对字符串进行压缩,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。使用到的类库GZIPOutputStream代码示例import java....
    99+
    2023-05-30
    android 字符串
  • android开发中如何对图片进行处理
    这篇文章给大家介绍android开发中如何对图片进行处理,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。创建一个Java类CircleImageView把下面的代码复制过去,报错的导包package de.hdodenh...
    99+
    2023-05-31
    android roi
  • Android应用中是如何对登录进行处理的
    Android应用中是如何对登录进行处理的?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。先从核心代码开始看:public class GoLoginUtil...
    99+
    2023-05-31
    android roi
  • Android进程间如何使用Intent进行通信
    这篇文章主要介绍“Android进程间如何使用Intent进行通信”,在日常操作中,相信很多人在Android进程间如何使用Intent进行通信问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Android进程...
    99+
    2023-07-05
  • 如何在Android应用中对图片进行压缩
    本篇文章给大家分享的是有关如何在Android应用中对图片进行压缩,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1、质量压缩法设置bitmap options属性,降低图片的质...
    99+
    2023-05-31
    android 中对 roi
  • 如何在Android 中利用ScrollView对GridView进行嵌套
    本篇文章为大家展示了如何在Android 中利用ScrollView对GridView进行嵌套,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Android 中ScrollView嵌套GridView...
    99+
    2023-05-31
    android scrollview gridview
  • 如何在Linux中用Vim对文件进行密码保护
    小编给大家分享一下如何在Linux中用Vim对文件进行密码保护,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Vim 是一种流行的、功能丰富的和高度可扩展的 Lin...
    99+
    2023-06-16
  • 在Nginx下如何对网站进行密码保护
    这篇文章主要讲解了“在Nginx下如何对网站进行密码保护”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“在Nginx下如何对网站进行密码保护”吧!很多时候我们...
    99+
    2024-04-02
  • Android中如何进行绝对音量和相对音量设置
    这篇文章给大家介绍Android中如何进行绝对音量和相对音量设置,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。前言:绝对音量: 手机端不处理音量,只把当前音量告诉耳机,耳机端处理音量。相对音量: 手机端处理,耳机端不确...
    99+
    2023-06-28
  • 如何进行Python进程的守护进程实施
    如何进行Python进程的守护进程实施,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Python进程这一计算机语言在实际的应用中,如果你在实际应用的过程中遇到相...
    99+
    2023-06-17
  • 如何在Android中利用ViewFlippe对视图进行翻转
    本篇文章为大家展示了如何在Android中利用ViewFlippe对视图进行翻转,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。ViewFlipper是Android自带的一个多页面管理控件且可以自动...
    99+
    2023-05-31
    android viewflipper pp
  • 如何在Android应用中对json数据进行解析
    这篇文章将为大家详细讲解有关如何在Android应用中对json数据进行解析,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1、android自带解析 json_btn.setOnC...
    99+
    2023-05-31
    android json 中对
  • Android中怎么对cookie进行处理
    本篇文章给大家分享的是有关Android中怎么对cookie进行处理,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。android 客户端 Cookie处理Cookie,有时也用...
    99+
    2023-05-30
    android cookie
  • 如何进行Java和Python的编程对比
    这篇文章给大家介绍如何进行Java和Python的编程对比,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。因为以前会点Java,现在来看当然是弱爆了。学习Python的需求非常紧迫,所以我想快速学习掌握Python,有没...
    99+
    2023-06-04
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作