Android 性能優(yōu)化11 --- crash優(yōu)化01(crash原理)

一. 造成系統(tǒng)崩潰的主要原因

1.未捕獲的異常

java + native

2.ANR
3.WTF(What a Terrible Failure)

一般指系統(tǒng)中自己編碼沒(méi)有按照android要求進(jìn)行(比如native沒(méi)有返回值)

二. 系統(tǒng)崩潰所謂優(yōu)化到底要做什么亏镰?

1.規(guī)避問(wèn)題为黎,優(yōu)化用戶(hù)體驗(yàn)
2.收集信息上傳,便于分析

三. 學(xué)習(xí)思路

1. 系統(tǒng)如何對(duì)于這一類(lèi)問(wèn)題進(jìn)行處理
2.結(jié)合framework認(rèn)知榕酒,給出特殊解決方案
3. 日志信息采集

四. 拋出異常導(dǎo)致崩潰分析

1. main函數(shù)啟用本身作為主線程存在涩堤,需要關(guān)注類(lèi)Thread
2.Thread.dispatchUncaughtException

JVM在處理未經(jīng)捕獲的異常時(shí)眷蜓,會(huì)調(diào)用當(dāng)前dispatchUncaughtException函數(shù)進(jìn)行處理。
image.png

如果沒(méi)有設(shè)置uncaughtExceptionHandler胎围,將使用線程所在的線程組來(lái)處理這個(gè)未捕獲異常吁系。線程組ThreadGroup實(shí)現(xiàn)了UncaughtExceptionHandler,所以可以用來(lái)處理未捕獲異常白魂。
image.png
3.ThreadGroup

默認(rèn)情況下汽纤,線程組處理未捕獲異常的邏輯是,首先將異常消息通知給父線程組然后嘗試?yán)靡粋€(gè)默認(rèn)的defaultUncaughtExceptionHandler來(lái)處理異常福荸,如果沒(méi)有默認(rèn)的異常處理器,則將錯(cuò)誤信息輸出到System.err
image.png
4.Thread.setUncaughtExceptionHandler

對(duì)外提供設(shè)置Handler功能
image.png
5.思考系統(tǒng)是否會(huì)有地方默認(rèn)給我們?cè)O(shè)置了Handler
6.認(rèn)識(shí)RuntimeInit

a.RuntimeInit運(yùn)行時(shí)初始化進(jìn)程
初始化運(yùn)行的一系列信息,其中包含異常處理

b.main方法
image.png

c.commonInit方法
當(dāng)前線程中設(shè)置了setDefaultUncaughtExceptionHandler其類(lèi)型未KillApplicationHandler
image.png
7.KillApplicationHandler

android內(nèi)部默認(rèn)初始化設(shè)置的主線程異常處理方案
image.png

方法總結(jié):

  • 調(diào)用當(dāng)前ActivityThread的當(dāng)前線程,直接stopProFling
  • 上報(bào)AMS崩潰異常信息
  • 在最終的 finally中直接kill掉進(jìn)程且退出當(dāng)前進(jìn)程赞赖。
8.結(jié)論
  • JVM通過(guò)調(diào)用dispatchUncaughtException來(lái)進(jìn)行未捕獲異常處理。
  • 具體對(duì)應(yīng)的提供處理能力的是UncaughtExceptionHandler這個(gè)類(lèi)冤灾。
  • 默認(rèn)ThreadGroup提供日志打印處理前域。
  • 但是在進(jìn)程環(huán)境初始化時(shí)RuntimeInit提供殺死進(jìn)程的能力。
  • 我們可以編寫(xiě)Handler處理類(lèi)來(lái)進(jìn)行未捕獲異常處理瞳购。

五. AMS如何承接應(yīng)用的異常信息上報(bào)

1.handleApplicationCrash

在KillApplicationHandler類(lèi)中的uncaughtException方法话侄,可以看到ActivityManager.getServie().handleApplicationCrash被調(diào)用
image.png
2.handleApplicationCrash
image.png

如果app為null,processName就設(shè)置為system_server,意思是如果沒(méi)有來(lái)源,默認(rèn)判斷是系統(tǒng)進(jìn)程自己学赛。

3.handleApplicationCrashInner

進(jìn)行系統(tǒng)日志輸出年堆,具體處理在addErrorToDropBox
image.png
4.addErrorToDropBox

無(wú)論是crash,native_crash,ANR或是WTF,最終都是來(lái)到這里盏浇。

六. 對(duì)于native crash系統(tǒng)如何做的處理

native_crash的崩潰處理变丧,是有AMS提供一個(gè)NativeCrashListener線程監(jiān)聽(tīng)對(duì)應(yīng)的文件數(shù)據(jù)

1.起始路徑

SystemServer.run --> startOtherServices --> AMS.startObservingNativeCrashes
image.png
2.NativeCrashListener
image.png
  • 通信機(jī)制建立
    image.png

    File socketFile = new File(DEBUGGERD_SOCKET_PATH);//建立一個(gè)信號(hào)機(jī)制通信點(diǎn)。
    UnixSocketAddress socketAddr = UnixSocketAddress.createFileSystem(DEBUGGERD_SOCKET_PATH)绢掰;//建立通信管道

  • 接收數(shù)據(jù)
    image.png

peerFd = Os.accept(serverFd, null);//觸發(fā)異常信息

  • 處理數(shù)據(jù)

    consumeNativeCrashData(peerFd);
    image.png
  • 封裝數(shù)據(jù)痒蓬,提交AMS處理

    將數(shù)據(jù)封裝成字符串提交給NativeCrashReporter處理
    image.png

    將數(shù)據(jù)封裝后提交AMS處理。其實(shí)都是交給handleApplicationCrashInner函數(shù)滴劲,只不過(guò)類(lèi)型不一樣而已攻晒,也就是最終數(shù)據(jù)都是通過(guò)AMS的addErrorToDropBix函數(shù)進(jìn)行具體處理
    image.png

七. 系統(tǒng)如何處理ANR異常數(shù)據(jù)

1.AnrHelper.appnotResonding

將對(duì)應(yīng)的數(shù)據(jù)封裝成一個(gè)ANR信息包加入到一個(gè)列表中然后愛(ài)妻一個(gè)線程進(jìn)行具體處理
image.png
2.startAnrConsumerIfNeeded
image.png
image.png
3.AnrConsumerThread

在當(dāng)前信息包中回調(diào)了AnrRecord.appNotResponding
image.png

AnrRecord中又會(huì)回調(diào)到ProcressRecord
image.png
4.ProcressRecord.appNotResponding
  • 記錄ANR數(shù)據(jù)到SLOG(framework日志體系中)
  • 記錄ANR數(shù)據(jù)到LOG(主日志體系中)
  • dump具體數(shù)據(jù)到指定文件中
  • 調(diào)用AMS.addErrorDropBox上報(bào)信息
    image.png

八. addErrorToDropBox

總結(jié):不管是crash,native_crash,ANR或是WTF,最終都是來(lái)自AMS.addErrorToDropBox班挖,交由它去處理鲁捏。

1.添加頭信息
image.png
2.讀取對(duì)應(yīng)異常數(shù)據(jù)并拼裝成字符數(shù)據(jù)
image.png
3.交給DropBoxManager進(jìn)行錄入
image.png
image.png

九. DropBoxManager

文件輸入寫(xiě)入
image.png

十. 思考:如何進(jìn)行異常捕獲?并且數(shù)據(jù)上傳萧芙?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末给梅,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子双揪,更是在濱河造成了極大的恐慌动羽,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件渔期,死亡現(xiàn)場(chǎng)離奇詭異运吓,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)羽德,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)几莽,“玉大人迅办,你說(shuō)我怎么就攤上這事宅静。” “怎么了站欺?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵姨夹,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我矾策,道長(zhǎng)磷账,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任贾虽,我火速辦了婚禮逃糟,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蓬豁。我一直安慰自己绰咽,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布地粪。 她就那樣靜靜地躺著取募,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蟆技。 梳的紋絲不亂的頭發(fā)上玩敏,一...
    開(kāi)封第一講書(shū)人閱讀 51,541評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音质礼,去河邊找鬼旺聚。 笑死,一個(gè)胖子當(dāng)著我的面吹牛眶蕉,可吹牛的內(nèi)容都是我干的砰粹。 我是一名探鬼主播,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼妻坝,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼伸眶!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起刽宪,我...
    開(kāi)封第一講書(shū)人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤厘贼,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后圣拄,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體嘴秸,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了岳掐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片凭疮。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖串述,靈堂內(nèi)的尸體忽然破棺而出执解,到底是詐尸還是另有隱情,我是刑警寧澤纲酗,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布衰腌,位于F島的核電站,受9級(jí)特大地震影響觅赊,放射性物質(zhì)發(fā)生泄漏右蕊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一吮螺、第九天 我趴在偏房一處隱蔽的房頂上張望饶囚。 院中可真熱鬧,春花似錦鸠补、人聲如沸萝风。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)闹丐。三九已至,卻和暖如春被因,著一層夾襖步出監(jiān)牢的瞬間卿拴,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工梨与, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留堕花,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓粥鞋,卻偏偏與公主長(zhǎng)得像缘挽,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子呻粹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

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

  • 性能的優(yōu)化是一個(gè)老生常談的點(diǎn)壕曼,也是一個(gè)比較重要的點(diǎn)。做過(guò)一點(diǎn)性能優(yōu)化的工作等浊,現(xiàn)在對(duì)工作中的優(yōu)化點(diǎn)做一個(gè)總結(jié)腮郊。如有錯(cuò)...
    Xander_Wang閱讀 391評(píng)論 0 1
  • 用兩張圖告訴你,為什么你的 App 會(huì)卡頓? - Android - 掘金 Cover 有什么料筹燕? 從這篇文章中你...
    hw1212閱讀 12,724評(píng)論 2 59
  • 近來(lái)對(duì)之前做優(yōu)化學(xué)習(xí)記錄的一些知識(shí)點(diǎn)進(jìn)行了以下簡(jiǎn)單的總結(jié)轧飞,主要集中在以下幾個(gè)方面: 1.Systrace2.嚴(yán)格模...
    jimjayce閱讀 14,522評(píng)論 4 33
  • 1衅鹿、什么是線程池 一個(gè)對(duì)線程進(jìn)行統(tǒng)一管理,統(tǒng)一調(diào)度的的工具过咬。他可以重用存在線程大渤,減少線程的創(chuàng)建和銷(xiāo)毀,從而減少資源...
    五道杠小學(xué)生閱讀 832評(píng)論 0 1
  • 前述 一個(gè)好的app除了有吸引人的功能, 美麗的交互之外,性能也至關(guān)重要,作為一個(gè)技術(shù)人員,在這里當(dāng)然只能講技術(shù)了...
    唐小鵬閱讀 2,502評(píng)論 0 23