做Android/iOS测试也有一段时间了,随着项目壮大,版本crash问题也越来越突出。如何有效地对crash进行预防拦截呢?请看下文。
1.APP闪退背后的秘密
以下画面相信负责过APP项目一定见过,它是怎么出现的呢?
以下为基于Android源码分析的完整代码调用关系:
主流程如下:
使用try…catch语句,那么如果没有有效catch exception,此时系统便会来进行捕获,并进入crash流程(分为六大流程):
1.首先发生crash所在进程,在创建之初便准备好了defaultUncaughtHandler,用来来处理Uncaught Exception,并输出当前crash基本信息;
2.调用当前进程中的AMP.handleApplicationCrash;经过binder ipc机制,传递到system_server进程;
3.接下来,进入system_server进程,调用binder服务端执行AMS.handleApplicationCrash;经过一系列的调用最终痛过mUiHandler发送消息SHOW_ERROR_MSG,弹出crash对话框;
4.到此,system_server进程执行完成。回到crash进程开始执行杀掉当前进程的操作;
5.当crash进程被杀,通过binder死亡通知,告知system_server进程来执行appDiedLocked();
6.最后,执行清理应用相关的activity/service/ContentProvider/receiver组件信息。
可以尝试自己下载最新的源码并查看分析,相关源文件:
RuntimeInit.java
ActivityManagerNative.java
ActivityManagerService.java
ProcessRecord.java
Wind