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;
}
先附上日志截图,避免排版错乱。
文本日志
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();