探讨安卓应用5.0及以下,6.0之上保活可能性

   在写这篇博客之前,我已经做了15天了安卓保活,在查阅了网上所有的保活博客和博主写的demo进行测试,我可以的出一个结论,就是安卓5.0以下可以有多种手段保活,证明是可以成功了,5.0之上保活很难实现,比如有些大厂的机子为提高手机使用时间,针对手机耗电这块做了很深的定制,这就到6.0以上系统根本很难实现保活,简单的用户清除内存就能把应用杀死,典型的机子就是华为。

    其实在接到保活这个任务的时候,我就知道不能做,但是公司有这样的需求,无奈只能研究,所以告诫在看到这篇博客的朋友门,实在没有必要在这个保活的任务上纠结,如果可以的话尽量的告诉上级6.0以上保活不要考虑了。我们之所以会提到保活就是我们的应用需要在完全退出的时候,还能接收到推送消息,这个需求还是可以做的,目前的思路就是,集成各大厂商渠道,比如,小米推送,华为推送,魅族,友盟推送,具体逻辑就是,那种手机用那种推送,其他的用友盟,其中友盟拉起可以说是做的相当的可以。

下面我开始说明我保活的几个方向,大概有十几种:

一个像素activity

这个思路在安卓5.0很流行,7.0之后就失效

其整个逻辑就是在手机屏幕黑屏时,我们启动一个1像素的Activity,其占用内存很小毕竟只有1像素嘛,无形中减小了内存的回收几率,在屏幕亮的时候就关闭该页面。

原理:1像素保活就是在程序退出后将进程优先级提高 减少被系统杀死的几率

灰色保活

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

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

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

测试结果:5.0以下才有效果,5.0之后这个bug已经被修复

引导用户收到加入白名单

引导用户将我们的应用加入自启动管理,应用加入不省电策略,也就是我们说的白名单。加入白名单后我们的服务可以也可以在后台运行,但是这个效果只能在部分机型中有效果,华为6.0以上手机,经测试demo退出后服务被杀死,无法在后台运行。

原理:应用加入白名单,拥有自启动权限,能够在后台运行,不被用户清理内存杀死。

第三方推送拉起

这个思路目前是接入第三方推送附带的一个功能,拉起应用的推送服务,附带的拉起我们应用,

原理:相互拉起,提高app存活率

Native进程保活5.0以下

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

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

测试结果:5.0以下保活效果不错,但是在5.0之上用户手动清除内存还是会应用还是无法重新启动

Native进程保活5.0以上

原理:无论在windows还是linux都会有一套文件的进程同步机制,一个进程可以给一个文件上锁,操作完了之后再解锁,其他进程如果担心同步问题,会首先检查一下文件是否有锁,如果有锁,代表别人正在操作,就会延迟对文件的操作。那么当一个进程挂掉,他给文件加的锁也自然会消失,然后我们就可以监听到这个进程挂了,这个时候我们可以用拉起来这个进程。

测试结果:运行demo发现这个思路行不通,demo还是被系统杀就死,6.0之后系统查更彻底

双进程守护

双进程守护:应用进程和创建一个新的进程,通过AIDL的接口则可以实现跨进程间通信,A进程死亡的一瞬间B进程就拉起A进程,这个两个进程都是相互拉起,通过双进程守护来解决这个Android应用保活的。

原理:双进程之间相互通讯,相互拉起。

测试结果:华为7.0一杀就死,5.0之后这个种方法在定制化高的手机上失效

利用 JobScheduler机制拉活

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

原理:JobScheduler机制就是开启一个任务,这个api不会很耗电,用来执行一些任务调度的,我们可以用这个类来开启双进程

测试结果:demo加入自启动过后这个机制在小米6.07.0运行良好,在华为手机运行失败

写一个类继承JobService,在onstart里声明创建JobScheduler对象,并设置多就执行一次和开机自启动,这样就能确保及时在息屏状态,也能够执行重启进程,所以我们在JobServiceonStopJob方法里判断我们的进程是否被回收了,如果被回收了就重启进程

利用系统广播拉活

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

原理:Android系统的账号同步机制会定期同步账号进行,可以利用这个机制,来拉起我们的应用

测试结果:在某些定制化高的手机中6.0之后已经修复了这个bug,最新 Android版本(Android N)中系统好像对账户同步这里做了变动,该方法不再有效。

其他保活方式

1.接入Google GCM,需要翻墙

2. so注入系统进程(这种方式去做进程常驻需要获得root权限),目前这种方法,网上提供demo和资料只能针对部分机子有效,而且不能保证稳定性。

3.厂商白名单

其实在查了这么多关于保活的资料和demo的测试,自己也写了一个demo,5.0一下,5.0,还有小米7.0保活成功,华为6.0之上系统保活失败,其他真的就没有什么思路了,可能是自己能力有限,我觉得可能性比较高的方向就是native层,能力有限无法做到对底层接触还是过少

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值