Android崩潰日志收集是個什么鬼我擂?

目前大多數(shù)app都是使用三方庫(例如友盟)實現(xiàn)崩潰日志收集酵幕, 但不一定了解是如何實現(xiàn)的扰藕。 今天工作不忙, 剛好有時間思考一下這個問題芳撒。

我們知道Android進程在閃退或崩潰時实胸, logcat里會輸出一片紅色的崩潰日志他嫡, 包括Shutting down vm和堆棧信息。 PS: Android基礎(chǔ)知識點:app和linux進程是什么關(guān)系庐完? 答:每個android進程可以理解為是一個linux進程钢属。

下面說說我理解的做日志采集的套路:
1、 自定義Application類门躯, 一般在這個類里初始化三方庫淆党。
<pre>
<application
android:name=".TheApplication"
android:icon="${icon}"
android:label="${str}"
android:largeHeap="true"
tools:replace="android:label"></pre>

2、 保存默認異常處理Handler的引用(Java虛虛擬機的異常日志都會執(zhí)行回調(diào)函數(shù)uncaughtException)讶凉, 注意handler是運行在主線程里染乌! (PS: 為什么不是子線程? 我的理解是子線程默認沒有l(wèi)ooper懂讯, 而創(chuàng)建android進程時AndroidNative.java里會創(chuàng)建一個looper荷憋。)
mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();

3、 將uncaughtException函數(shù)的參數(shù)轉(zhuǎn)換為字符串褐望, 即異常日志堆棧信息勒庄。


異常堆棧.png

4、 為了更好的分析問題瘫里,除了異常堆棧外实蔽,可能還需要app版本號、用戶信息(例如用戶名或手機號)谨读、手機信息(如機型局装、版本等)、當前進程的線程信息等等劳殖, 將這些信息保存到數(shù)據(jù)庫表里(可以用原生的sqlite或三方庫如Realm铐尚、LitePal、OrmLite哆姻、GreenDao等等)宣增, 寫到數(shù)據(jù)庫的目的在于能夠多條批量上傳,更重要的是避免進程崩潰后日志丟失或者不知道是否已上傳的狀態(tài)填具。 PS:當然還可以在捕獲到異常時保存其它你關(guān)心的數(shù)據(jù)!

5匆骗、 上傳日志可以單獨啟動個遠程服務(wù)(運行在:remote進程劳景,目的是避免占用UI進程資源), 使用觀察者模式監(jiān)聽數(shù)據(jù)庫變化或監(jiān)聽當前時間和上次上傳日志的時間間隔碉就, 當日志記錄條數(shù)超出閾值或者超出間隔周期時盟广, 將日志打包成gzip或其它壓縮格式并傳送到服務(wù)器, 服務(wù)器存儲結(jié)果并返回成功時瓮钥, 客戶端刪除對應(yīng)的日志記錄筋量。
PS: HTTP交互是在子線程執(zhí)行的烹吵, 可以借助三方庫例如OkHttp實現(xiàn)。

思路示例代碼(省略了存數(shù)據(jù)和打包上傳的代碼):
<pre>
public class TheApplication extends Application {
Thread.UncaughtExceptionHandler mDefaultHandler;

@Override
public void onCreate() {
    super.onCreate();
    mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();  //第一步桨武,獲取默認handler

    //替換handler, 這是在主線程里執(zhí)行
    Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
        @Override
        public void uncaughtException(Thread t, Throwable e) {
            Writer writer = new StringWriter();
            PrintWriter printWriter = new PrintWriter(writer);
            e.printStackTrace(printWriter);
            Throwable cause = e.getCause();
            while (cause != null) {
                cause.printStackTrace(printWriter);
                cause = cause.getCause();
            }
            printWriter.close();
            String result = writer.toString();   //這就是異常日志堆棧信息

            /**
              第三步肋拔, 存儲app版本號、用戶信息(例如uid或手機號)呀酸、手機信息(例如機型凉蜂、版本號)、
             當前進程的線程信息和result(即異常堆棧到一個數(shù)據(jù)庫表里(狀態(tài)位表示未上傳性誉,已上傳時刪除該記錄)
            */

            /**
             * 第四步窿吩, 上傳異常日志的服務(wù)器。 進程里應(yīng)該有個服務(wù)错览,監(jiān)聽著數(shù)據(jù)庫異常日志表(觀察者模式)或啟動服務(wù)
             * 時判斷記錄條數(shù)是否達到閾值纫雁; 超過閾值時, 將多條記錄打包壓縮成gzip或其它格式上傳到服務(wù)器倾哺, 服務(wù)器
             * 存儲數(shù)據(jù)后返回成功轧邪, 客戶端刪除本地日志表的對應(yīng)記錄。
             */

            mDefaultHandler.uncaughtException(t, e);
            // Java的默認異常處理悼粮。 如果是NullPointerException闲勺, 注釋掉這行app會無響應(yīng),因為"AndroidRuntime: Shutting down VM"
        }
    });</pre>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末扣猫,一起剝皮案震驚了整個濱河市菜循,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌申尤,老刑警劉巖癌幕,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異昧穿,居然都是意外死亡勺远,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進店門时鸵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來胶逢,“玉大人,你說我怎么就攤上這事饰潜〕踝梗” “怎么了?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵彭雾,是天一觀的道長碟刺。 經(jīng)常有香客問我,道長薯酝,這世上最難降的妖魔是什么半沽? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任爽柒,我火速辦了婚禮,結(jié)果婚禮上者填,老公的妹妹穿的比我還像新娘浩村。我一直安慰自己,他們只是感情好幔托,可當我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布穴亏。 她就那樣靜靜地躺著,像睡著了一般重挑。 火紅的嫁衣襯著肌膚如雪嗓化。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天谬哀,我揣著相機與錄音刺覆,去河邊找鬼。 笑死史煎,一個胖子當著我的面吹牛谦屑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播篇梭,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼氢橙,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了恬偷?” 一聲冷哼從身側(cè)響起悍手,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎袍患,沒想到半個月后坦康,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡诡延,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年滞欠,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肆良。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡筛璧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出惹恃,到底是詐尸還是另有隱情夭谤,我是刑警寧澤,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布座舍,位于F島的核電站沮翔,受9級特大地震影響陨帆,放射性物質(zhì)發(fā)生泄漏曲秉。R本人自食惡果不足惜采蚀,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望承二。 院中可真熱鬧榆鼠,春花似錦、人聲如沸亥鸠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽负蚊。三九已至神妹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間家妆,已是汗流浹背鸵荠。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留伤极,地道東北人蛹找。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像哨坪,于是被迫代替她去往敵國和親庸疾。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,724評論 2 351

推薦閱讀更多精彩內(nèi)容