美文网首页
加强APP存活时间

加强APP存活时间

作者: 聪聪的豆芽 | 来源:发表于2016-10-26 15:43 被阅读134次

    参考:http://www.jianshu.com/p/63aafe3c12af#

    现在APP有这样一个需求:当APP缩后台后,转去使用其他APP,再回来的时候APP是重新启动!现在要做的是尽量避免这个事情!

    What

    问题出现于现有App内有一个开屏页,也就是每次进入都会有的那个闪屏页。那么就有两个思路,一个是把开屏页去掉!一个是提升APP的存活时间,也就是使APP的回收级别提高!

    How

    提升APP存活时间大致有三种方法:1、黑色保活,2、白色保活,3、灰色保活:

    黑色保活:利用不同的APP之间进行广播唤醒,可以使第三方APP也可以是系统的APP

    白色保活:启动前台Service

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

    黑色保活

    1、开机、网络切换、拍照、拍视频的广播唤醒app,但是从Android N取消了拍照、拍视频、网络切换等广播。而开机广播再有的第三方rom也去掉了。

    2、接入SDK唤醒app。比如你介入了微信sdk会唤醒微信,支付宝sdk会唤醒支付宝。或者有的推送sdk也会唤醒app。

    3、其他app唤起同家公司app。比如,腾讯系app唤醒腾讯系其他产品。

    白色保活

    启动前台的Service进程。也就是说在保活的进程中启动一个Service,然后Service中启动一个通知Noification,比如QQ音乐,360通知栏等等。

    灰色保活

    也是启动一个前台的Service进程,但是与普通的启动方式区别在于,通知栏不会出现一个Notification,看起来就如同运行着一个后台Service进程一样。这样的话就使得自身进程优先级高于普通后台进程的。

    具体可参考原文:http://www.jianshu.com/p/63aafe3c12af#

    再者说为什么QQ进程不死,我也曾认为存在这样一种技术。可惜我把手机root后,杀掉QQ进程之后就再也起不来了。有些手机厂商把这些知名的app放入了自己的白名单中,保证了进程不死来提高用户体验(如微信、QQ、陌陌都在小米的白名单中)。如果从白名单中移除,他们终究还是和普通app一样躲避不了被杀的命运,为了尽量避免被杀,还是老老实实去做好优化工作吧。

    Why

    首先进程回收是有个优先级的,优先级从高到低是:

    1. 前台进程(Foreground Process)
    2. 可视进程(Visible Process)
    3. 服务进程(Service Process)
    4. 后台进程(Background Process)
    5. 空进程(Empty Process)

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

    其他方法的一些参考

    https://www.zhihu.com/question/29826231
    把你的应用做到QQ那么大,那么有用户需求,不需要流氓,所有的工具软件都会把它加入白名单。

    1、Service设置成START_STICKY,kill 后会被重启(等待5秒左右),重传Intent,保持与重启前一样

    2、通过 startForeground将进程设置为前台进程,做前台服务,优先级和前台应用一个级别​,除非在系统内存非常缺,否则此进程不会被 kill(本文类似方法)

    3、双进程Service:让2个进程互相保护,其中一个Service被清理后,另外没被清理的进程可以立即重启进程

    4、QQ黑科技:在应用退到后台后,另起一个只有 1 像素的页面停留在桌面上,让自己保持前台状态,保护自己不被后台清理工具杀死

    5、在已经root的设备下,修改相应的权限文件,将App伪装成系统级的应用(Android4.0系列的一个漏洞,已经确认可行)

    6、Android系统中当前进程(Process)fork出来的子进程,被系统认为是两个不同的进程。当父进程被杀死的时候,子进程仍然可以存活,并不受影响。鉴于目前提到的在Android-Service层做双守护都会失败,我们可以fork出c进程,多进程守护。死循环在那检查是否还存在,具体的思路如下(Android5.0以下可行听说耗电量增加):①用C编写守护进程(即子进程),守护进程做的事情就是循环检查目标进程是否存在,不存在则启动它。②在NDK环境中将1中编写的C代码编译打包成可执行文件(BUILD_EXECUTABLE)。③主进程启动时将守护进程放入私有目录下,赋予可执行权限,启动它即可。

    7、联系厂商,加入白名单

    相关文章

      网友评论

          本文标题:加强APP存活时间

          本文链接:https://www.haomeiwen.com/subject/rwgduttx.html