【Android源码 栏目提醒】:网学会员为广大网友收集整理了,Android 应用程序异常信息捕获发送至服务器 - 软件工程,希望对大家有所帮助!
Android 应用程序异常信息捕获发送至服务器 对于已经上线的项目为了避免有没有考虑到的bug发生方便维护以及为了有更好的用户体验不能再发生异常的时候弹出系统默认的提示框. 而是应该由自己程序本身捕获先保存到本地当下次打开软件时上传到服务器. 这样也可以为我们收集到BUG的第一手资料主动收集 更快地定位到异常位置并修复这样既节省了时间也提高了工作的效率. 还有本身这种收集异常信息的做法也是借鉴于windows中杀毒软件的做法如遇到本地病毒库或者服务器上都没有遇到的病毒上传添加到病毒库中 ..或者有很多软件做的用户反馈模式都比较相似 这里还有一些细节要注意 java view plaincopy 1. 1. 在上传的时候还可以将该app的version版本号该手机的型号网络制式等信息一并发送的服务器 2. 2. 原因:
Android的兼容性众所周知所以可能错误不是每个手机都会报错还是有针对性的去debug比较好而不是全部都进行分析花费不必要的时间: 3. 某些BUG可能是由于屏幕适配或者由于不同品牌的手机使用的并不是原生系统一般是经过修改过的比较典型的是小米手机对于系统修改的部分非常多.有可能在原生系统 4. 或者主流的三星摩托等手机上运行无误的程序会发生特定的异常 原理: 跟JavaEE的自定义异常捕获一样将错误一直向上抛然后在最上层统一处理。
这里就可以获得异常信息先保存到本地下一次运行的时候上传到服务区. 当然这些可以由程序员自己根据实际情况具体处理这里只是提供捕获异常并进一步处理的一个方案. 主要用到的是自定义的CrashHandler继承自UncaughtExceptionHandler具体代码如下: java view plaincopy 1. / 2. author Tian 3. 在Application中统一捕获异常保存到文件中下次再打开时上传 4. / 5. 6. public class CrashHandler implements UncaughtExceptionHandler 7. 8. 9. / 是否开启日志输出在Debug状态下开启 10. 在Release状态下关闭以提示程序性能 11. / 12. 13. public static final boolean DEBUG true 14. 15. 16. / 系统默认的UncaughtException处理类 / 17. 18. private Thread.UncaughtExceptionHandler mDefaultHandler 19. 20. / CrashHandler实例 / 21. 22. private static CrashHandler INSTANCE 23. 24. 25. / 程序的Context对象 / 26. 27. // private Context mContext 28. 29. / 保证只有一个CrashHandler实例 / 30. 31. private CrashHandler 32. 33. / 获取CrashHandler实例 单例模式/ 34. 35. public static CrashHandler getInstance 36. 37. if INSTANCE null 38. INSTANCE new CrashHandler 39. 40. return INSTANCE 41. 42. 43. / 44. 初始化注册Context对象 45. 获取系统默认的UncaughtException处理器 46. 设置该CrashHandler为程序的默认处理器 47. 48. param ctx 49. / 50. 51. public void initContext ctx 52. // mContext ctx 53. mDefaultHandler Thread.getDefaultUncaughtExceptionHandler 54. Thread.setDefaultUncaughtExceptionHandlerthis 55. 56. 57. / 58. 当UncaughtException发生时会转入该函数来处理 59. / 60. 61. Override 62. public void uncaughtExceptionThread thread Throwable ex 63. if handleExceptionex mDefaultHandler null 64. //如果用户没有处理则让系统默认的异常处理器来处理 65. mDefaultHandler.uncaughtExceptionthread ex 66. else //如果自己处理了异常则不会弹出错误对话框则需要手动退出app 67. try 68. Thread.sleep3000 69. catch InterruptedException e 70. 71.
android.os.Process.killProcessandroid.os.Process.myPid 72. System.exit10 73. 74. 75. 76. 77. / 78. 自定义错误处理收集错误信息 79. 发送错误报告等操作均在此完成. 80. 开发者可以根据自己的情况来自定义异常处理逻辑 81. return 82. true代表处理该异常不再向上抛异常 83. false代表不处理该异常可以将该log信息存储起来然后交给上层这里就到了系统的异常处理去处理 84. 简单来说就是true不会弹出那个错误提示框false就会弹出 85. / 86. 87. private boolean handleExceptionfinal Throwable ex 88. if ex null 89. return false 90. 91. 92. // final String msg ex.getLocalizedMessage 93. final StackTraceElement stack ex.getStackTrace 94. final String message ex.getMessage 95. 96. //使用Toast来显示异常信息 97. new Thread 98. Override 99. public void run 100. 101. Looper.prepare 102. // Toast.makeTextmContext 程序出错啦: message Toast.LENGTH_LONG.show 103. // 可以只创建一个文件以后全部往里面append然后发送这样就会有重复的信息个人不推荐 104. 105. String fileName crash- System.currentTimeMillis .log 106. File file new FileEnvironment.getExternalStorageDirectory fileName 107. try 108. FileOutputStream fos new FileOutputStreamfiletrue 109. fos.writemessage.getBytes 110. for int i 0 i stack.length i 111. fos.writestacki.toString.getBytes 112. 113. 114. fos.flush 115. fos.close 116. catch Exception e 117. 118. Looper.loop 119. 120. 121. .start 122. return false 123. 124. 125. // TODO 使用HTTP Post 发送错误报告到服务器 这里不再做详细描述 126. // private void postReportFile file 127. 128. // 129. 130. 源代码下载地址 http://download.csdn.net/detail/t12x3456/4522621