FileObserver捕獲ANR異常

Android中捕獲運行時異常饵较,可以通過繼承UncaughtExceptionHandler來重寫uncaughtException方法。
可以捕獲ANR異常的開源庫目前比較好的是
ANR-WatchDog遭赂。
其他的開源庫例如:
BlockCanary循诉,SafeLooper
ANR-WatchDog是參考Android WatchDog機制(com.android.server.WatchDog.java)起個單獨線程向主線程發(fā)送一個變量+1操作,自我休眠自定義ANR的閾值嵌牺,休眠過后判斷變量是否+1完成打洼,如果未完成則告警。
但是無法保證能捕捉所有ANR逆粹,對閾值的設置直接影響捕獲概率。
后來項目中使用Bugly到監(jiān)控ANR異常炫惩,通過反編譯jar包僻弹,發(fā)現(xiàn)ANR異常捕獲是通過FileObserver實現(xiàn)的。
當ANR發(fā)生的時候他嚷,通過監(jiān)聽文件文件夾“data/anr/”的寫入情況,來判斷是否發(fā)生了ANR蹋绽,如果監(jiān)聽到data/anr/traces.txt文件寫入。說明有此時有ANR異常發(fā)生筋蓖。

FileObserver

通過ActivityManager.getProcessesInErrorState();獲取當前進程的所有異常信息List.遍歷此列表卸耘,從中找到ActivityManager.ProcessErrorStateInfo對象的condition == 2 的Error。過濾掉其他非ANR異常粘咖。

過濾掉其他非ANR異常

然后過濾掉非本應用下的異常蚣抗。


過濾掉非本應用下的異常

ProcessErrorStateInfo源碼:

/**
 * Information you can retrieve about any processes that are in an error condition.
 */
public static class ProcessErrorStateInfo implements Parcelable {
    /**
     * Condition codes
     */
    public static final int NO_ERROR = 0;
    public static final int CRASHED = 1;
    public static final int NOT_RESPONDING = 2;

    /**
     * The condition that the process is in.
     */
    public int condition;

    /**
     * The process name in which the crash or error occurred.
     */
    public String processName;

    /**
     * The pid of this process; 0 if none
     */
    public int pid;

    /**
     * The kernel user-ID that has been assigned to this process;
     * currently this is not a unique ID (multiple applications can have
     * the same uid).
     */
    public int uid;

    /**
     * The activity name associated with the error, if known.  May be null.
     */
    public String tag;

    /**
     * A short message describing the error condition.
     */
    public String shortMsg;

    /**
     * A long message describing the error condition.
     */
    public String longMsg;

    /**
     * The stack trace where the error originated.  May be null.
     */
    public String stackTrace;

    /**
     * to be deprecated: This value will always be null.
     */
    public byte[] crashData = null;

    public ProcessErrorStateInfo() {
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(condition);
        dest.writeString(processName);
        dest.writeInt(pid);
        dest.writeInt(uid);
        dest.writeString(tag);
        dest.writeString(shortMsg);
        dest.writeString(longMsg);
        dest.writeString(stackTrace);
    }

    public void readFromParcel(Parcel source) {
        condition = source.readInt();
        processName = source.readString();
        pid = source.readInt();
        uid = source.readInt();
        tag = source.readString();
        shortMsg = source.readString();
        longMsg = source.readString();
        stackTrace = source.readString();
    }

    public static final Creator<ProcessErrorStateInfo> CREATOR =
            new Creator<ProcessErrorStateInfo>() {
        public ProcessErrorStateInfo createFromParcel(Parcel source) {
            return new ProcessErrorStateInfo(source);
        }
        public ProcessErrorStateInfo[] newArray(int size) {
            return new ProcessErrorStateInfo[size];
        }
    };

    private ProcessErrorStateInfo(Parcel source) {
        readFromParcel(source);
    }
}

FileObserver捕獲ANR異常,缺點是Android5.0低權限應用不能監(jiān)聽變化“、data/anr/traces.txt”瓮下,只能在root之后才可以翰铡。
詳細實現(xiàn)源碼:CrashHandler

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市讽坏,隨后出現(xiàn)的幾起案子锭魔,更是在濱河造成了極大的恐慌,老刑警劉巖路呜,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件迷捧,死亡現(xiàn)場離奇詭異织咧,居然都是意外死亡,警方通過查閱死者的電腦和手機漠秋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進店門笙蒙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人膛堤,你說我怎么就攤上這事手趣。” “怎么了肥荔?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵绿渣,是天一觀的道長。 經常有香客問我燕耿,道長中符,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任誉帅,我火速辦了婚禮淀散,結果婚禮上,老公的妹妹穿的比我還像新娘蚜锨。我一直安慰自己档插,他們只是感情好,可當我...
    茶點故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布亚再。 她就那樣靜靜地躺著郭膛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪氛悬。 梳的紋絲不亂的頭發(fā)上则剃,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天,我揣著相機與錄音如捅,去河邊找鬼棍现。 笑死,一個胖子當著我的面吹牛镜遣,可吹牛的內容都是我干的己肮。 我是一名探鬼主播,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼烈涮,長吁一口氣:“原來是場噩夢啊……” “哼朴肺!你這毒婦竟也來了?” 一聲冷哼從身側響起坚洽,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤戈稿,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后讶舰,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鞍盗,經...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡需了,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了般甲。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肋乍。...
    茶點故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖敷存,靈堂內的尸體忽然破棺而出墓造,到底是詐尸還是另有隱情,我是刑警寧澤锚烦,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布觅闽,位于F島的核電站,受9級特大地震影響涮俄,放射性物質發(fā)生泄漏蛉拙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一彻亲、第九天 我趴在偏房一處隱蔽的房頂上張望孕锄。 院中可真熱鬧,春花似錦苞尝、人聲如沸畸肆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽恼除。三九已至,卻和暖如春曼氛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背令野。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工舀患, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人气破。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓聊浅,卻偏偏與公主長得像,于是被迫代替她去往敵國和親现使。 傳聞我的和親對象是個殘疾皇子低匙,可洞房花燭夜當晚...
    茶點故事閱讀 45,630評論 2 359

推薦閱讀更多精彩內容