一、前言

我们在做Android应用的时候都知道,必须要有一套好的保活方案,这样应用的push到达率高,应用的活跃度也就很高,我们平时也可以发现很多应用我们明明已经关闭了,但是还是可以接收到push消息,或者ps查看进程还是存在的。

当然这里就有很多方案做这件事了,从最早的Java层中接受各种事件和广播等时机唤醒我们的应用,在到Native层的进程保活都是很好的方案,但是随着Android系统的更新,Google也担心用户手机中的一些应用关闭失败导致手机耗电很快。所以也给出了很多策略让保活方案一度受到很大的障碍,同时国内的一些手机厂商更是厉害,直接forcestop操作,这种操作理论上是最终的杀死进程方案了。包括小米,OV等厂商都是这么做的,但是有一个问题就是像微信中及时接受消息的应用如果系统把他强杀之后接收不到消息,用户也是要疯掉的,所以系统厂商会给出一个白名单有一些应用是不会强杀的。

当然现在还有很多应用在一起组成了一个拉活联盟 ,就是你的应用可以把我的应用唤醒,我的应用可以把别人的应用唤醒,只要在这个联盟里面的应用都可以相互唤醒和被唤醒,这样如果你手机中如果装了这些联盟中的应用,只要一个没有别杀死那么联盟中的成员应用都会被唤醒。

还有一种方案是因为我们知道微信和QQ这样的及时应用很多厂商加了白名单 ,也就是这些应用不会被杀死的,那么他们应用肯定会在指定时机中发出一些特定广播,这个需要反编译去看看他们内部到底有哪些广播了,我们可以监听这些广播,只要微信不死,在一定时间内发出了我们注册了他的广播,我们也有可能被唤醒。当然还有很多方案比如网上很多的MarsDaemon框架,不过这个框架对于小米系统来说几乎是失败的。所以本文就针对于小米手机来一个全新的解决方案。

二、分析小米杀进程原理

首先我们看看小米手机他的杀进程方案是啥,我们知道可以按系统的多任务菜单就可以很方便的杀死全部进程或者全部进程了:

frc b274bdbc157e9a3fb2b6c65eb3e52149 - Android应用保活方案的另类出路,让你应用长生不老
frc a8be16436efc935ae83ec88bfe746a56 - Android应用保活方案的另类出路,让你应用长生不老

那么我们可以找到这个按钮,然后查看指定逻辑,我们这里可以通过UI工具找到id,然后去搜索,但是到哪搜索呢?

其实这里有个知识点就是系统中的界面以及系统应用一般都在/system/priv-app/这个目录下,我们可以直接进入这个目录查找指定应用,这里需要注意的是我们可能很容易认为应该是桌面应用也就是MiuiHome.apk 这个应用,但是通过反编译查看却找不到我们想要的东西,然后就发现了还有一个系统UI应用MiuiSystemUI,然后在弄出来反编译就发现了这个地方:

frc f7f56f05155b1731a6132c55ba36d3e1 - Android应用保活方案的另类出路,让你应用长生不老
frc 2c08b357244fc7134c593f378b7d860b - Android应用保活方案的另类出路,让你应用长生不老

我们通过思考一下,我们看到的是最近正在使用的应用,那么我们想系统应该出现这个界面肯定也需要调用这个方法获取当前正在运行的应用:getRecentTasks ,我们可以全局搜索这个信息,看到的确有一些内容,通过排查发现有一个重要的类:RecentTasksManager ,然后到这个类查看信息:

frc 9500c2f0ff1ac4655e06bc2592f86e5e - Android应用保活方案的另类出路,让你应用长生不老
frc 1d20625b6d2976461b07eff61ad64c44 - Android应用保活方案的另类出路,让你应用长生不老

我们点击进入查看方法:

frc 75413b9d6652a038a85a69b12156ee68 - Android应用保活方案的另类出路,让你应用长生不老
frc 4d74cd384defae40148872e739cced6c - Android应用保活方案的另类出路,让你应用长生不老

这里看到内部会用对应用做分类,后面的杀死的方式也是不一样的:

frc 3685e171acc8170a031bd186fb584291 - Android应用保活方案的另类出路,让你应用长生不老
frc cbc2282a595d9d02e4a51726cf3107e9 - Android应用保活方案的另类出路,让你应用长生不老

这里看到杀死进程的方法:

frc 801c18426a2160ef9a3720ca06aef5ad - Android应用保活方案的另类出路,让你应用长生不老
frc 297016b558ff39e0e3d7e058d5db8edc - Android应用保活方案的另类出路,让你应用长生不老

这里看到有很多哦判断,如果在这个判断内就走系统的强杀,也就是上面说的MarsDaemon框架是可以保活的,如果不在这个判断内就走了系统最终杀死方案,这个是最强的杀进程方案,目前没有好的保活方案可以解决。

我们在来看一下那个判断,可以看到在之前的分类中如果强杀列表为空,或者是系统应用,或者是应用开启了自启动权限就不会强杀了,通过后面的一个判断的方法名我们可以猜测这个是自启动权限功能,可以去系统代码查看,这时候就需要去/system/framework/framework.jar 中查找系统类了:

frc ee9fd7ce9426659f3a86c59b44d0db1c - Android应用保活方案的另类出路,让你应用长生不老
frc 37525db3aa9222d733751f0fa4039b9f - Android应用保活方案的另类出路,让你应用长生不老

这里我们把系统类的framework.jar 弄出来解压出dex直接打开即可:

frc c0a2569d93946a127d721588b65523fa - Android应用保活方案的另类出路,让你应用长生不老
frc c59a32da171c3a850ebe9f6ee39bb435 - Android应用保活方案的另类出路,让你应用长生不老

看到这里是调用系统的APP_OPS 服务,所以我们去我们的项目中用反射的方式调用这个方法:

frc 5393db8231d2f3d0938fdb7af1d2fb91 - Android应用保活方案的另类出路,让你应用长生不老
frc cf7d29afceb903c09e352d2bfcc02194 - Android应用保活方案的另类出路,让你应用长生不老

然后运行项目,报了权限错误:

frc cb97fe5eceb2210bef0f35b32256e23f - Android应用保活方案的另类出路,让你应用长生不老
frc 3c586401780449c219345376904df4fa - Android应用保活方案的另类出路,让你应用长生不老

我们在AndroidManifest.xml 中添加这个权限即可,然后运行可惜没什么效果。所以就换个思路,既然要开启应用的自启动权限,对于小米手机我们知道在小米安全应用中管理的,我们同样去/system/priv-app/ 这个目录下找到这个应用:

frc 7ab3fb8b3fab25515b6dfa427579b6cd - Android应用保活方案的另类出路,让你应用长生不老
frc 536dd01b46bdc17298587af8237ebe1c - Android应用保活方案的另类出路,让你应用长生不老

页面如下:

frc aa76e9c197531d3ce63614e82ec0c547 - Android应用保活方案的另类出路,让你应用长生不老
frc 90017b85e3b3d8bac5f6492bfc65fabd - Android应用保活方案的另类出路,让你应用长生不老

然后弄出来apk之后用Jadx打开apk查看,同时我们可以用adb shell dumpsys activity top 命令查看当前页面的activity信息:

frc 52d2ff162ac02a5b90e524267a443a21 - Android应用保活方案的另类出路,让你应用长生不老
frc fbac3229ea62497e5558811a067fe3e5 - Android应用保活方案的另类出路,让你应用长生不老

然后去搜索这个类,直接看到那个开启的开关逻辑代码:

frc fb01c82e5186d454e63c9c4881ec406a - Android应用保活方案的另类出路,让你应用长生不老
frc 07ee8fda089570451a48eb15305d4f90 - Android应用保活方案的另类出路,让你应用长生不老

逐个排查找到这个类中:

frc f80ac44ce716622e5191e2564567a028 - Android应用保活方案的另类出路,让你应用长生不老
frc ad822995b15284e5d389fe77dc625fbc - Android应用保活方案的另类出路,让你应用长生不老

继续往里面看:

frc c6cbeaf5a7de41638d78ff8ec012ee4a - Android应用保活方案的另类出路,让你应用长生不老
frc f6bb82822eeb3f68ed9ec25caeb1370f - Android应用保活方案的另类出路,让你应用长生不老

这里看到了重要信息就是写入CP了,有了uri信息,看到这里写入三个字段信息,查看他的uri信息:

frc 790df2a412f95606d674dd8d96950612 - Android应用保活方案的另类出路,让你应用长生不老
frc c70f047f2165db0df49598bde4b22ed2 - Android应用保活方案的另类出路,让你应用长生不老

到这里就简单了,我们在应用中直接利用uri信息写入值,当然需要把我们的应用自启动开启:

frc 0ceafe526da39029002961d4ce758745 - Android应用保活方案的另类出路,让你应用长生不老
frc de2dbe14a1f27458d9afbff01b207f13 - Android应用保活方案的另类出路,让你应用长生不老

然后运行看效果:

frc 153b9ec4e1871a8b3f15c0eb04a68297 - Android应用保活方案的另类出路,让你应用长生不老
frc 2b58b748ddb55e25edc97efdb29f5a3b - Android应用保活方案的另类出路,让你应用长生不老

有报错信息,提示缺少权限我们添加即可,运行看看效果:

frc 29a129b81d75ab94e3ec36f0a6cc000b - Android应用保活方案的另类出路,让你应用长生不老
frc 35fe6464b74d856a805e5296ebd4c7b3 - Android应用保活方案的另类出路,让你应用长生不老

三、结果出乎意料

到这里我们就操作成功了,这里就结束了吗?
显然不是。因为这里有一个很大的问题,细心的同学发现了,如果这个真的不用root权限就这么简单的开启那小米系统也太不安全了吧,但是我手中的这台小米4的确是可以的,但是用了其他的小米手机发现确还是提示权限不足,其实用我们的脚指头想一想也是正常的,这里肯定有问题,如果这一点都可以做到的话,那么小米系统真的是太不安全了,那为什么我的手机可以呢?因为我的手机当时自己刷了网上第三方的小米ROM,这个ROM应该是被改过了,只要是有权限验证的地方都可以免root过掉。那么这里我就被我的手机耍了一次,而你们却被我耍了一次。

四、保活的另类出路

我们知道现在很多应用都想开启自启动权限,这样应用就可以长生不老了,不过通过这一次分析小米系统源码可以发现只要有了自启动权限之后应用首先是不会杀死,然后也可以重启,真的是完完全全的长生不老了,那么其实权限这个事情我们肯定是做不了了。

所以我们可以想其他的方案,比如我们可以引导用户去开启 ,这个就要看产品怎么去很好的引导用户了,比如有一个提示说:开启自启动可以更好的使用本应用此类消息。

这样有了自启动权限之后可以做很多事情了,但是不是所有的用户都愿意去开启的,那么我们怎么让我们的应用长生不老呢,难道真的没办法了吗?办法其实还是有的,我们可以通过上面分析系统源码的时候看到:

frc 7e23bd854f5cd02625bfbfe15c65ef76 - Android应用保活方案的另类出路,让你应用长生不老
frc 61407fa6da16becf28e8a05be9e66b4b - Android应用保活方案的另类出路,让你应用长生不老

当我们点击系统菜单键出现系统多任务界面,然后点击清空内存,其实系统这时候会获取当前正在运行的程序,并且获取他们的页面截图用于展示,而对于正在当前运行的程序是不会强制杀死的,也就是TopActivity 的程序是不会杀死的。

那么我们是否可以利用这一点来做呢?首先我们可以监听系统的多任务菜单键,这个就是动态监听系统一个广播即可,然后我们监听到之后就立马启动我们自己的一个保活Activity这里就叫做一像素Activity ,但是这个Activity需要具备以下三点:

第一点:因为一像素对于肉眼来看几乎可以忽略,所以需要在这个Activity中设置大小:

frc 547e2694714f546ea7b0aaa42a4da1a7 - Android应用保活方案的另类出路,让你应用长生不老
frc 660468bcfc6fe49a0dfede626aee41e1 - Android应用保活方案的另类出路,让你应用长生不老

第二点:不能让这个Activity出现在多任务中,不然会被用户发现就恶心了,这里可以在xml中设置一个属性即可:

frc 149f16274bb9666bc508765d75451045 - Android应用保活方案的另类出路,让你应用长生不老
frc 5489653a5bcea9485fbf7c26b79ce96b - Android应用保活方案的另类出路,让你应用长生不老

第三点:启动这个Activity速度要非常快,也就是要赶在系统获取正在运行的Task之前启动起来,不然就无效了,所以按照正常的系统启动Activity流程会很慢的,这里用反射启动Activity,这个技术在之前的文章已经介绍了,这里不多说了,这样启动的话保证在10ms之内完成,这样就可以赶在系统获取Task之前了:

frc 816ce44ee11d6f31057d85e1f2f579e1 - Android应用保活方案的另类出路,让你应用长生不老
frc 321a33528128a17e6417b89620d4ee55 - Android应用保活方案的另类出路,让你应用长生不老

第四点:在启动之后要在一定时间内把一像素Activity关闭,不然最顶端的一像素Activity会夺取屏幕的触控焦点,用户点击清空内存就无效了,用户会癫狂的:

frc 4e8821bc5f9b7ee5d14d712b464a4ac5 - Android应用保活方案的另类出路,让你应用长生不老
frc 9d25217f9a8e454d87a610d9900d8fc4 - Android应用保活方案的另类出路,让你应用长生不老

有了这四点,这个一像素Activity就可以让我们的应用长生不老了:

frc 061516eccbc4159acd82ec7950bc529b - Android应用保活方案的另类出路,让你应用长生不老
frc 1926ce9ed3f4a2909577ac05552e4dac - Android应用保活方案的另类出路,让你应用长生不老

当然这个可能有手机适配问题,大家可以看代码进行项目的适配。
这种方式还有一个最大的好处就是,我们知道Android8.0之后系统不允许应用在后台静默启动一个服务了,如果要启动服务就要告诉用户,让用户可以看到,不然就报错,大家可以自行搜索相关内容:

frc af5c843e966ad73fe21c307af64fa046 - Android应用保活方案的另类出路,让你应用长生不老
frc bb012d7bc65af449e33f9e0b7bba1260 - Android应用保活方案的另类出路,让你应用长生不老

其实这对于用户来说是好事,这样对设备有好处,不然后台启动了一大堆服务在跑,耗电耗性能。如果用了这个一像素保活方案的话那么我们没有启动一个服务,也就不会有这种限制了,同时也让我们的应用长生不老了。

五、保活方案总结

好了到这里我们就把小米的保活方案介绍完了,下面就来总结一下保活方案吧:

第一、首先是网上有很多各种保活方案主要是监听广播等,而现在很多应用采用了MarsDaemon框架方案,这个框架的确还是有用的,对于某些指定手机。

第二、同时现在有一个叫做保活互助联盟,比如支付宝,微信,头条等都在里面,只要用户手机中安装了联盟成员的应用,只有有一个成员的应用活着就会把其他已经被杀死的联盟成员应用都唤醒起来。而我们知道像微信这类即时通讯工具一遍很多手机厂商都会加上白名单也就是不会强杀的,那么如果我们通过反编译微信找到他内部一个不需要权限广播,微信不死我们监听他的某个广播就可以起来了,前提是你能找到这个广播。

第三、上面也说了,不管是哪种保活方案,最终的归途都是不好的,因为谷歌慢慢的优化系统对于后台启动服务的操作是不赞同的,所以后面随着系统升级很多保活方案几乎都要挂了,而本文介绍的另类处理方式的一像素保活方案可以暂时解决这样的问题,当然暂时只是适配了小米手机。

第四、前面分析了小米手机或者其他手机也是类似就是如果开启了自启动权限就可能长生不老,所以如果在产品中用一种比较友好的方式去引导用户开启这个权限也是未尝不可的。

通过上面的文章,我相信你已经更了解了Android应用保活,但是这还远远不够;在项目中会遇到各式各样的问题,现实情况可能没有demo这么简单;不过没关系,大家转发加关注,我这里也有也一份关于Android进阶的详细教程,有兴趣的小伙伴可以发简信给我,或者如果在学习过程中遇到任何问题,都可以留言问我。同时,我也非常欢迎大家互相交流技术,共同成长~

学习分享,共勉

题外话,我从事Android开发已经五年了,此前我指导过不少同行。但很少跟大家一起探讨,正好最近我花了一个多月的时间整理出来一份包括不限于高级UI、性能优化、移动架构师、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter等全方面的Android进阶实践技术,今天暂且开放给有需要的人,若有关于此方面可以转发+关注+点赞后领取,或者评论与我一起交流探讨。

frc a4a1a3da54e9fde8e392425bdd472832 - Android应用保活方案的另类出路,让你应用长生不老
image
frc 08cdf75e5e296cbd34dbe657bde63b0c - Android应用保活方案的另类出路,让你应用长生不老
image

资料免费领取方式:转发+关注+点赞后,加入点击链接加入群聊:Android高级开发交流群(818520403)即可获取免费领取方式!

重要的事说三遍,关注!关注!关注!

本文部分内容来源于网络,侵权删。

Android应用保活方案的另类出路,让你应用长生不老