Android运行时Crash自动恢复框架:Recovery
App Crash的恢复,这个想法很早之前就有,目前有些时间就实现了一把,主要是对App运行时发生Crash后,对Activity的堆栈和数据进行恢复,或者重启应用,或者重启并清空缓存,避免因本地的数据类型或格式错误而导致App在读取时一直Crash,Debug模式还包括Crash信息的显示和保存,便于在开发、测试时查看相应CrashInfo。
Crash的处理
对于应用的Crash,一般的做法我们往往都是实现个自定义UncaughtExceptionHandler,而这个自定义的CustomUncaughtHandler我们一般都用于捕捉Crash信息进行上报和监控是否发生Crash,还有一个作用就是可以屏蔽系统默认的Crash对话框,也就是拦截Crash后不把系统默认的UncaughtHandler设置进去,而是直接进行KillProcess,这个过程就是屏蔽了系统的默认Crash处理流程,原因是系统的处理其中在AMS的crashApplication()中会执行这么一段代码:
Message msg = Message.obtain();
msg.what = SHOW_ERROR_MSG;
HashMap data = new HashMap();
data.put("result", result);
data.put("app", r);
msg.obj = data;
mUiHandler.sendMessage(msg);
发送一个显示Dialog的消息,之后便创建一个AppErrorDialog进行显示。
当然还有另外一种屏蔽系统默认ErrorDialog的方法,就是对AMP进行Hook,拦截handleApplicationCrash()方法后进行KillProcess,这样的话永远都将不会出现系统默认对话框,即使把系统默认的设置进去了,这个方法建议App内对AMP进行了Hook的做,其它App反而只为实现这个小功能而进行Hook成本太高,还是用自定义的做法进行屏蔽。
Recovery
Crash处理流程
对于Recovery,在应用发生Crash时,会进入一个Recovery界面,在该界面可以进行界面的恢复、应用的重启,或进入debug模式进行Crash信息的查看与保存
接入
地址: https://github.com/Sunzxyong/Recovery/blob/maste
RecoveryActivity
在应用发生Crash后,将进入RecoveryActivity界面
ActivityStack的恢复
对于恢复界面,默认是恢复整个Activity的堆栈,以便保护用户之前的数据
当应用在前台时崩溃无非就三种:
1、界面一创建就崩溃,可能在onCreate等方法中读取数据造成的Crash
2、界面创建且绘制完成正常显示,在用户执行某个操作,如点击按钮执行某个操作等造成的Crash
3、其它异步线程、服务等在后台执行任务时导致的Crash
上面的情况都应恢复绘制完成后的界面,也就是栈顶Activity是在Crash之前用户所看到的界面,而之前创建且未销毁的Activity也应该进行恢复。
当应用在后台时:
1、进程未挂,无非就是异步线程、server等后台任务发生异常时导致的Crash
2、进程已挂,进程被360等工具杀死了,常见的是push过来了然后唤起App进程,在解析push信息时候导致Crash
上面的情况App在后台时导致的Crash,Recovery提供了一个参数(recoverInBackgroud),用来设置是否在后台Crash时进行恢复。
ActivityStack恢复的操作,都是先恢复栈中的Activity,无Activity时则重启应用
主页的回退
在进行恢复Activity时,如果只是恢复栈顶Activity,当用户在这个界面不进行跳转操作而是直接按返回键,这将导致直接退出程序,所以对于这个情况应该是回退到应用的主页,Recovery中有个参数mainPage,如果设置了就表示需要回退到主页,没有设置则不进行回退
这个过程中涉及到获取App内Activity栈内的数量和栈底Activity,是开发人员应该都知道获取这两个信息是通过getRunningTasks来获取,不过可惜,在5.0以后Google对权限进行了收敛,目地是保护App的信息安全,这个方法在5.0以后将失效,所以需要另外一种方法进行兼容,于是乎看6.0源码又发现Google在5.0收敛了整个权限,导致本App的都获取不到,但是在6.0又放出来了,不过只能获取本应用的数据,所以兼容的策略是5.0~6.0自己维护一个ActivityStack
连续Crash的处理
如果一分钟内进行了两次恢复后还导致Crash,则不进行恢复而是重启应用,或者重启并清空缓存,以便恢复App刚安装时的状态
无图言屌
下面是效果图:
项目地址
https://github.com/Sunzxyong/Recovery
Android运行时Crash自动恢复框架:Recovery相关推荐
- Android运行时Crash自动恢复框架-Recovery
转自:http://zhengxiaoyong.me/2016/09/05/Android%E8%BF%90%E8%A1%8C%E6%97%B6Crash%E8%87%AA%E5%8A%A8%E6%8 ...
- 好牛逼的技术——Android运行时Crash自动恢复框架:Recovery
简介 App Crash的恢复,这个想法很早之前就有,目前有些时间就实现了一把,主要是对App运行时发生Crash后,对Activity的堆栈和数据进行恢复,或者重启应用,或者重启并清空缓存,避免因本 ...
- android运行时ART加载OAT文件解析
在前面一文中,我们介绍了Android运行时ART,它的核心是OAT文件.OAT文件是一种Android私有ELF文件格式,它不仅包含有从DEX文件翻译而来的本地机器指令,还包含有原来的DEX文件内容 ...
- Android 8.0 AutoFill自动填写框架实践
1.构建表单界面 为 TextInputEditText 添加 android:importantForAutofill="yes" <?xml version=" ...
- Tegra3 vSMP架构Android运行时CPU热插拔及高低功耗CPU切换
Tegra3采用vSMP(VariableSymmetric Multiprocessing)架构,共5个cortex-a9处理器,其中4个为高性能设计,1个为低功耗设计: 在系统运行过程中,会根据C ...
- iOS APP 运行时防Crash工具XXShield练就
原文地址 前言 正在运行的 APP 突然 Crash,是一件令人不爽的事,会流失用户,影响公司发展,所以 APP 运行时拥有防 Crash 功能能有效降低 Crash 率,提升 APP 稳定性.但是有 ...
- ios网易大白Crash自动防护
大白(Baymax),迪士尼动画<超能陆战队>中的健康机器人,是一个体型胖胖的充气机器人,因呆萌的外表和善良的本质获得大家的喜爱,被称为"萌神". Baymax项目是为 ...
- Android 11.0 进入recovery模式(等待用户选择recovery模式界面)进入自动恢复出厂设置模式
1.概述 在定制11.0的产品的时候,由于没有音量键 所以用音量键和电源键来选择recovery模式就无法实现了 所以当进入recovery选择模式界面 就一直停在那里 根据需要 要修改成进入等待用户 ...
- Android 10.0 进入recovery模式(等待用户选择recovery模式界面)实现自动恢复出厂设置
1.概述 在10.0 的产品由于没有音量键 所以用音量键和电源键来选择recovery模式就无法实现了 所以当进入 recovery选择模式界面 就一直停在那里 根据需要 要修改成进入等待用户选择re ...
最新文章
- 延展公司与兰石重装签订战略合作协议
- 实时流处理系统容错机制(二):Apache Flink 基于State的异步容错机制
- 高中生学python培养思维能力_基于培养思维能力的Python语言程序设计教学
- 【Ogre-windows】环境配置
- net-tools和ifconfig
- 用etcd实现比Redis更安全的分布式锁
- 网络实用技术基础模拟测试2_网络安全工程师教你:Kali Linux之Metasploit渗透测试基础(五)...
- 虚拟机中Ubuntu IP地址漂移问题解决(为Ubuntu配置固定IP地址)
- MSSQL 2000更改表和存储过程的所有者
- WindRiver WorkBench创建、编译vxWorks APP工程
- 各行业程序员年薪分析
- java读文件换行_java读取文本文件txt时候的换行问题
- java实现机器人行走
- 4个方法判断食物的热量高低
- 轻松解决Tomcat启动慢的问题,只需一行代码
- Ubuntu: Firefox 的profile missing解决
- VMware精简系统Win系列|体积更小更稳定
- 看书APP开发制作流程(成品案例)
- 计算机基础知识---位运算的简介
- 剑网三怎么查看服务器角色信息,剑网3如何获取角色?以下这些获取方式请全部掌握!...