GodBlessYou

项目地址: github.com/ximsfei/God…

GBU尝试在运行时修复Android应用的崩溃问题,在使部分功能失效的前提下,让应用继续运行。使用GBU以后,应用将不再会出现"X 已停止运行"的对话框。

你可以下载demo apk来体验一下.

内容

  • 实现原理

    • 修复Activity中的Crash
    • 修复Service中的Crash
    • 修复BroadcastReceiver中的Crash
    • 修复其他Crash

实现原理

修复Activity中的Crash

Android framework 通过Instrumentation来调用Activity的所有生命周期方法,GBU 通过反射ActivityThread的成员变量mInstrumentation来尝试修复Activity生命周期回调中的崩溃。

GbuInstrumentationImpl.kt

override fun callActivityOnCreate(activity: Activity?, icicle: Bundle?) {try {super.callActivityOnCreate(activity, icicle)} catch (e: Throwable) {e.printStackTrace()}
}override fun callActivityOnCreate(activity: Activity?, icicle: Bundle?, persistentState: PersistableBundle?) {try {super.callActivityOnCreate(activity, icicle, persistentState)} catch (e: Throwable) {e.printStackTrace()}
}override fun callActivityOnNewIntent(activity: Activity?, intent: Intent?) {try {super.callActivityOnNewIntent(activity, intent)} catch (e: Throwable) {e.printStackTrace()}
}override fun callActivityOnRestart(activity: Activity?) {try {super.callActivityOnRestart(activity)} catch (e: Throwable) {e.printStackTrace()}
}override fun callActivityOnStart(activity: Activity?) {try {super.callActivityOnStart(activity)} catch (e: Throwable) {e.printStackTrace()}
}override fun callActivityOnResume(activity: Activity?) {try {super.callActivityOnResume(activity)} catch (e: Throwable) {e.printStackTrace()}
}override fun callActivityOnPause(activity: Activity?) {try {super.callActivityOnPause(activity)} catch (e: Throwable) {e.printStackTrace()}
}override fun callActivityOnStop(activity: Activity?) {try {super.callActivityOnStop(activity)} catch (e: Throwable) {e.printStackTrace()}
}override fun callActivityOnDestroy(activity: Activity?) {try {super.callActivityOnDestroy(activity)} catch (e: Throwable) {e.printStackTrace()}
}override fun callActivityOnPostCreate(activity: Activity?, icicle: Bundle?) {try {super.callActivityOnPostCreate(activity, icicle)} catch (e: Throwable) {e.printStackTrace()}
}override fun callActivityOnPostCreate(activity: Activity?, icicle: Bundle?, persistentState: PersistableBundle?) {try {super.callActivityOnPostCreate(activity, icicle, persistentState)} catch (e: Throwable) {e.printStackTrace()}
}override fun callActivityOnSaveInstanceState(activity: Activity?, outState: Bundle?) {try {super.callActivityOnSaveInstanceState(activity, outState)} catch (e: Throwable) {e.printStackTrace()}
}override fun callActivityOnSaveInstanceState(activity: Activity?, outState: Bundle?, outPersistentState: PersistableBundle?) {try {super.callActivityOnSaveInstanceState(activity, outState, outPersistentState)} catch (e: Throwable) {e.printStackTrace()}
}override fun callActivityOnRestoreInstanceState(activity: Activity?, savedInstanceState: Bundle?) {try {super.callActivityOnRestoreInstanceState(activity, savedInstanceState)} catch (e: Throwable) {e.printStackTrace()}
}override fun callActivityOnRestoreInstanceState(activity: Activity?, savedInstanceState: Bundle?, persistentState: PersistableBundle?) {try {super.callActivityOnRestoreInstanceState(activity, savedInstanceState, persistentState)} catch (e: Throwable) {e.printStackTrace()}
}
复制代码

修复Service和BroadcastReceiver中的Crash

Android framework 在调用四大组件生命周期的时候,如果出现了异常,会回调Instrumentation.onException方法。GBU 通过Instrumentation的方法onException返回true来尝试修复ServiceBroadcastReceiver生命周期回调中的崩溃。同时手动执行framework未完成的代码,防止生命周期不完整引起的anr。

GbuInstrumentationImpl.kt

class GbuInstrumentationImpl(base: Instrumentation) : GbuInstrumentationWrapper(base) {override fun onException(obj: Any?, e: Throwable?): Boolean {GbuActivityThread.handleException(obj)return true}
}
复制代码

GbuActivityThread.kt

object GbuActivityThread {fun handleException(obj: Any?) {if (Gbu.debug) {GbuLog.d(codeToString(mMsg?.what!!))}if (obj is Service) {when (mMsg?.what) {CREATE_SERVICE -> handleCreateService(obj)SERVICE_ARGS -> handleServiceArgs(obj)STOP_SERVICE -> handleStopService(obj)BIND_SERVICE -> handleBindService(obj)UNBIND_SERVICE -> handleUnbindService(obj)}} else if (obj is BroadcastReceiver) {GbuBroadcastReceiver.setPendingResult(obj, null)}}
}
复制代码

修复其他Crash

参照网上的一些资料实现其他崩溃的捕获,同时保证主线程不会因为崩溃而退出。

object Gbu {init {Handler(Looper.getMainLooper()).post {while (true) {try {Looper.loop()} catch (e: Throwable) {e.printStackTrace()}}}Thread.setDefaultUncaughtExceptionHandler { _: Thread, throwable: Throwable ->throwable.printStackTrace()}}
}
复制代码

GodBlessYou: 让你的应用不再崩溃相关推荐

  1. android 8.0 edittext,关注TextInputEditText的Android 8.0 Oreo崩溃

    在将我们的一些设备更新到Android 8.0之后,在关注TextInputLayout内的TextInputEditText字段时,应用程序崩溃了这个例外: Fatal Exception: jav ...

  2. android webview崩溃,Android-未知的webview崩溃原因

    我有一个类是它自己的活动,基本上我用来主持一个web视图.它在大多数设备上都能正常工作,但是在motorolla droid bionic上,它在加载页面时每隔一段时间就放弃这个错误.Android- ...

  3. Android Studio 使用Profiler时App崩溃闪退

    问题 今天想使用AS的Profiler测App的CPU等数据 于是启动App并打开Profiler窗口 当App运行到模型运算的部分时,App竟然闪退了 而不使用Profiler时App是能正常运行的 ...

  4. php5ts崩溃,热门问题 浏览器崩溃原因与解决办法? | 傲游5云浏览器常见问题...

    1.打开任务管理器,查看是否存在残留的Maxthon进程,如果存在则需要强制结束此进程,无法结束的请重启电脑,然后再尝试启动浏览器: 2.如果普通登陆后浏览器仍闪退,则尝试重命名用户数据目录后,重新打 ...

  5. 好用,好用,好用,Ubuntu20.04中安装搜狗输入法,彻底解决依赖无法修复,易崩溃问题

    大家好,我是河海哥,专注于后端,如果可以的话,想做一名code designer而不是普通的coder,一起见证河海哥的成长,您的评论与赞是我的最大动力,如有错误还请不吝赐教,万分感谢.一起支持原创吧 ...

  6. 离奇的std::map、std::set崩溃

    离奇的std::map.std::set崩溃 现象描述 定位之路 1.和windows调用比较,没发现任何问题 2.修改cmakelists.txt,发现也没有什么可以改的,能改的怎么改结果都一样 3 ...

  7. itoa+java数组_itoa实施崩溃?

    我正在尝试在汇编中实现atoi(netwide汇编程序) . 我通过使用调试器检查寄存器值来验证我的方法是有效的 . 问题是应用程序即将退出时会崩溃 . 我担心我的程序会以某种方式破坏堆栈 . 我正在 ...

  8. qt界面崩溃与假死问题

    在开发图表项目时,项目要求如下: 同时打开100多个图表,单个图表的数据5W左右,结果图表出现了崩溃与假死的现象,每天好几次,不是必定出现现象,有的电脑未出现,有的电脑出现频繁 尝试了以下方式去解决问 ...

  9. Android GL deadlock timeout error

    Android GL deadlock timeout error CRASH 在 PBR&IBL 的开发过程中,在 Linux 验证程序运行正常后,移植到 Android 平台,发现程序 c ...

最新文章

  1. PHP全栈学习笔记10
  2. 博客园自动添加版权说明,自动添加文章链接
  3. kuka机器人焊接飞溅大_库卡机器人KCP4示教器屏幕校准方法
  4. Sharding-Sphere,Sharding-JDBC_分库分表介绍_Sharding-Sphere,Sharding-JDBC分布式_分库分表工作笔记002
  5. NSA漏洞披露政策:攻击和防御间的权衡
  6. python怎么制作简单图_Python简单的制作图片验证码实例
  7. 查看JDK版本和安装路径
  8. 色鬼色狼和色仙的区别
  9. 《人工智能狂潮》读后感——什么是人工智能?(一)
  10. python爬虫-京东登录
  11. 《Adobe After Effects CS6中文版经典教程》——2.9 渲染合成图像
  12. 如何解决oracle中文乱码问题,oracle中解决中文乱码问题
  13. 博士最惨能惨到什么程度?
  14. 2.2 华为-软件工程师-7.21笔试题
  15. 【华为OD机试模拟题】用 C++ 实现 - 英文输入法单词联想 or 英文输入法(2023.Q1)
  16. ファイルダウンロード
  17. 需要给变量赋缺省值吗?
  18. 用iconv 文件格式转换
  19. 修改imx6 linux4.1.15开机动画的完整教程
  20. 辗转相除法-欧几里得算法

热门文章

  1. 平稳与非平稳随机信号的理解
  2. multisim秒信号发生器_基于Multisim的简易信号发生器的设计
  3. Java线程之setDaemon(true)方法的作用
  4. 利用浏览器缓存抓取网络资源:【炉石传说】所有卡牌png图片地址
  5. Ramdisk虚拟内存盘,Swap分区
  6. 代谢组学资讯,全球爆火的ChatGPT,是如何看待三阴性乳腺癌的?
  7. 如何查看mysql库中表的创建语句
  8. UCOS操作系统基础
  9. Linux下的C语言编程——位运算
  10. 美通企业日报 | 内容质量是亚太媒体最重视的指标;“豆蔻青”将成2020年度色彩...