大家好,欢迎来到IT知识分享网。
如何让你的app一直在运行状态呢?
默认情况下,不做任何跨进程部署配置的话,每个android app运行在单独一个虚拟机上,每个虚拟机对应一个进程。当app被系统回收或者是被用户主动杀掉(通过app管理软件),进程就彻底退出了。
在有些场景,app所在的进程退出了,我们希望还能做一些操作。比如,app被卸载后(卸载会先退出运行),我们希望跳转浏览器做一些卸载原因的调查问卷;或者为了优化体验,提高app热启动速度,再比如,有些监控的app,我们希望一直在运行,否则可能数据不准确,这就需要app所在进程退出后能自我启动。
为了做到app停止运行状态的监控和执行回调,典型的解决方案就是多进程相互守护。
去你的手机上瞧瞧,设置-应用管理-运行中 ,有没有发现,支付宝,QQ,微信等等App同时都有两个进程在运行,有木有。
multiprocess
双进程相互守护
双进程A和B相互守护,当A进程检测到B进程退出时,A进程重新启动B进程,同理当A进程退出时,B重新启动A进程。进程的运行状态的检测是实现进程守护的关键点,比较容易想到的方案有:
- 通过轮训的方式查询远端进程的状态
- 通过发送心跳包来看是否能接受应答,无应答,远端进程可能已经退出
- 在Application生命周期终止时,也就是onTerminate方法里发送广播通知对方自己即将灭亡
通过轮训的方式,只要通过ps命令查询状态,无需A和B做进程间通信;心跳包应答检测的方式需要通过socket或者别的IPC机制来做通信。
守护进程可以是一个运行android app的进程(Dalvik进程),也可以是一个linux的原生进程,如果是Dalvik进程,当app被卸载时,进程会被退出,字节码被移除,无法再运行任何逻辑比如跳转浏览器页面。
如果守护进程是linux系统里fork一个新的进程,与app不在同一个进程空间,当app被关闭或者杀掉或者卸载的时候,不会影响守护的运行状态,也就是说守护还是处于运行状态,可以执行相应操作。因此守护可以监控app的运行状态,发现app停止运行时,可以发送命令启动app进程,保证app的生存,这对某些系统监控的app来说至关重要。而且linux上的进程,通过android上的PackageManger获取不到,也不会在app管理软件的运行软件之列,基本上不会被杀掉,守护本身可以相对可靠的生存。
本文介绍一下,如何在linux 上fork一个原生进程来守护Dalvik app的进程。
linux原生进程守护
介绍几个linux下的几个api
守护流程图
守护流程图
守护的程序代码
run_service的实现
编译成功后生成xxx,重命名为xxx.so,把文件拷贝到libs下,这样安装后该文件会被同动态库一起拷贝到data/data/app_package目录下,编写拷贝和chmod相关逻辑的代码,大概流程如下
- path = “/data/data/” +packageName; // 安装后的app路径
- 执行shell命令:dd if= path+lib/xxx.so of=path/xxx ;//拷贝到app路径下,重命名为xxx
- 赋可执行权限 chmod 777 path/xxx;
- 运行可执行文件 path/xxx -p process_name -a pkgname ..(别的参数)
需要注意的一点:
这里的操作都是通过执行shell来完成的,需要先cd到app 路径下,才会有读写权限。
编好代码打包测试时,通过app管理界面停止app的运行,看看app是否会被重新启动。
参考
http://www.cnblogs.com/caosiyang/archive/2012/06/25/2560976.html
http://blog.csdn.net/cashey1991/article/details/7942809
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/26640.html