溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

給你一個Demo 看看這時你要怎么快速定位ANR?

發(fā)布時間:2020-08-07 21:50:20 來源:ITPUB博客 閱讀:130 作者:yilian 欄目:移動開發(fā)

前言?

我們程序員去面試的時候,做題必不可少。今天,就來給大家講解一下來自阿里巴巴的提問:給你一個Demo,你如何快速定位ANR

一、前期基礎(chǔ)知識儲備

1.ANR錯誤定義:在Android上,如果你的應(yīng)用程序有一段時間響應(yīng)不夠靈敏,系統(tǒng)會向用戶顯示一個對話框,這個對話框稱作“應(yīng)用程序無響應(yīng)”(ANR:Application Not Responding)對話框。用戶可以選擇“等待”而讓程序繼續(xù)運行,也可以選擇“強制關(guān)閉”。因此,在程序里對響應(yīng)性能的設(shè)計很重要,這樣,系統(tǒng)不會顯示ANR給用戶。

默認(rèn)情況下,在Android中Activity的最長執(zhí)行時間是5秒(主要類型),BroadcastReceiver的最長執(zhí)行時間的則是10秒,ServiceTimeout的最長執(zhí)行時間是20秒(少數(shù)類型)。超出就會提示應(yīng)用程序無響應(yīng)(ANR錯誤)。

給你一個Demo  看看這時你要怎么快速定位ANR?
image

2.ANR錯誤出現(xiàn)原因:只有當(dāng)應(yīng)用程序的UI線程響應(yīng)超時才會引起ANR 超時產(chǎn)生的原因包括:①當(dāng)前事件沒有機會處理,例如UI線程正在響應(yīng)另外的事件,當(dāng)前事件被某個事件給阻塞掉了;②當(dāng)前事件正在處理 但是由于耗時太長沒有能及時的完成。其他原因:③在BroadcastReceiver里做耗時的操作或計算;④CPU使用過高;⑤發(fā)生了死鎖;⑥耗時操作的動畫需要大量的計算工作,可能導(dǎo)致CPU負(fù)載過重。

二、ANR定位方式及優(yōu)化

1.ANR錯誤定位——如果開發(fā)機器上出現(xiàn)ANR問題時,系統(tǒng)會生成一個traces.txt的文件放在/data/anr下,最新的ANR信息在最開始部分。通過adb命令將其導(dǎo)出到本地,輸入以下字符:

$adb pull data/anr/traces.txt .

2.供選的優(yōu)化ANR問題的方式:

1)為了執(zhí)行一個長時間的耗時操作而創(chuàng)建一個工作線程最方便高效的方式是使用AsyncTask,只需要繼承AsyncTask并實現(xiàn)doInBackground()方法來執(zhí)行任務(wù)即可。為了把任務(wù)執(zhí)行的進度呈現(xiàn)給用戶,你可以執(zhí)行publishProgress()方法,這個方法會觸發(fā)onProgressUpdate()的回調(diào)方法。在onProgressUpdate()的回調(diào)方法中(它執(zhí)行在UI線程),你可以執(zhí)行通知用戶進度的操作,例如:

2)如果你實現(xiàn)了Thread或者HandlerThread,請確保你的UI線程不會因為等待工作線程的某個任務(wù)而去執(zhí)行Thread.wait()或者Thread.sleep()。UI線程不應(yīng)該去等待工作線程完成某個任務(wù),你的UI線程應(yīng)該提供一個Handler給其他工作線程,這樣工作線程能夠通過這個Handler在任務(wù)結(jié)束的時候通知UI線程。例如:
繼承Thread類

實現(xiàn)Runnable接口

使用HandlerThread

3)開發(fā)在日常的開發(fā)過程中使用Thread或者HandlerThread,可以嘗試調(diào)用Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND)設(shè)置較低的優(yōu)先級,否則仍然會降低程序響應(yīng),因為默認(rèn)Thread的優(yōu)先級和主線程相同。

4)Activity的onCreate和onResume回調(diào)中盡量避免耗時的代碼,應(yīng)該盡可能的做比較少的事情,其實,任何執(zhí)行在UI線程中的方法都應(yīng)該盡可能簡短快速。類似網(wǎng)絡(luò)或者DB操作等可能長時間執(zhí)行的操作,或者是類似調(diào)整bitmap大小等需要長時間計算的操作,都應(yīng)該執(zhí)行在工作線程中。

5)BroadcastReceiver中onReceive代碼也要盡量減少耗時。如果必須在onReceive方法中執(zhí)行耗時操作,建議使用IntentService進行處理,IntentService集開啟線程和自動關(guān)閉服務(wù)兩種功能于一身,本身非常靈活。

6)增加界面響應(yīng)性(交互層面),這是一個成熟應(yīng)用必備的標(biāo)志—通常來說,100ms - 200ms是用戶能夠察覺到卡頓的上限。如果你的程序在啟動階段有一個耗時的初始化操作,可以考慮顯示一個閃屏,要么盡快的顯示主界面,然后馬上顯示一個加載的對話框,異步加載數(shù)據(jù)。無論哪種情況,你都應(yīng)該顯示一個進度信息,以免用戶感覺程序有卡頓的情況。

三、輔助處理ANR問題的工具

1.Traceview - 系統(tǒng)性能分析工具,用于定位應(yīng)用代碼中的耗時操作

給你一個Demo  看看這時你要怎么快速定位ANR?
image

①選好應(yīng)用的進程,執(zhí)行一段應(yīng)用操作,從圖中的上半部分,可以看到各個線程的各個方法的執(zhí)行時間;

②從圖中的下半部分,可以該段操作中具體調(diào)用的方法和每個方法的執(zhí)行時間、執(zhí)行次數(shù)。占CPU的百分比;

給你一個Demo  看看這時你要怎么快速定位ANR?
image

該圖是具體的方法執(zhí)行時間分布圖,我們重點關(guān)注其中的“Incl Real Time”這一時間指標(biāo),其為方法的實際調(diào)用時間,單位毫秒,查看時點擊Incl Real Time進行排列,方法會根據(jù)時間長短進行排列,其中超過500ms的方法我們都該重點關(guān)注。

2.Systrace - Android4.1新增的應(yīng)用性能數(shù)據(jù)采樣和分析工具(與google引擎聯(lián)合開發(fā) 使用時借助chorme瀏覽器)

給你一個Demo  看看這時你要怎么快速定位ANR?
image

連接手機,進行一段操作,系統(tǒng)會生成一份Html文件,在谷歌瀏覽器中打開,如圖:

①Sytrace會顯示在這段操作期間所有的進程信息,在其中找到自己的進程,可以看到在測試進程中,我們定位UI Thread,可以看到里面的系統(tǒng)方法,這是UI渲染時的調(diào)用方法,上面有一個個的圈,綠色圈代表幀渲染時間是16.6ms(Android系統(tǒng)渲染UI界面時間為1秒60幀,每幀即16.6ms),超過該值的幀用紅色圈標(biāo)注;

②點擊紅色圈的標(biāo)注幀,可以看到Sytrace給出的Alert,具體查看可發(fā)現(xiàn),給出了該幀具體的渲染時間為36.71ms,超過16.6ms,UI渲染時會發(fā)生掉幀的情況,即卡頓,再往下看,可以看到系統(tǒng)給出的建議和超時的主要方法。拿到這個方法再結(jié)合Traceview工具,進行具體分析,找到自己的代碼,進行優(yōu)化,減少耗時。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI