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相关推荐

  1. 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 ...

  2. 好牛逼的技术——Android运行时Crash自动恢复框架:Recovery

    简介 App Crash的恢复,这个想法很早之前就有,目前有些时间就实现了一把,主要是对App运行时发生Crash后,对Activity的堆栈和数据进行恢复,或者重启应用,或者重启并清空缓存,避免因本 ...

  3. android运行时ART加载OAT文件解析

    在前面一文中,我们介绍了Android运行时ART,它的核心是OAT文件.OAT文件是一种Android私有ELF文件格式,它不仅包含有从DEX文件翻译而来的本地机器指令,还包含有原来的DEX文件内容 ...

  4. Android 8.0 AutoFill自动填写框架实践

    1.构建表单界面 为 TextInputEditText 添加 android:importantForAutofill="yes" <?xml version=" ...

  5. Tegra3 vSMP架构Android运行时CPU热插拔及高低功耗CPU切换

    Tegra3采用vSMP(VariableSymmetric Multiprocessing)架构,共5个cortex-a9处理器,其中4个为高性能设计,1个为低功耗设计: 在系统运行过程中,会根据C ...

  6. iOS APP 运行时防Crash工具XXShield练就

    原文地址 前言 正在运行的 APP 突然 Crash,是一件令人不爽的事,会流失用户,影响公司发展,所以 APP 运行时拥有防 Crash 功能能有效降低 Crash 率,提升 APP 稳定性.但是有 ...

  7. ios网易大白Crash自动防护

    大白(Baymax),迪士尼动画<超能陆战队>中的健康机器人,是一个体型胖胖的充气机器人,因呆萌的外表和善良的本质获得大家的喜爱,被称为"萌神". Baymax项目是为 ...

  8. Android 11.0 进入recovery模式(等待用户选择recovery模式界面)进入自动恢复出厂设置模式

    1.概述 在定制11.0的产品的时候,由于没有音量键 所以用音量键和电源键来选择recovery模式就无法实现了 所以当进入recovery选择模式界面 就一直停在那里 根据需要 要修改成进入等待用户 ...

  9. Android 10.0 进入recovery模式(等待用户选择recovery模式界面)实现自动恢复出厂设置

    1.概述 在10.0 的产品由于没有音量键 所以用音量键和电源键来选择recovery模式就无法实现了 所以当进入 recovery选择模式界面 就一直停在那里 根据需要 要修改成进入等待用户选择re ...

最新文章

  1. 延展公司与兰石重装签订战略合作协议
  2. 实时流处理系统容错机制(二):Apache Flink 基于State的异步容错机制
  3. 高中生学python培养思维能力_基于培养思维能力的Python语言程序设计教学
  4. 【Ogre-windows】环境配置
  5. net-tools和ifconfig
  6. 用etcd实现比Redis更安全的分布式锁
  7. 网络实用技术基础模拟测试2_网络安全工程师教你:Kali Linux之Metasploit渗透测试基础(五)...
  8. 虚拟机中Ubuntu IP地址漂移问题解决(为Ubuntu配置固定IP地址)
  9. MSSQL 2000更改表和存储过程的所有者
  10. WindRiver WorkBench创建、编译vxWorks APP工程
  11. 各行业程序员年薪分析
  12. java读文件换行_java读取文本文件txt时候的换行问题
  13. java实现机器人行走
  14. 4个方法判断食物的热量高低
  15. 轻松解决Tomcat启动慢的问题,只需一行代码
  16. Ubuntu: Firefox 的profile missing解决
  17. VMware精简系统Win系列|体积更小更稳定
  18. 看书APP开发制作流程(成品案例)
  19. 计算机基础知识---位运算的简介
  20. 剑网三怎么查看服务器角色信息,剑网3如何获取角色?以下这些获取方式请全部掌握!...

热门文章

  1. 运行单独的vue页面
  2. Linux查询网络配置相关命令
  3. options请求(复杂请求)
  4. java 获取resource底下文件的字符内容
  5. 批量写入mysql数据库的Python脚本
  6. 面试心得与总结---BAT、网易、蘑菇街【转载】
  7. 鸿蒙系统为什么能用太极框架,玩机福音:华为 EMUI 升级鸿蒙之后依然可使用太极运行 Xposed...
  8. 拓扑容差如何修改_拓扑编辑
  9. 教室预约系统mysql_PHP+MySQL教室预约管理系统的设计与实现
  10. 动态域名解析--每步动态域名解析