{"id":444,"date":"2018-03-14T17:26:49","date_gmt":"2018-03-14T09:26:49","guid":{"rendered":"http:\/\/www.max-shu.com\/blog\/?p=444"},"modified":"2018-03-14T17:26:49","modified_gmt":"2018-03-14T09:26:49","slug":"android%e7%9a%84uncaughtexceptionhandle%e5%a4%84%e7%90%86%e5%92%8ccrash%e5%bc%82%e5%b8%b8%e4%bf%a1%e6%81%af%e6%94%b6%e9%9b%86%e5%90%8e%e5%8f%b0acra%e3%80%81acralyzer","status":"publish","type":"post","link":"http:\/\/www.max-shu.com\/blog\/?p=444","title":{"rendered":"Android\u7684UncaughtExceptionHandle\u5904\u7406\u548cCrash\u5f02\u5e38\u4fe1\u606f\u6536\u96c6\u540e\u53f0ACRA\u3001acralyzer"},"content":{"rendered":"<div><b>\u540e\u53f0\u5206\u6790\u5c55\u793a\uff1a<\/b><\/div>\n<div><a href=\"https:\/\/github.com\/ACRA\/acralyzer\" rel=\"nofollow\">https:\/\/github.com\/ACRA\/acralyzer<\/a><\/div>\n<div><\/div>\n<div><b>\u524d\u7aefAndroid\u5e93\uff1a<\/b><\/div>\n<div><a href=\"https:\/\/github.com\/ACRA\/acra\" rel=\"nofollow\">https:\/\/github.com\/ACRA\/acra<\/a><\/div>\n<div><\/div>\n<div><b>\u5b9e\u73b0\u539f\u7406\uff1a<\/b><\/div>\n<div><a href=\"http:\/\/www.cnblogs.com\/whoislcj\/p\/5468190.html\" rel=\"nofollow\">http:\/\/www.cnblogs.com\/whoislcj\/p\/5468190.html<\/a><\/div>\n<div><b><span style=\"color: #ff0000;\">\uff08\u8f6c\uff09<\/span><\/b><span style=\"color: #333333;\">\u6bcf\u5f53\u6211\u4eecapp\u6d4b\u8bd5\u7684\u65f6\u5019\uff0c\u6d4b\u8bd5\u4eba\u5458\u603b\u662f\u5bf9\u6211\u4eec\u8bf4\u8fd9\u91cc\u5d29\u6e83\u4e86\uff0c\u90a3\u91cc\u6302\u6389\u4e86\uff01\u6211\u4eec\u53ea\u80fd\u9ed8\u9ed8\u63a5\u53d7\uff0c\u7136\u540e\u5c1d\u8bd5\u7740\u91cd\u73b0bug\uff0c\u66f4\u53ef\u60b2\u7684\u662f\u6709\u65f6\u5019bug\u5f88\u96be\u590d\u73b0\uff0c\u4e3a\u4e86\u89e3\u51b3\u8fd9\u79cd\u73b0\u72b6\u6240\u4ee5\u6211\u4eec\u8981\u5c1d\u8bd5\u8fd9\u5efa\u7acb\u4e00\u4e2a\u81ea\u5df1\u7684bug\u65e5\u5fd7\u7cfb\u7edf\u3002<\/span><\/div>\n<div>\u673a\u5236\uff1a<\/div>\n<div>Java\u4e3a\u6211\u4eec\u63d0\u4f9b\u4e86\u4e00\u4e2a\u673a\u5236\uff0c\u7528\u6765\u6355\u83b7\u5e76\u5904\u7406\u5728\u4e00\u4e2a\u7ebf\u7a0b\u5bf9\u8c61\u4e2d\u629b\u51fa\u7684\u672a\u68c0\u6d4b\u5f02\u5e38\uff0c\u4ee5\u907f\u514d\u7a0b\u5e8f\u7ec8\u6b62\u3002\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7UncaughtExceptionHandler\u6765\u5b9e\u73b0\u8fd9\u79cd\u673a\u5236\u3002<\/div>\n<div>\u5177\u4f53\u5b9e\u73b0\uff1a<\/div>\n<div>\n<div>public\u00a0class\u00a0CrashManager\u00a0implements\u00a0UncaughtExceptionHandler\u00a0{<br \/>\npublic\u00a0static\u00a0final\u00a0String\u00a0TAG\u00a0=\u00a0&#8220;CrashHandler&#8221;;<br \/>\n\/\/\u00a0CrashHandler\u5b9e\u4f8b<br \/>\nprivate\u00a0static\u00a0CrashManager\u00a0instance;<br \/>\n\/\/\u00a0\u7a0b\u5e8f\u7684Context\u5bf9\u8c61<br \/>\nprivate\u00a0Application\u00a0application;<br \/>\n\/\/\u00a0\u7cfb\u7edf\u9ed8\u8ba4\u7684UncaughtException\u5904\u7406\u7c7b<br \/>\nprivate\u00a0UncaughtExceptionHandler\u00a0mDefaultHandler;<\/p>\n<p>\/**<br \/>\n*\u00a0\u4fdd\u8bc1\u53ea\u6709\u4e00\u4e2aCrashHandler\u5b9e\u4f8b<br \/>\n*\/<br \/>\nprivate\u00a0CrashManager(Context\u00a0context)\u00a0{<br \/>\napplication\u00a0=\u00a0(Application)\u00a0context.getApplicationContext();<br \/>\nmDefaultHandler\u00a0=\u00a0Thread.getDefaultUncaughtExceptionHandler();<br \/>\nThread.setDefaultUncaughtExceptionHandler(this);<br \/>\n}<\/p>\n<p>\/**<br \/>\n*\u00a0\u83b7\u53d6CrashHandler\u5b9e\u4f8b\u00a0,\u5355\u4f8b\u6a21\u5f0f<br \/>\n*\/<br \/>\npublic\u00a0static\u00a0CrashManager\u00a0getInstance(Context\u00a0context)\u00a0{<br \/>\nCrashManager\u00a0inst\u00a0=\u00a0instance;<br \/>\nif\u00a0(inst\u00a0==\u00a0null)\u00a0{<br \/>\nsynchronized\u00a0(CrashManager.class)\u00a0{<br \/>\ninst\u00a0=\u00a0instance;<br \/>\nif\u00a0(inst\u00a0==\u00a0null)\u00a0{<br \/>\ninst\u00a0=\u00a0new\u00a0CrashManager(context.getApplicationContext());<br \/>\ninstance\u00a0=\u00a0inst;<br \/>\n}<br \/>\n}<br \/>\n}<br \/>\nreturn\u00a0inst;<br \/>\n}<\/p>\n<p>\/**<br \/>\n*\u00a0\u5f53UncaughtException\u53d1\u751f\u65f6\u4f1a\u8f6c\u5165\u8be5\u51fd\u6570\u6765\u5904\u7406<br \/>\n*\/<br \/>\n@Override<br \/>\npublic\u00a0void\u00a0uncaughtException(Thread\u00a0thread,\u00a0Throwable\u00a0ex)\u00a0{<br \/>\nTaskManager.getInstance(application).saveErrorLog(ex);<br \/>\nmDefaultHandler.uncaughtException(thread,\u00a0ex);<br \/>\n}<\/p>\n<\/div>\n<div>}<\/div>\n<\/div>\n<div>\u65e5\u5fd7\u5199\u5165sdcard\u4ee3\u7801\uff1a<\/div>\n<div>\n<div>public\u00a0class\u00a0SaveErrorTask&lt;T&gt;\u00a0extends\u00a0Task&lt;Object,\u00a0Object,\u00a0Void&gt;\u00a0{<br \/>\nprivate\u00a0SimpleDateFormat\u00a0formatter\u00a0=\u00a0new\u00a0SimpleDateFormat(&#8220;yyyy-MM-dd-HH-mm-ss&#8221;,\u00a0Locale.CHINA);<br \/>\nprivate\u00a0Context\u00a0context;<br \/>\nprivate\u00a0Throwable\u00a0ex;<\/p>\n<p>public\u00a0SaveErrorTask(Context\u00a0context,\u00a0Throwable\u00a0ex)\u00a0{<br \/>\nsetPriority(TaskPriority.UI_LOW);<br \/>\nthis.context\u00a0=\u00a0context;<br \/>\nthis.ex\u00a0=\u00a0ex;<br \/>\n}<\/p>\n<p>@Override<br \/>\nprotected\u00a0Void\u00a0doInBackground(Object&#8230;\u00a0arg0)\u00a0{<br \/>\nWriter\u00a0writer\u00a0=\u00a0new\u00a0StringWriter();<br \/>\nPrintWriter\u00a0printWriter\u00a0=\u00a0new\u00a0PrintWriter(writer);<br \/>\nex.printStackTrace(printWriter);<br \/>\nThrowable\u00a0cause\u00a0=\u00a0ex.getCause();<br \/>\nwhile\u00a0(cause\u00a0!=\u00a0null)\u00a0{<br \/>\ncause.printStackTrace(printWriter);<br \/>\ncause\u00a0=\u00a0cause.getCause();<br \/>\n}<br \/>\nprintWriter.close();<br \/>\nString\u00a0result\u00a0=\u00a0writer.toString();<br \/>\nString\u00a0time\u00a0=\u00a0formatter.format(new\u00a0Date());<br \/>\nString\u00a0fileName\u00a0=\u00a0time\u00a0+\u00a0&#8220;.txt&#8221;;<br \/>\nStringBuilder\u00a0stringBuffer\u00a0=\u00a0new\u00a0StringBuilder();<br \/>\nDeviceInfo\u00a0deviceInfo\u00a0=\u00a0Utils.getDeviceInfo(context);<br \/>\nstringBuffer.append(&#8220;\\nsdkVersion\uff1a&#8221;\u00a0+\u00a0deviceInfo.sdkVersion);<br \/>\nstringBuffer.append(&#8220;\\nmanufacturer\uff1a&#8221;\u00a0+\u00a0deviceInfo.manufacturer);<br \/>\nstringBuffer.append(&#8220;\\nmodel\uff1a&#8221;\u00a0+\u00a0deviceInfo.model);<br \/>\nstringBuffer.append(&#8220;\\nversion&#8221;\u00a0+\u00a0ConfigManager.getVersionName(context));<br \/>\nstringBuffer.append(&#8220;\\nerrorStr\uff1a&#8221;\u00a0+\u00a0result);<br \/>\nstringBuffer.append(&#8220;\\ntime\uff1a&#8221;\u00a0+\u00a0time);<br \/>\nString\u00a0filePath\u00a0=\u00a0CacheFileUtils.getLogPath(fileName);<br \/>\nCacheFileUtils.saveErrorStr(filePath,\u00a0stringBuffer.toString());<br \/>\nreturn\u00a0null;<br \/>\n}<\/p><\/div>\n<div>}<\/div>\n<\/div>\n<div>\u521d\u59cb\u5316\uff1a<\/div>\n<div>\n<div>public\u00a0class\u00a0MyApplication\u00a0extends\u00a0MultiDexApplication\u00a0{<\/p>\n<p>@Override<br \/>\npublic\u00a0void\u00a0on<wbr \/>Create()\u00a0{<br \/>\nsuper.on<wbr \/>Create();<br \/>\n\/\/\u521d\u59cb\u5316\u00a0\u9519\u8bef\u65e5\u5b50\u7cfb\u7edf<br \/>\nCrashManager.getInstance(this);<\/p>\n<p>}<\/p><\/div>\n<div>}<\/div>\n<\/div>\n<div>\u5c55\u671b\uff1a\u6211\u4eec\u4e5f\u53ef\u4ee5\u628a\u65e5\u5fd7\u518d\u4e0b\u6b21\u542f\u52a8\u7684\u65f6\u5019\u53d1\u9001\u81f3\u6211\u4eec\u81ea\u5df1\u7684\u65e5\u5fd7\u670d\u52a1\u5668\uff0c\u76d1\u63a7\u7528\u6237\u9519\u8bef\u4fe1\u606f\u3002<\/div>\n<div><\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u540e\u53f0\u5206\u6790\u5c55\u793a\uff1a https:\/\/github.com\/ACRA\/acralyzer \u524d\u7aefAndroid\u5e93\uff1a h &hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[13],"tags":[399,400,394,396,395,397,398],"class_list":["post-444","post","type-post","status-publish","format-standard","hentry","category-13","tag-acra","tag-acralyzer","tag-android","tag-crash","tag-uncaughtexceptionhandle","tag-397","tag-398"],"views":1725,"_links":{"self":[{"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/444","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=444"}],"version-history":[{"count":1,"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/444\/revisions"}],"predecessor-version":[{"id":445,"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/444\/revisions\/445"}],"wp:attachment":[{"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=444"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=444"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=444"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}