Android JAVA源码之打印调用栈

来源:互联网 发布:企业网络推广方案 编辑:程序博客网 时间:2024/06/14 10:45

Android JAVA源码之打印调用栈


以PowerManagerService中的一段代码为例:

    private boolean wakeUpNoUpdateLocked(long eventTime, String reason, int reasonUid,            String opPackageName, int opUid) {        if (DEBUG) {            StackTraceElement[] stack = new Throwable().getStackTrace();//输出wakeUpNoUpdateLocked的调用栈            for (StackTraceElement element : stack)            {                Slog.d(TAG, "   |----" + element.toString());            }        }        if (DEBUG_SPEW) {            Slog.d(TAG, "wakeUpNoUpdateLocked: eventTime=" + eventTime                    + ", reason=" + reason + ", uid=" + reasonUid);        }        if (reason == PowerManager.WAKE_UP_REASON_SHUTDOWN) {            synchronized (mLock) {                mShutdownFlag = false;                Slog.d(TAG, "mShutdownFlag = " + mShutdownFlag);                mDirty |= DIRTY_SETTINGS;                updatePowerStateLocked();                return true;            }        }        if (eventTime < mLastSleepTime || mWakefulness == WAKEFULNESS_AWAKE                || !mBootCompleted || !mSystemReady) {            return false;        }        Trace.traceBegin(Trace.TRACE_TAG_POWER, "wakeUp");        try {            switch (mWakefulness) {                case WAKEFULNESS_ASLEEP:                    Slog.i(TAG, "Waking up from sleep (uid " + reasonUid +")...");                    break;                case WAKEFULNESS_DREAMING:                    Slog.i(TAG, "Waking up from dream (uid " + reasonUid +")...");                    break;                case WAKEFULNESS_DOZING:                    Slog.i(TAG, "Waking up from dozing (uid " + reasonUid +")...");                    break;            }            mLastWakeTime = eventTime;            setWakefulnessLocked(WAKEFULNESS_AWAKE, 0);            mNotifier.onWakeUp(reason, reasonUid, opPackageName, opUid);            userActivityNoUpdateLocked(                    eventTime, PowerManager.USER_ACTIVITY_EVENT_OTHER, 0, reasonUid);        } finally {            Trace.traceEnd(Trace.TRACE_TAG_POWER);        }        return true;    }


输出的LOG如下:

先附上日志截图,避免排版错乱。

文本日志

07-12 04:25:24.848133  1180  1207 D PowerManagerService: |----com.android.server.power.PowerManagerService.goToSleepNoUpdateLocked(PowerManagerService.java:1464)07-12 04:25:24.848330  1180  1207 D PowerManagerService: |----com.android.server.power.PowerManagerService.updateWakefulnessLocked(PowerManagerService.java:2109)07-12 04:25:24.848434  1180  1207 D PowerManagerService: |----com.android.server.power.PowerManagerService.updatePowerStateLocked(PowerManagerService.java:1676)07-12 04:25:24.848531  1180  1207 D PowerManagerService: |----com.android.server.power.PowerManagerService.handleUserActivityTimeout(PowerManagerService.java:2035)07-12 04:25:24.848632  1180  1207 D PowerManagerService: |----com.android.server.power.PowerManagerService.-wrap18(PowerManagerService.java)07-12 04:25:24.848728  1180  1207 D PowerManagerService: |----com.android.server.power.PowerManagerService$PowerManagerHandler.handleMessage(PowerManagerService.java:3390)07-12 04:25:24.848835  1180  1207 D PowerManagerService: |----android.os.Handler.dispatchMessage(Handler.java:110)07-12 04:25:24.848941  1180  1207 D PowerManagerService: |----android.os.Looper.loop(Looper.java:203)07-12 04:25:24.849034  1180  1207 D PowerManagerService: |----android.os.HandlerThread.run(HandlerThread.java:61)07-12 04:25:24.849123  1180  1207 D PowerManagerService: |----com.android.server.ServiceThread.run(ServiceThread.java:46)07-12 04:25:24.849207  1180  1207 I PowerManagerService: Going to sleep due to screen timeout (uid 1000)...07-12 04:25:24.849337  1180  1207 D PowerManagerNotifier: onWakefulnessChangeStarted: wakefulness=3, reason=2, interactive=false


[小结]

在JAVA中可以使用new Throwable().getStackTrace()的方式获取某函数的被调栈过程。

StackTraceElement[] stack = new Throwable().getStackTrace();


原创粉丝点击