anr日志導(dǎo)出及分析

anr發(fā)生原因

Application Not Responding(簡(jiǎn)稱:ANR)指應(yīng)用中一些特定的事件(如用戶觸摸事件豺裆、廣播等)在應(yīng)用的主線程沒(méi)有在規(guī)定的時(shí)間內(nèi)處理完柏副,系統(tǒng)自動(dòng)做出終止應(yīng)用運(yùn)行的響應(yīng)。Android系統(tǒng)中匀泊,ActivityManagerService(簡(jiǎn)稱AMS)和WindowManagerService(簡(jiǎn)稱WMS)會(huì)檢測(cè)App的響應(yīng)時(shí)間醇王,如果App在特定時(shí)間無(wú)法相應(yīng)屏幕觸摸或鍵盤輸入時(shí)間,或者特定事件沒(méi)有處理完畢,就會(huì)出現(xiàn)ANR原茅。
anr出現(xiàn)的場(chǎng)景:
InputDispatching Timeout:5秒內(nèi)無(wú)法響應(yīng)屏幕觸摸事件或鍵盤輸入事件牍陌。
BroadcastQueue Timeout :在執(zhí)行前臺(tái)廣播(BroadcastReceiver)的onReceive()函數(shù)時(shí)10秒沒(méi)有處理完成,后臺(tái)為60秒员咽。
Service Timeout :前臺(tái)服務(wù)20秒內(nèi)毒涧,后臺(tái)服務(wù)在200秒內(nèi)沒(méi)有執(zhí)行完畢。
ContentProvider Timeout :ContentProvider的publish在10s內(nèi)沒(méi)進(jìn)行完贝室。

1契讲、查看是否有anr文件

在命令行窗口
adb shell
ls adb /data/anr


adb查詢anr日志.PNG

2、導(dǎo)出anr日志

法1:
在android studio terminal窗口
adb bugreport

導(dǎo)出anr日志.PNG

法2:
打開(kāi)CMD小黑框滑频,進(jìn)入到Android SDK 目錄下的platform-tools文件夾下面直接輸出 : adb logcat 復(fù)制粘貼到一個(gè)txt文本下捡偏,方便稍后查看
法3:
執(zhí)行adb pull /data/anr/traces.txt D:\traces.txt 輸出traces日志。

anr日志分析

例1

                try {
                    Thread.sleep(9000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

在activity中按鈕點(diǎn)擊后在主線程執(zhí)行sleep操作峡迷。導(dǎo)出的anr日志如下:


主線程sleep導(dǎo)致anr分析.PNG

搜索DALVIK_THREADS银伟,找到第一個(gè),然后看主線程main绘搞,tid是線程id彤避。然后線程狀態(tài)是Sleeping。繼續(xù)往下看堆椇幌剑可以看到是因?yàn)榘粹o點(diǎn)擊后sleep時(shí)間過(guò)長(zhǎng)琉预,導(dǎo)致后續(xù)點(diǎn)擊事件無(wú)法及時(shí)處理導(dǎo)致。

各參數(shù)含義:
group:線程所處的線程組
sCount: 線程被正常掛起的次數(shù)
dsCount: 線程因調(diào)試而掛起次數(shù)
nice:線程的調(diào)度有優(yōu)先級(jí)
utm:線程在用戶態(tài)中調(diào)度時(shí)間值
stm:線程在內(nèi)核態(tài)中的調(diào)度時(shí)間值
core:最后執(zhí)行這個(gè)線程的CPU核序號(hào)

例2

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private static final String TAG = "MainActivity";
    private Button button;
    private Button button2;
    private Button btnMVTest;
    private Object object= new Object();
    private MyLock myLock = new MyLock();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViews();
    }

    private void findViews() {
        button = findViewById(R.id.button);
        button2 = findViewById(R.id.button2);
        btnMVTest = findViewById(R.id.btnMVTest);
        button.setOnClickListener(this);
        button2.setOnClickListener(this);
        btnMVTest.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        int viewId = v.getId();
        switch (viewId){
            case R.id.button2:
                testBlock();
                break;
            case R.id.btnMVTest:
                Log.e(TAG, "onClick: mainThread="+Thread.currentThread().getName()+" tid="+Thread.currentThread().getId());
                doSqlQuery();
                break;
        }
    }

    private void testBlock(){
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (myLock){
                    try {
                        doSqlQuery();
                        Thread.sleep(11000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        });
        thread.setName("DTestBlock");
        thread.start();
    }

    private void doSqlQuery(){
        synchronized (myLock){
            Log.e(TAG, "doThreadBlcok: 被鎖住的函數(shù) threadName="+Thread.currentThread().getName()+" threadId="+Thread.currentThread().getId());
        }
    }

    private class MyLock{

    }
}

看下anr日志蒿褂。


主線程阻塞導(dǎo)致anr分析.PNG

可以看到主線程處于Blocked(阻塞)狀態(tài)圆米,為何阻塞:

- waiting to lock <0x0b19381d> (a com.example.router.MainActivity$MyLock) held by thread 3

嘗試鎖定MyLock實(shí)例對(duì)象,但是它被線程3所持有啄栓。


線程3sleep.PNG

線程3執(zhí)行了sleep娄帖,在sleep的時(shí)間段內(nèi),沒(méi)有釋放對(duì)象鎖昙楚。導(dǎo)致主線程獲取不到對(duì)象鎖而處于阻塞狀態(tài)近速,后續(xù)點(diǎn)擊事件響應(yīng)不了,從而導(dǎo)致anr桂肌。

3数焊、總結(jié)
anr是比較嚴(yán)重的性能問(wèn)題,對(duì)用戶體驗(yàn)影響較大崎场。而且手動(dòng)導(dǎo)出anr日志有時(shí)并沒(méi)那么方便佩耳,可以考慮使用第三方性能檢測(cè)工具如bugly等,簡(jiǎn)化anr的排查谭跨。

參考:
http://www.reibang.com/p/eb6826c40e05

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末干厚,一起剝皮案震驚了整個(gè)濱河市李滴,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蛮瞄,老刑警劉巖所坯,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異挂捅,居然都是意外死亡芹助,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門闲先,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)状土,“玉大人,你說(shuō)我怎么就攤上這事伺糠∶晌剑” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵训桶,是天一觀的道長(zhǎng)累驮。 經(jīng)常有香客問(wèn)我,道長(zhǎng)舵揭,這世上最難降的妖魔是什么谤专? 我笑而不...
    開(kāi)封第一講書人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮琉朽,結(jié)果婚禮上毒租,老公的妹妹穿的比我還像新娘。我一直安慰自己箱叁,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布惕医。 她就那樣靜靜地躺著耕漱,像睡著了一般。 火紅的嫁衣襯著肌膚如雪抬伺。 梳的紋絲不亂的頭發(fā)上螟够,一...
    開(kāi)封第一講書人閱讀 51,688評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音峡钓,去河邊找鬼妓笙。 笑死,一個(gè)胖子當(dāng)著我的面吹牛能岩,可吹牛的內(nèi)容都是我干的寞宫。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼拉鹃,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼辈赋!你這毒婦竟也來(lái)了鲫忍?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤钥屈,失蹤者是張志新(化名)和其女友劉穎悟民,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體篷就,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡射亏,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了竭业。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鸦泳。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖永品,靈堂內(nèi)的尸體忽然破棺而出做鹰,到底是詐尸還是另有隱情,我是刑警寧澤鼎姐,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布钾麸,位于F島的核電站,受9級(jí)特大地震影響炕桨,放射性物質(zhì)發(fā)生泄漏饭尝。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一献宫、第九天 我趴在偏房一處隱蔽的房頂上張望钥平。 院中可真熱鬧,春花似錦姊途、人聲如沸涉瘾。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)立叛。三九已至,卻和暖如春贡茅,著一層夾襖步出監(jiān)牢的瞬間秘蛇,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工顶考, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留赁还,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓驹沿,卻偏偏與公主長(zhǎng)得像艘策,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子甚负,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355