Android 黑科技之让进程不被杀掉

2024-06-03 12:18
文章标签 android 进程 科技 杀掉

本文主要是介绍Android 黑科技之让进程不被杀掉,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Android 黑科技之让进程不被杀掉

目前市面上,除了微信和手Q外,都会想尽办法能够保证自己的应用进程不被杀掉,其实鹅厂的不被杀掉不是他们使用了什么黑科技,而是手机厂商给鹅厂做了优化,没办法,谁让现在有人不用鹅厂的东西吗?

不信可以放到 Nexus 手机上,保证当内存紧张的时候,绝B一样杀掉。

回到正题,所谓的黑科技,也就是利用一些不正当的方式,尽最大的可能保留我们的应用的优先级,从而不被轻易杀掉。

Android 进程保持活着,这里有两个层面的意思:

A. 提高进程优先级,降低被杀死的概率

B. 被杀死后,可以被系统重调用起来

进程优先级

这里提到了进程优先级,那么什么是进程优先级呢?

Android 在设计之初,就有考虑到如何能够快速的启动一个应用。所以当退出一个应用的时候,其实这个应用并没有真的被回收,这样如果再次启动,可想而知,会很快就被启动起来。但是,为了新建进程或运行更重要的进程,那么必然需要清除旧进程来回收内存。那么到底哪些重要,哪些可以来回收呢? Android 对此有做一个分类,优先级共划分为5层:

  1. 前台进程

  2. 可见进程

  3. 服务进程

  4. 后台进程

  5. 空进程

其重要性或者优先级也是依次递减,空进程重要性最低。

前台进程

这个比较好理解,最直接的例子就是当前处于前台的 Activity,基本上不会出现你正在操作一个应用的时候,突然间被系统关闭了,除非内存真的低到不行。

那么除了 Activity 外,是否其他的控件也可以是被看作前台呢? Service 也可以,但是前提是这个service 被正在交互的 Activity 绑定,或者 Service 在一开始声明自己是前台 Service(会显示一个Notification给用户,这个在2.3的时代是最普遍的用法,当时notification都不会显示给用户)。最后,正在执行 onReceive() 方法的broadcastReceiver 也会被系统认为是前台进程。

可见进程

和前台进程相比,可以理解为调用了 onPause() ,但是没有执行 onStop() 的 Activity,仍然非常重要。

服务进程

音乐播放器就属于这类,虽然没有和用户交互的操作,但是后台播放音乐仍然是很重要的,所以除非内存不足以维持所有前台进程和可见进程同时运行,否则系统会让服务进程保持运行状态。

后台进程

后台进程对用户体验没有直接影响,系统可能随时终止它们,以回收内存供前台进程、可见进程或服务进程使用。比如调用了 onStop() 的 Activity。

空进程

不含任何活动应用组件的进程。保留这种进程的的唯一目的是用作缓存,以缩短下次在其中运行组件所需的启动时间。

搞清楚了进程的类型,那么接下来就是 Android 系统是怎么来对这几种进程分类,已经又是根据什么规则来判断哪些该杀,哪些不该杀呢?

进程回收策略

这个策略,Android 世界中的名称叫做 Low Memory Killer,我们的应用都是被他给无情的从内存中抹杀了啊!

其实说这个策略,也很简单,系统会根据一个阀值,OOM_ADJ,不同的阀值来触发相应的回收力度。

关于 OOM_ADJ 的说明如下:

Android 黑科技之让进程不被杀掉

红色就是很容易被干掉的进程(OOM_ADJ >=4), 越大越代表不重要。在 Lowmemorykiller 回收内存时,会根据进程的级别优先杀死 OOM_ADJ 比较大的进程,对于优先级相同的进程则进一步受到进程所占内存和进程存活时间的影响。

其实到这里,黑科技是想办法提高进程优先级,减少进程在内存不足等情况下被杀死的概率。

你现在应该知道鹅厂的应用为什么不会被杀掉了吧?因为手机厂商把他们都加入到了系统进程中。

明白了原理,下面来看我们的黑科技。

利用 Activity 提升权限

  • 设计思路

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

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

  • 使用范围

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

  • 具体实现

    Android 黑科技之让进程不被杀掉

    Android 黑科技之让进程不被杀掉

    Android 黑科技之让进程不被杀掉

利用 Notification 提升权限

  • 设计思路

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

  • 实现方式

    本身前台 servcie 的使用不复杂,但是因为 4.x 版本后会强制显示 Notification,因此这里需要会钻一个 Notification 的漏洞,即在 Service 内部再实现一个service,然后此内部service发送一个和前台 Servcie ID 相同的 Notifcation,然后在自己结束自己,这样 Notification就被从 Notification manager 中移走了,不过在 Android 7.1 中,Google 已经堵上了这个漏洞,但是 7.1 的普及至少还有一年,所以还是可以继续使用这个方式,代码的具体实现可以百度.

被杀死后再被重启

所谓道高一尺魔高一丈,系统虽然想尽办法来限制应用,但是总能利用系统的一些功能来为我所用。

  • 使用系统广播来重启

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

    但是这个方法目前是被 Google 堵的越来越死,因为基本上现在很多的广播都不再支持静态注册了,但是你仍然可以尝试看看,特别是老的 Android 版本都还可以使用。

  • 使用第三方应用广播

    相比第一个,这个是目前仍然可以使用且短期 Google 从源码上很难堵上的方案。

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

  • 利用 JobScheduler 机制

    Android5.0 以上版本提供了 JobScheduler 接口,系统会定时调用该进程以使应用进行一些逻辑操作。

  • 利用账号同步机制拉活

    Android 系统的账号同步机制会定期同步账号进行,该方案目的在于利用同步机制进行进程的拉活。

其他还有一些技术之外的措施,比如说应用内 Push 通道的选择:

  1. 国外版应用:接入 Google 的 GCM。

  2. 国内版应用:根据终端不同,在小米手机(包括 MIUI)接入小米推送、华为手机接入华为推送;

其实,从规范上来讲,应用应该遵从编码规范,但是在实际项目的时候,PM 是不会和你讨论这个,用户也不会想知道这些,所以苦逼的我们只能不断的去钻空子啊!!!

这篇关于Android 黑科技之让进程不被杀掉的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1026961

相关文章

Windows的CMD窗口如何查看并杀死nginx进程

《Windows的CMD窗口如何查看并杀死nginx进程》:本文主要介绍Windows的CMD窗口如何查看并杀死nginx进程问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录Windows的CMD窗口查看并杀死nginx进程开启nginx查看nginx进程停止nginx服务

Java进程CPU使用率过高排查步骤详细讲解

《Java进程CPU使用率过高排查步骤详细讲解》:本文主要介绍Java进程CPU使用率过高排查的相关资料,针对Java进程CPU使用率高的问题,我们可以遵循以下步骤进行排查和优化,文中通过代码介绍... 目录前言一、初步定位问题1.1 确认进程状态1.2 确定Java进程ID1.3 快速生成线程堆栈二、分析

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

Python多进程、多线程、协程典型示例解析(最新推荐)

《Python多进程、多线程、协程典型示例解析(最新推荐)》:本文主要介绍Python多进程、多线程、协程典型示例解析(最新推荐),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定... 目录一、multiprocessing(多进程)1. 模块简介2. 案例详解:并行计算平方和3. 实现逻

C#通过进程调用外部应用的实现示例

《C#通过进程调用外部应用的实现示例》本文主要介绍了C#通过进程调用外部应用的实现示例,以WINFORM应用程序为例,在C#应用程序中调用PYTHON程序,具有一定的参考价值,感兴趣的可以了解一下... 目录窗口程序类进程信息类 系统设置类 以WINFORM应用程序为例,在C#应用程序中调用python程序

Android NDK版本迭代与FFmpeg交叉编译完全指南

《AndroidNDK版本迭代与FFmpeg交叉编译完全指南》在Android开发中,使用NDK进行原生代码开发是一项常见需求,特别是当我们需要集成FFmpeg这样的多媒体处理库时,本文将深入分析A... 目录一、android NDK版本迭代分界线二、FFmpeg交叉编译关键注意事项三、完整编译脚本示例四

Android与iOS设备MAC地址生成原理及Java实现详解

《Android与iOS设备MAC地址生成原理及Java实现详解》在无线网络通信中,MAC(MediaAccessControl)地址是设备的唯一网络标识符,本文主要介绍了Android与iOS设备M... 目录引言1. MAC地址基础1.1 MAC地址的组成1.2 MAC地址的分类2. android与I

Android 实现一个隐私弹窗功能

《Android实现一个隐私弹窗功能》:本文主要介绍Android实现一个隐私弹窗功能,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 效果图如下:1. 设置同意、退出、点击用户协议、点击隐私协议的函数参数2. 《用户协议》、《隐私政策》设置成可点击的,且颜色要区分出来res/l

Android实现一键录屏功能(附源码)

《Android实现一键录屏功能(附源码)》在Android5.0及以上版本,系统提供了MediaProjectionAPI,允许应用在用户授权下录制屏幕内容并输出到视频文件,所以本文将基于此实现一个... 目录一、项目介绍二、相关技术与原理三、系统权限与用户授权四、项目架构与流程五、环境配置与依赖六、完整

Android 12解决push framework.jar无法开机的方法小结

《Android12解决pushframework.jar无法开机的方法小结》:本文主要介绍在Android12中解决pushframework.jar无法开机的方法,包括编译指令、框架层和s... 目录1. android 编译指令1.1 framework层的编译指令1.2 替换framework.ja