android log分析及異常關鍵字分析 啓動或退出APP執行過程 與過濾"ActivityManager |WindowManager" 標籤

private static final boolean IS_DEBUG_BUILD =  Build.TYPE.equals("eng") || Build.TYPE.equals("userdebug");


分析異常時往往需要關注的重要目錄:

/data/anr/traces.txt
/data/tombstones/tombstone_X
/data/system/dropbox/

Log.i("LogTag","------------", new Exception()); 人爲拋出異常  打印運行堆棧,此命令適用於源碼編譯中,但在APP中使用就會報錯,APP中可以這樣使用:

Log.i("LogTag","------------",“ ---”+new Exception());

Thread.currentThread().dumpStack(); //方法1

Log.d(TAG,"Gityuan", new RuntimeException("Gityuan")); //方法2

new RuntimeException("Gityuan").printStackTrace(); //方法3


MTK的mtkloger:

進入應用暗碼 : *#*#3646633#*#*
log的保存路徑   /storage/emulated/0/mtklog

如部分平板系統預裝撥號盤如何打開MTKlog

adb shell am start -n com.mediatek.mtklogger/com.mediatek.mtklogger.MainActivity

 

mtklog 的分類:MDLog、Mobile Log、Network Log,可能出現的aee_exp log

MD log:medom 相關底層的log

Mobile Log:主要是Android log 和kernel log

Network log:網絡相關log

aee_exp log :crash ANR 重啓相關的log輸出

對應log文件名稱爲:

crash_log :崩潰日誌,主要輸出 程序崩潰造成的crash log

events_log:事件日誌,主要輸出記錄各個activity週期及事件

kernel_log:底層驅動,按鍵,低內存相關log

sys_log:系統日誌,Exception定位點

radio_log:輸出通話,網絡狀態變化

main_log:詳盡輸出每一步的log

參考原文 :  https://blog.csdn.net/weixin_33473519/article/details/53434800?utm_source=blogxgwz
 


https://rayleeya.iteye.com/blog/1955652    此文對android的anr問題有詳細說明

ANR,是“Application Not Responding”的縮寫,即“應用程序無響應”。在Android中,ActivityManagerService(簡稱AMS)和WindowManagerService(簡稱WMS)會監測應用程序的響應時間,如果應用程序主線程(即UI線程)在超時時間內對輸入事件沒有處理完畢,或者對特定操作沒有執行完畢,就會出現ANR。對於輸入事件沒有處理完畢產生的ANR,Android會顯示一個對話框,提示用戶當前應用程序沒有響應,用戶可以選擇繼續等待或者關閉這個應用程序(也就是殺掉這個應用程序的進程)。

1:關鍵字搜索:

FATAL,leaked, block,Pid id XXX,crash,DALVIK THREADS, OOM,unfinished died

查找應用包名--快速定位ANR

 The application may be doing too much work on its main thread.

AndroidRuntime(xxxx): Shutting down VM

線程的狀態是native則表示當前正在執行jni,

聰明的你肯定已經知道,之所以trace信息會輸出到“/data/anr/traces.txt”文件中,就是系統屬性“dalvik.vm.stack-trace-file”設置的。你可以通過在設備的shell中使用setprop和getprop對系統屬性進行設置和讀取:

getprop  dalvik.vm.stack-trace-file

setprop dalvik.vm.stack-trace-file /tmp/stack-traces.txt

 


此 Dialog的java位置:

frameworks\base\services\core\java\com\android\server\am\AppNotRespondingDialog.java

 

alps\frameworks\base\services\core\java\com\android\server\am\AppErrors.java ::appNotResponding()

 此處發送Handler message爲  SHOW_NOT_RESPONDING_UI_MSG
 // Set the app's notResponding state, and look up the errorReportReceiver
            makeAppNotRespondingLocked(app,
                    activity != null ? activity.shortComponentName : null,
                    annotation != null ? "ANR " + annotation : "ANR",
                    info.toString());

            // Bring up the infamous App Not Responding dialog
            Message msg = Message.obtain();
            msg.what = ActivityManagerService.SHOW_NOT_RESPONDING_UI_MSG;
            msg.obj = new AppNotRespondingDialog.Data(app, activity, aboveSystem);

            mService.mUiHandler.sendMessage(msg);

接着會在ActivityManagerService.java類中接收此Message並對應處理

  alps\frameworks\base\services\core\java\com\android\server\am\ActivityManagerService.java

  final class UiHandler extends Handler {
        public UiHandler() {
            super(com.android.server.UiThread.get().getLooper(), null, true);
        }

        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
            case SHOW_ERROR_UI_MSG: {
                mAppErrors.handleShowAppErrorUi(msg);
                ensureBootCompleted();
            } break;
            case SHOW_NOT_RESPONDING_UI_MSG: {
                mAppErrors.handleShowAnrUi(msg);
                ensureBootCompleted();
            } break;

在AppError.java中的handleShowAppErrorUI()

            if (mService.canShowErrorDialogs() || showBackground) {
                dialogToShow = new AppNotRespondingDialog(mService, mContext, data);
                proc.anrDialog = dialogToShow;
            } else {
                MetricsLogger.action(mContext, MetricsProto.MetricsEvent.ACTION_APP_ANR,
                        AppNotRespondingDialog.CANT_SHOW);
                // Just kill the app if there is no dialog to be shown.
                mService.killAppAtUsersRequest(proc, null);
            }
        }
        // If we've created a crash dialog, show it without the lock held
        if (dialogToShow != null) {
            dialogToShow.show();
        }

兩個標籤同時過濾adb 命令:  adb  shell "logcat |grep -e ActivityManager: -e WindowManager:"

下面的打印爲了log信息減少,所以分別打印方便查閱 ,

C:\Users\User>adb logcat |findstr "ActivityManager"      \\點擊Launcher中圖標 打開APP DeskClock
08-12 06:35:09.605  1043  8961 I ActivityManager: START u0 {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.android.deskclock/.DeskClock bnds=[795,131][990
,423]} from uid 10015
08-12 06:35:09.703  1043  8961 V WindowManager: Changing focus from Window{cfe72a u0 com.android.launcher3/com.android.launcher3.Launcher} to null Callers=com.android.server.wm.WindowManagerService.se
tFocusedApp:2739 com.android.server.am.ActivityManagerService.setResumedActivityUncheckLocked:3325 com.android.server.am.ActivityStack.setResumedActivityLocked:2312 com.android.server.am.ActivityStack
.minimalResumeActivityLocked:1115
08-12 06:35:09.890  1043  1121 I ActivityManager: Displayed com.android.deskclock/.DeskClock: +201ms
--------------------------------------------------------------------------------
C:\Users\User>adb logcat -c|findstr "ActivityManager"

C:\Users\User>adb logcat |findstr "ActivityManager"         \\退出APP
08-12 06:35:29.715  1043  1078 V WindowManager: Changing focus from Window{4cebd29 u0 com.android.deskclock/com.android.deskclock.DeskClock} to null Callers=com.android.server.wm.WindowManagerService.
setFocusedApp:2739 com.android.server.am.ActivityManagerService.setResumedActivityUncheckLocked:3325 com.android.server.am.ActivityStack.setResumedActivityLocked:2312 com.android.server.am.ActivitySta
ck.resumeTopActivityInnerLocked:2694

User>adb logcat -c |findstr "WindowManager:"

User>adb logcat |findstr "WindowManager:"        //點擊Launcher中圖標 打開APP:DeskClock
21:06.149  1043  1315 V WindowManager: Set focused app to: AppWindowToken{24e89b8 token=Token{b72727a ActivityRecord{5decea5 u0 com.android.deskclock/.DeskClock t43}}} old focus=AppWindowToke
 token=Token{64857d6 ActivityRecord{eb9b98 u0 com.android.launcher3/.Launcher t33}}} moveFocusNow=true
21:06.149  1043  1315 V WindowManager: findFocusedWindow: No focusable windows.
21:06.149  1043  1315 V WindowManager: Changing focus from Window{cfe72a u0 com.android.launcher3/com.android.launcher3.Launcher} to null Callers=com.android.server.wm.WindowManagerService.se
pp:2739 com.android.server.am.ActivityManagerService.setResumedActivityUncheckLocked:3325 com.android.server.am.ActivityStack.setResumedActivityLocked:2312 com.android.server.am.ActivityStack
esumeActivityLocked:1115
21:06.149  1043  1315 D WindowManager: Input focus has changed to null
21:06.152  1043  1315 V WindowManager: findFocusedWindow: No focusable windows.
21:06.160  1043  6439 V WindowManager: findFocusedWindow: No focusable windows.
21:06.481  1043  2119 I WindowManager: Relayout Window{c7e57f5 u0 com.android.deskclock/com.android.deskclock.DeskClock}: oldVis=4 newVis=0 focusMayChange = true
21:06.487  1043  2119 V WindowManager: Changing focus from null to Window{c7e57f5 u0 com.android.deskclock/com.android.deskclock.DeskClock} Callers=com.android.server.wm.WindowManagerService.
indow:2179 com.android.server.wm.Session.relayout:235 android.view.IWindowSession$Stub.onTransact:286 com.android.server.wm.Session.onTransact:162
21:06.487  1043  2119 D WindowManager: Input focus has changed to Window{c7e57f5 u0 com.android.deskclock/com.android.deskclock.DeskClock}

-------------------------------------------------------------------------------------

User>adb logcat -c|findstr "WindowManager:"

User>adb logcat |findstr "WindowManager:"     //退出APP:DeskClock 到Launcher
21:27.964  1043  1226 D WindowManager: interceptKeyTi keyCode=4 down=false repeatCount=0 keyguardOn=false mHomePressed=false canceled=false metaState:0
21:27.984  1043  6439 V WindowManager: Set focused app to: AppWindowToken{fb1c0e3 token=Token{64857d6 ActivityRecord{eb9b98 u0 com.android.launcher3/.Launcher t33}}} old focus=AppWindowToken{
oken=Token{b72727a ActivityRecord{5decea5 u0 com.android.deskclock/.DeskClock t43}}} moveFocusNow=true
21:27.984  1043  6439 V WindowManager: findFocusedWindow: No focusable windows.
21:27.985  1043  6439 V WindowManager: Changing focus from Window{c7e57f5 u0 com.android.deskclock/com.android.deskclock.DeskClock} to null Callers=com.android.server.wm.WindowManagerService.
dApp:2739 com.android.server.am.ActivityManagerService.setResumedActivityUncheckLocked:3325 com.android.server.am.ActivityStack.setResumedActivityLocked:2312 com.android.server.am.ActivitySta
TopActivityInnerLocked:2694
21:27.985  1043  6439 D WindowManager: Input focus has changed to null
21:28.002  1043  1315 V WindowManager: findFocusedWindow: No focusable windows.
21:28.044  1043  6439 I WindowManager: Relayout Window{cfe72a u0 com.android.launcher3/com.android.launcher3.Launcher}: oldVis=4 newVis=0 focusMayChange = true
21:28.048  1043  6439 V WindowManager: Changing focus from null to Window{cfe72a u0 com.android.launcher3/com.android.launcher3.Launcher} Callers=com.android.server.wm.WindowManagerService.re
dow:2179 com.android.server.wm.Session.relayout:235 android.view.IWindowSession$Stub.onTransact:286 com.android.server.wm.Session.onTransact:162
21:28.048  1043  6439 D WindowManager: Input focus has changed to Window{cfe72a u0 com.android.launcher3/com.android.launcher3.Launcher}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章