diff options
author | Jeff Brown <jeffbrown@google.com> | 2013-10-18 02:08:19 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2013-10-18 02:08:20 +0000 |
commit | 82f31701141f5c3057b162cba1d57f78cbad5091 (patch) | |
tree | 3b79d5157a393c30b4a204dd3f9ec4164d571aa5 | |
parent | 6c3a638dd852634097447ca7fea9210539529110 (diff) | |
parent | 5182c780a8b42acd46a06d693ab63a0dd78c6d70 (diff) | |
download | frameworks_base-82f31701141f5c3057b162cba1d57f78cbad5091.zip frameworks_base-82f31701141f5c3057b162cba1d57f78cbad5091.tar.gz frameworks_base-82f31701141f5c3057b162cba1d57f78cbad5091.tar.bz2 |
Merge "Log view root, input and looper state in bug reports." into klp-dev
-rw-r--r-- | core/java/android/app/Activity.java | 28 | ||||
-rw-r--r-- | core/java/android/os/Looper.java | 25 | ||||
-rw-r--r-- | core/java/android/os/Message.java | 48 | ||||
-rw-r--r-- | core/java/android/os/MessageQueue.java | 25 | ||||
-rw-r--r-- | core/java/android/view/Choreographer.java | 12 | ||||
-rw-r--r-- | core/java/android/view/ViewRootImpl.java | 65 |
6 files changed, 139 insertions, 64 deletions
diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java index e29f8ea..193724d 100644 --- a/core/java/android/app/Activity.java +++ b/core/java/android/app/Activity.java @@ -58,6 +58,7 @@ import android.text.method.TextKeyListener; import android.util.AttributeSet; import android.util.EventLog; import android.util.Log; +import android.util.PrintWriterPrinter; import android.util.Slog; import android.util.SparseArray; import android.view.ActionMode; @@ -4846,36 +4847,19 @@ public class Activity extends ContextThemeWrapper writer.println(mChangingConfigurations); writer.print(innerPrefix); writer.print("mCurrentConfig="); writer.println(mCurrentConfig); + if (mLoaderManager != null) { writer.print(prefix); writer.print("Loader Manager "); writer.print(Integer.toHexString(System.identityHashCode(mLoaderManager))); writer.println(":"); mLoaderManager.dump(prefix + " ", fd, writer, args); } + mFragments.dump(prefix, fd, writer, args); - writer.print(prefix); writer.println("View Hierarchy:"); - dumpViewHierarchy(prefix + " ", writer, getWindow().getDecorView()); - } - private void dumpViewHierarchy(String prefix, PrintWriter writer, View view) { - writer.print(prefix); - if (view == null) { - writer.println("null"); - return; - } - writer.println(view.toString()); - if (!(view instanceof ViewGroup)) { - return; - } - ViewGroup grp = (ViewGroup)view; - final int N = grp.getChildCount(); - if (N <= 0) { - return; - } - prefix = prefix + " "; - for (int i=0; i<N; i++) { - dumpViewHierarchy(prefix, writer, grp.getChildAt(i)); - } + getWindow().getDecorView().getViewRootImpl().dump(prefix, fd, writer, args); + + mHandler.getLooper().dump(new PrintWriterPrinter(writer), prefix); } /** diff --git a/core/java/android/os/Looper.java b/core/java/android/os/Looper.java index 78c859e..21e9f6b 100644 --- a/core/java/android/os/Looper.java +++ b/core/java/android/os/Looper.java @@ -59,7 +59,6 @@ public final class Looper { final MessageQueue mQueue; final Thread mThread; - volatile boolean mRun; private Printer mLogging; @@ -187,7 +186,6 @@ public final class Looper { private Looper(boolean quitAllowed) { mQueue = new MessageQueue(quitAllowed); - mRun = true; mThread = Thread.currentThread(); } @@ -300,27 +298,12 @@ public final class Looper { } public void dump(Printer pw, String prefix) { - pw = PrefixPrinter.create(pw, prefix); - pw.println(this.toString()); - pw.println("mRun=" + mRun); - pw.println("mThread=" + mThread); - pw.println("mQueue=" + ((mQueue != null) ? mQueue : "(null")); - if (mQueue != null) { - synchronized (mQueue) { - long now = SystemClock.uptimeMillis(); - Message msg = mQueue.mMessages; - int n = 0; - while (msg != null) { - pw.println(" Message " + n + ": " + msg.toString(now)); - n++; - msg = msg.next; - } - pw.println("(Total messages: " + n + ")"); - } - } + pw.println(prefix + toString()); + mQueue.dump(pw, prefix + " "); } public String toString() { - return "Looper{" + Integer.toHexString(System.identityHashCode(this)) + "}"; + return "Looper (" + mThread.getName() + ", tid " + mThread.getId() + + ") {" + Integer.toHexString(System.identityHashCode(this)) + "}"; } } diff --git a/core/java/android/os/Message.java b/core/java/android/os/Message.java index 0abc149..51203a4 100644 --- a/core/java/android/os/Message.java +++ b/core/java/android/os/Message.java @@ -428,36 +428,48 @@ public final class Message implements Parcelable { public Message() { } + @Override public String toString() { return toString(SystemClock.uptimeMillis()); } String toString(long now) { - StringBuilder b = new StringBuilder(); - - b.append("{ what="); - b.append(what); + StringBuilder b = new StringBuilder(); + b.append("{ when="); + TimeUtils.formatDuration(when - now, b); + + if (target != null) { + if (callback != null) { + b.append(" callback="); + b.append(callback.getClass().getName()); + } else { + b.append(" what="); + b.append(what); + } - b.append(" when="); - TimeUtils.formatDuration(when-now, b); + if (arg1 != 0) { + b.append(" arg1="); + b.append(arg1); + } - if (arg1 != 0) { - b.append(" arg1="); - b.append(arg1); - } + if (arg2 != 0) { + b.append(" arg2="); + b.append(arg2); + } - if (arg2 != 0) { - b.append(" arg2="); - b.append(arg2); - } + if (obj != null) { + b.append(" obj="); + b.append(obj); + } - if (obj != null) { - b.append(" obj="); - b.append(obj); + b.append(" target="); + b.append(target.getClass().getName()); + } else { + b.append(" barrier="); + b.append(arg1); } b.append(" }"); - return b.toString(); } diff --git a/core/java/android/os/MessageQueue.java b/core/java/android/os/MessageQueue.java index d1b8213..799de5c 100644 --- a/core/java/android/os/MessageQueue.java +++ b/core/java/android/os/MessageQueue.java @@ -18,6 +18,7 @@ package android.os; import android.util.AndroidRuntimeException; import android.util.Log; +import android.util.Printer; import java.util.ArrayList; @@ -252,6 +253,7 @@ public final class MessageQueue { synchronized (this) { final int token = mNextBarrierToken++; final Message msg = Message.obtain(); + msg.when = when; msg.arg1 = token; Message prev = null; @@ -393,12 +395,16 @@ public final class MessageQueue { boolean isIdling() { synchronized (this) { - // If the loop is quitting then it must not be idling. - // We can assume mPtr != 0 when mQuitting is false. - return !mQuitting && nativeIsIdling(mPtr); + return isIdlingLocked(); } } + private boolean isIdlingLocked() { + // If the loop is quitting then it must not be idling. + // We can assume mPtr != 0 when mQuitting is false. + return !mQuitting && nativeIsIdling(mPtr); + } + void removeMessages(Handler h, int what, Object object) { if (h == null) { return; @@ -537,4 +543,17 @@ public final class MessageQueue { } } } + + void dump(Printer pw, String prefix) { + synchronized (this) { + long now = SystemClock.uptimeMillis(); + int n = 0; + for (Message msg = mMessages; msg != null; msg = msg.next) { + pw.println(prefix + "Message " + n + ": " + msg.toString(now)); + n++; + } + pw.println(prefix + "(Total messages: " + n + ", idling=" + isIdlingLocked() + + ", quitting=" + mQuitting + ")"); + } + } } diff --git a/core/java/android/view/Choreographer.java b/core/java/android/view/Choreographer.java index f28e4b5..f1523ae 100644 --- a/core/java/android/view/Choreographer.java +++ b/core/java/android/view/Choreographer.java @@ -23,6 +23,9 @@ import android.os.Message; import android.os.SystemClock; import android.os.SystemProperties; import android.util.Log; +import android.util.TimeUtils; + +import java.io.PrintWriter; /** * Coordinates the timing of animations, input and drawing. @@ -256,6 +259,15 @@ public final class Choreographer { return delayMillis <= frameDelay ? 0 : delayMillis - frameDelay; } + void dump(String prefix, PrintWriter writer) { + String innerPrefix = prefix + " "; + writer.print(prefix); writer.println("Choreographer:"); + writer.print(innerPrefix); writer.print("mFrameScheduled="); + writer.println(mFrameScheduled); + writer.print(innerPrefix); writer.print("mLastFrameTime="); + writer.println(TimeUtils.formatUptime(mLastFrameTimeNanos / 1000000)); + } + /** * Posts a callback to run on the next frame. * <p> diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 9461068..ab93084 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -77,8 +77,10 @@ import com.android.internal.policy.PolicyManager; import com.android.internal.view.BaseSurfaceHolder; import com.android.internal.view.RootViewSurfaceTaker; +import java.io.FileDescriptor; import java.io.IOException; import java.io.OutputStream; +import java.io.PrintWriter; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.HashSet; @@ -3458,6 +3460,12 @@ public final class ViewRootImpl implements ViewParent, finishInputEvent(q); } } + + void dump(String prefix, PrintWriter writer) { + if (mNext != null) { + mNext.dump(prefix, writer); + } + } } /** @@ -3595,6 +3603,16 @@ public final class ViewRootImpl implements ViewParent, mQueueLength -= 1; Trace.traceCounter(Trace.TRACE_TAG_INPUT, mTraceCounter, mQueueLength); } + + @Override + void dump(String prefix, PrintWriter writer) { + writer.print(prefix); + writer.print(getClass().getName()); + writer.print(": mQueueLength="); + writer.println(mQueueLength); + + super.dump(prefix, writer); + } } /** @@ -5201,6 +5219,53 @@ public final class ViewRootImpl implements ViewParent, mView.debug(); } + public void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) { + String innerPrefix = prefix + " "; + writer.print(prefix); writer.println("ViewRoot:"); + writer.print(innerPrefix); writer.print("mAdded="); writer.print(mAdded); + writer.print(" mRemoved="); writer.println(mRemoved); + writer.print(innerPrefix); writer.print("mConsumeBatchedInputScheduled="); + writer.println(mConsumeBatchedInputScheduled); + writer.print(innerPrefix); writer.print("mPendingInputEventCount="); + writer.println(mPendingInputEventCount); + writer.print(innerPrefix); writer.print("mProcessInputEventsScheduled="); + writer.println(mProcessInputEventsScheduled); + writer.print(innerPrefix); writer.print("mTraversalScheduled="); + writer.print(mTraversalScheduled); + if (mTraversalScheduled) { + writer.print(" (barrier="); writer.print(mTraversalBarrier); writer.println(")"); + } else { + writer.println(); + } + mFirstInputStage.dump(innerPrefix, writer); + + mChoreographer.dump(prefix, writer); + + writer.print(prefix); writer.println("View Hierarchy:"); + dumpViewHierarchy(innerPrefix, writer, mView); + } + + private void dumpViewHierarchy(String prefix, PrintWriter writer, View view) { + writer.print(prefix); + if (view == null) { + writer.println("null"); + return; + } + writer.println(view.toString()); + if (!(view instanceof ViewGroup)) { + return; + } + ViewGroup grp = (ViewGroup)view; + final int N = grp.getChildCount(); + if (N <= 0) { + return; + } + prefix = prefix + " "; + for (int i=0; i<N; i++) { + dumpViewHierarchy(prefix, writer, grp.getChildAt(i)); + } + } + public void dumpGfxInfo(int[] info) { info[0] = info[1] = 0; if (mView != null) { |