Merge change I775e1ec0 into eclair

* changes:
  Debugging for issue #2250075: Desk dock clock app sometimes doesn't
This commit is contained in:
Android (Google) Code Review
2009-11-11 18:16:05 -08:00
6 changed files with 145 additions and 53 deletions

View File

@@ -309,15 +309,22 @@ public class ActivityInfo extends ComponentInfo
public void dump(Printer pw, String prefix) { public void dump(Printer pw, String prefix) {
super.dumpFront(pw, prefix); super.dumpFront(pw, prefix);
pw.println(prefix + "permission=" + permission); if (permission != null) {
pw.println(prefix + "permission=" + permission);
}
pw.println(prefix + "taskAffinity=" + taskAffinity pw.println(prefix + "taskAffinity=" + taskAffinity
+ " targetActivity=" + targetActivity); + " targetActivity=" + targetActivity);
pw.println(prefix + "launchMode=" + launchMode if (launchMode != 0 || flags != 0 || theme != 0) {
+ " flags=0x" + Integer.toHexString(flags) pw.println(prefix + "launchMode=" + launchMode
+ " theme=0x" + Integer.toHexString(theme)); + " flags=0x" + Integer.toHexString(flags)
pw.println(prefix + "screenOrientation=" + screenOrientation + " theme=0x" + Integer.toHexString(theme));
+ " configChanges=0x" + Integer.toHexString(configChanges) }
+ " softInputMode=0x" + Integer.toHexString(softInputMode)); if (screenOrientation != SCREEN_ORIENTATION_UNSPECIFIED
|| configChanges != 0 || softInputMode != 0) {
pw.println(prefix + "screenOrientation=" + screenOrientation
+ " configChanges=0x" + Integer.toHexString(configChanges)
+ " softInputMode=0x" + Integer.toHexString(softInputMode));
}
super.dumpBack(pw, prefix); super.dumpBack(pw, prefix);
} }

View File

@@ -270,21 +270,31 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable {
public void dump(Printer pw, String prefix) { public void dump(Printer pw, String prefix) {
super.dumpFront(pw, prefix); super.dumpFront(pw, prefix);
pw.println(prefix + "className=" + className); if (className != null) {
pw.println(prefix + "permission=" + permission pw.println(prefix + "className=" + className);
+ " uid=" + uid); }
pw.println(prefix + "taskAffinity=" + taskAffinity); if (permission != null) {
pw.println(prefix + "theme=0x" + Integer.toHexString(theme)); pw.println(prefix + "permission=" + permission);
}
pw.println(prefix + "uid=" + uid + " taskAffinity=" + taskAffinity);
if (theme != 0) {
pw.println(prefix + "theme=0x" + Integer.toHexString(theme));
}
pw.println(prefix + "flags=0x" + Integer.toHexString(flags) pw.println(prefix + "flags=0x" + Integer.toHexString(flags)
+ " processName=" + processName); + " processName=" + processName);
pw.println(prefix + "sourceDir=" + sourceDir); pw.println(prefix + "sourceDir=" + sourceDir);
pw.println(prefix + "publicSourceDir=" + publicSourceDir); pw.println(prefix + "publicSourceDir=" + publicSourceDir);
pw.println(prefix + "sharedLibraryFiles=" + sharedLibraryFiles);
pw.println(prefix + "dataDir=" + dataDir); pw.println(prefix + "dataDir=" + dataDir);
pw.println(prefix + "targetSdkVersion=" + targetSdkVersion); if (sharedLibraryFiles != null) {
pw.println(prefix + "enabled=" + enabled); pw.println(prefix + "sharedLibraryFiles=" + sharedLibraryFiles);
pw.println(prefix + "manageSpaceActivityName="+manageSpaceActivityName); }
pw.println(prefix + "description=0x"+Integer.toHexString(descriptionRes)); pw.println(prefix + "enabled=" + enabled + " targetSdkVersion=" + targetSdkVersion);
if (manageSpaceActivityName != null) {
pw.println(prefix + "manageSpaceActivityName="+manageSpaceActivityName);
}
if (descriptionRes != 0) {
pw.println(prefix + "description=0x"+Integer.toHexString(descriptionRes));
}
super.dumpBack(pw, prefix); super.dumpBack(pw, prefix);
} }

View File

@@ -141,11 +141,15 @@ public class PackageItemInfo {
} }
protected void dumpFront(Printer pw, String prefix) { protected void dumpFront(Printer pw, String prefix) {
pw.println(prefix + "name=" + name); if (name != null) {
pw.println(prefix + "name=" + name);
}
pw.println(prefix + "packageName=" + packageName); pw.println(prefix + "packageName=" + packageName);
pw.println(prefix + "labelRes=0x" + Integer.toHexString(labelRes) if (labelRes != 0 || nonLocalizedLabel != null || icon != 0) {
+ " nonLocalizedLabel=" + nonLocalizedLabel pw.println(prefix + "labelRes=0x" + Integer.toHexString(labelRes)
+ " icon=0x" + Integer.toHexString(icon)); + " nonLocalizedLabel=" + nonLocalizedLabel
+ " icon=0x" + Integer.toHexString(icon));
}
} }
protected void dumpBack(Printer pw, String prefix) { protected void dumpBack(Printer pw, String prefix) {

View File

@@ -409,6 +409,13 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
final ArrayList<BroadcastRecord> mOrderedBroadcasts final ArrayList<BroadcastRecord> mOrderedBroadcasts
= new ArrayList<BroadcastRecord>(); = new ArrayList<BroadcastRecord>();
/**
* Historical data of past broadcasts, for debugging.
*/
static final int MAX_BROADCAST_HISTORY = 100;
final BroadcastRecord[] mBroadcastHistory
= new BroadcastRecord[MAX_BROADCAST_HISTORY];
/** /**
* Set when we current have a BROADCAST_INTENT_MSG in flight. * Set when we current have a BROADCAST_INTENT_MSG in flight.
*/ */
@@ -9391,6 +9398,17 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
} }
} }
pw.println(" ");
pw.println(" Historical broadcasts:");
for (int i=0; i<MAX_BROADCAST_HISTORY; i++) {
BroadcastRecord r = mBroadcastHistory[i];
if (r == null) {
break;
}
pw.println(" Historical Broadcast #" + i + ":");
r.dump(pw, " ");
}
pw.println(" "); pw.println(" ");
pw.println(" mBroadcastsScheduled=" + mBroadcastsScheduled); pw.println(" mBroadcastsScheduled=" + mBroadcastsScheduled);
if (mStickyBroadcasts != null) { if (mStickyBroadcasts != null) {
@@ -11610,7 +11628,7 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
Intent intent = (Intent)allSticky.get(i); Intent intent = (Intent)allSticky.get(i);
BroadcastRecord r = new BroadcastRecord(intent, null, BroadcastRecord r = new BroadcastRecord(intent, null,
null, -1, -1, null, receivers, null, 0, null, null, null, -1, -1, null, receivers, null, 0, null, null,
false, true); false, true, true);
if (mParallelBroadcasts.size() == 0) { if (mParallelBroadcasts.size() == 0) {
scheduleBroadcastsLocked(); scheduleBroadcastsLocked();
} }
@@ -11835,7 +11853,7 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
BroadcastRecord r = new BroadcastRecord(intent, callerApp, BroadcastRecord r = new BroadcastRecord(intent, callerApp,
callerPackage, callingPid, callingUid, requiredPermission, callerPackage, callingPid, callingUid, requiredPermission,
registeredReceivers, resultTo, resultCode, resultData, map, registeredReceivers, resultTo, resultCode, resultData, map,
ordered, false); ordered, sticky, false);
if (DEBUG_BROADCAST) Log.v( if (DEBUG_BROADCAST) Log.v(
TAG, "Enqueueing parallel broadcast " + r TAG, "Enqueueing parallel broadcast " + r
+ ": prev had " + mParallelBroadcasts.size()); + ": prev had " + mParallelBroadcasts.size());
@@ -11914,7 +11932,8 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
|| resultTo != null) { || resultTo != null) {
BroadcastRecord r = new BroadcastRecord(intent, callerApp, BroadcastRecord r = new BroadcastRecord(intent, callerApp,
callerPackage, callingPid, callingUid, requiredPermission, callerPackage, callingPid, callingUid, requiredPermission,
receivers, resultTo, resultCode, resultData, map, ordered, false); receivers, resultTo, resultCode, resultData, map, ordered,
sticky, false);
if (DEBUG_BROADCAST) Log.v( if (DEBUG_BROADCAST) Log.v(
TAG, "Enqueueing ordered broadcast " + r TAG, "Enqueueing ordered broadcast " + r
+ ": prev had " + mOrderedBroadcasts.size()); + ": prev had " + mOrderedBroadcasts.size());
@@ -12132,17 +12151,17 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
} }
long now = SystemClock.uptimeMillis(); long now = SystemClock.uptimeMillis();
BroadcastRecord r = mOrderedBroadcasts.get(0); BroadcastRecord r = mOrderedBroadcasts.get(0);
if ((r.startTime+BROADCAST_TIMEOUT) > now) { if ((r.receiverTime+BROADCAST_TIMEOUT) > now) {
if (DEBUG_BROADCAST) Log.v(TAG, if (DEBUG_BROADCAST) Log.v(TAG,
"Premature timeout @ " + now + ": resetting BROADCAST_TIMEOUT_MSG for " "Premature timeout @ " + now + ": resetting BROADCAST_TIMEOUT_MSG for "
+ (r.startTime + BROADCAST_TIMEOUT)); + (r.receiverTime + BROADCAST_TIMEOUT));
Message msg = mHandler.obtainMessage(BROADCAST_TIMEOUT_MSG); Message msg = mHandler.obtainMessage(BROADCAST_TIMEOUT_MSG);
mHandler.sendMessageAtTime(msg, r.startTime+BROADCAST_TIMEOUT); mHandler.sendMessageAtTime(msg, r.receiverTime+BROADCAST_TIMEOUT);
return; return;
} }
Log.w(TAG, "Timeout of broadcast " + r + " - receiver=" + r.receiver); Log.w(TAG, "Timeout of broadcast " + r + " - receiver=" + r.receiver);
r.startTime = now; r.receiverTime = now;
r.anrCount++; r.anrCount++;
// Current receiver has passed its expiration date. // Current receiver has passed its expiration date.
@@ -12290,7 +12309,7 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
} }
performReceive(filter.receiverList.app, filter.receiverList.receiver, performReceive(filter.receiverList.app, filter.receiverList.receiver,
new Intent(r.intent), r.resultCode, new Intent(r.intent), r.resultCode,
r.resultData, r.resultExtras, r.ordered, r.sticky); r.resultData, r.resultExtras, r.ordered, r.initialSticky);
if (ordered) { if (ordered) {
r.state = BroadcastRecord.CALL_DONE_RECEIVE; r.state = BroadcastRecord.CALL_DONE_RECEIVE;
} }
@@ -12308,6 +12327,17 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
} }
} }
private final void addBroadcastToHistoryLocked(BroadcastRecord r) {
if (r.callingUid < 0) {
// This was from a registerReceiver() call; ignore it.
return;
}
System.arraycopy(mBroadcastHistory, 0, mBroadcastHistory, 1,
MAX_BROADCAST_HISTORY-1);
r.finishTime = SystemClock.uptimeMillis();
mBroadcastHistory[0] = r;
}
private final void processNextBroadcast(boolean fromMsg) { private final void processNextBroadcast(boolean fromMsg) {
synchronized(this) { synchronized(this) {
BroadcastRecord r; BroadcastRecord r;
@@ -12325,6 +12355,7 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
// First, deliver any non-serialized broadcasts right away. // First, deliver any non-serialized broadcasts right away.
while (mParallelBroadcasts.size() > 0) { while (mParallelBroadcasts.size() > 0) {
r = mParallelBroadcasts.remove(0); r = mParallelBroadcasts.remove(0);
r.dispatchTime = SystemClock.uptimeMillis();
final int N = r.receivers.size(); final int N = r.receivers.size();
if (DEBUG_BROADCAST_LIGHT) Log.v(TAG, "Processing parallel broadcast " if (DEBUG_BROADCAST_LIGHT) Log.v(TAG, "Processing parallel broadcast "
+ r); + r);
@@ -12335,6 +12366,7 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
+ target + ": " + r); + target + ": " + r);
deliverToRegisteredReceiver(r, (BroadcastFilter)target, false); deliverToRegisteredReceiver(r, (BroadcastFilter)target, false);
} }
addBroadcastToHistoryLocked(r);
if (DEBUG_BROADCAST_LIGHT) Log.v(TAG, "Done with parallel broadcast " if (DEBUG_BROADCAST_LIGHT) Log.v(TAG, "Done with parallel broadcast "
+ r); + r);
} }
@@ -12392,7 +12424,7 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
Log.w(TAG, "Hung broadcast discarded after timeout failure:" Log.w(TAG, "Hung broadcast discarded after timeout failure:"
+ " now=" + now + " now=" + now
+ " dispatchTime=" + r.dispatchTime + " dispatchTime=" + r.dispatchTime
+ " startTime=" + r.startTime + " startTime=" + r.receiverTime
+ " intent=" + r.intent + " intent=" + r.intent
+ " numReceivers=" + numReceivers + " numReceivers=" + numReceivers
+ " nextReceiver=" + r.nextReceiver + " nextReceiver=" + r.nextReceiver
@@ -12436,6 +12468,7 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
+ r); + r);
// ... and on to the next... // ... and on to the next...
addBroadcastToHistoryLocked(r);
mOrderedBroadcasts.remove(0); mOrderedBroadcasts.remove(0);
r = null; r = null;
looped = true; looped = true;
@@ -12448,17 +12481,17 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
// Keep track of when this receiver started, and make sure there // Keep track of when this receiver started, and make sure there
// is a timeout message pending to kill it if need be. // is a timeout message pending to kill it if need be.
r.startTime = SystemClock.uptimeMillis(); r.receiverTime = SystemClock.uptimeMillis();
if (recIdx == 0) { if (recIdx == 0) {
r.dispatchTime = r.startTime; r.dispatchTime = r.receiverTime;
if (DEBUG_BROADCAST_LIGHT) Log.v(TAG, "Processing ordered broadcast " if (DEBUG_BROADCAST_LIGHT) Log.v(TAG, "Processing ordered broadcast "
+ r); + r);
if (DEBUG_BROADCAST) Log.v(TAG, if (DEBUG_BROADCAST) Log.v(TAG,
"Submitting BROADCAST_TIMEOUT_MSG for " "Submitting BROADCAST_TIMEOUT_MSG for "
+ (r.startTime + BROADCAST_TIMEOUT)); + (r.receiverTime + BROADCAST_TIMEOUT));
Message msg = mHandler.obtainMessage(BROADCAST_TIMEOUT_MSG); Message msg = mHandler.obtainMessage(BROADCAST_TIMEOUT_MSG);
mHandler.sendMessageAtTime(msg, r.startTime+BROADCAST_TIMEOUT); mHandler.sendMessageAtTime(msg, r.receiverTime+BROADCAST_TIMEOUT);
} }
Object nextReceiver = r.receivers.get(recIdx); Object nextReceiver = r.receivers.get(recIdx);

View File

@@ -39,8 +39,16 @@ class BroadcastFilter extends IntentFilter {
receiverList.dumpLocal(pw, prefix); receiverList.dumpLocal(pw, prefix);
} }
public void dumpBrief(PrintWriter pw, String prefix) {
dumpBroadcastFilterState(pw, prefix);
}
public void dumpInReceiverList(PrintWriter pw, Printer pr, String prefix) { public void dumpInReceiverList(PrintWriter pw, Printer pr, String prefix) {
super.dump(pr, prefix); super.dump(pr, prefix);
dumpBroadcastFilterState(pw, prefix);
}
void dumpBroadcastFilterState(PrintWriter pw, String prefix) {
if (requiredPermission != null) { if (requiredPermission != null) {
pw.print(prefix); pw.print("requiredPermission="); pw.println(requiredPermission); pw.print(prefix); pw.print("requiredPermission="); pw.println(requiredPermission);
} }

View File

@@ -41,11 +41,13 @@ class BroadcastRecord extends Binder {
final int callingUid; // the uid of who sent this final int callingUid; // the uid of who sent this
final boolean ordered; // serialize the send to receivers? final boolean ordered; // serialize the send to receivers?
final boolean sticky; // originated from existing sticky data? final boolean sticky; // originated from existing sticky data?
final boolean initialSticky; // initial broadcast from register to sticky?
final String requiredPermission; // a permission the caller has required final String requiredPermission; // a permission the caller has required
final List receivers; // contains BroadcastFilter and ResolveInfo final List receivers; // contains BroadcastFilter and ResolveInfo
final IIntentReceiver resultTo; // who receives final result if non-null final IIntentReceiver resultTo; // who receives final result if non-null
long dispatchTime; // when dispatch started on this set of receivers long dispatchTime; // when dispatch started on this set of receivers
long startTime; // when current receiver started for timeouts. long receiverTime; // when current receiver started for timeouts.
long finishTime; // when we finished the broadcast.
int resultCode; // current result code value. int resultCode; // current result code value.
String resultData; // current result data value. String resultData; // current result data value.
Bundle resultExtras; // current result extra data values. Bundle resultExtras; // current result extra data values.
@@ -73,28 +75,55 @@ class BroadcastRecord extends Binder {
void dump(PrintWriter pw, String prefix) { void dump(PrintWriter pw, String prefix) {
pw.println(prefix + this); pw.println(prefix + this);
pw.println(prefix + intent); pw.println(prefix + intent);
if (sticky) {
Bundle bundle = intent.getExtras();
if (bundle != null) {
pw.println(prefix + "extras: " + bundle.toString());
}
}
pw.println(prefix + "proc=" + callerApp); pw.println(prefix + "proc=" + callerApp);
pw.println(prefix + "caller=" + callerPackage pw.println(prefix + "caller=" + callerPackage
+ " callingPid=" + callingPid + " callingPid=" + callingPid
+ " callingUid=" + callingUid); + " callingUid=" + callingUid);
pw.println(prefix + "requiredPermission=" + requiredPermission); if (requiredPermission != null) {
pw.println(prefix + "requiredPermission=" + requiredPermission);
}
pw.println(prefix + "dispatchTime=" + dispatchTime + " (" pw.println(prefix + "dispatchTime=" + dispatchTime + " ("
+ (SystemClock.uptimeMillis()-dispatchTime) + " since now)"); + (SystemClock.uptimeMillis()-dispatchTime) + "ms since now)");
pw.println(prefix + "startTime=" + startTime + " (" if (finishTime != 0) {
+ (SystemClock.uptimeMillis()-startTime) + " since now)"); pw.println(prefix + "finishTime=" + finishTime + " ("
pw.println(prefix + "anrCount=" + anrCount); + (SystemClock.uptimeMillis()-finishTime) + "ms since now)");
pw.println(prefix + "resultTo=" + resultTo } else {
+ " resultCode=" + resultCode + " resultData=" + resultData); pw.println(prefix + "receiverTime=" + receiverTime + " ("
pw.println(prefix + "resultExtras=" + resultExtras); + (SystemClock.uptimeMillis()-receiverTime) + "ms since now)");
pw.println(prefix + "resultAbort=" + resultAbort }
+ " ordered=" + ordered + " sticky=" + sticky); if (anrCount != 0) {
pw.println(prefix + "nextReceiver=" + nextReceiver pw.println(prefix + "anrCount=" + anrCount);
+ " receiver=" + receiver); }
pw.println(prefix + "curFilter=" + curFilter); if (resultTo != null || resultCode != -1 || resultData != null) {
pw.println(prefix + "curReceiver=" pw.println(prefix + "resultTo=" + resultTo
+ ((curReceiver != null) ? curReceiver : "(null)")); + " resultCode=" + resultCode + " resultData=" + resultData);
pw.println(prefix + "curApp=" + curApp); }
if (resultExtras != null) {
pw.println(prefix + "resultExtras=" + resultExtras);
}
if (resultAbort || ordered || sticky || initialSticky) {
pw.println(prefix + "resultAbort=" + resultAbort
+ " ordered=" + ordered + " sticky=" + sticky
+ " initialSticky=" + initialSticky);
}
if (nextReceiver != 0 || receiver != null) {
pw.println(prefix + "nextReceiver=" + nextReceiver
+ " receiver=" + receiver);
}
if (curFilter != null) {
pw.println(prefix + "curFilter=" + curFilter);
}
if (curReceiver != null) {
pw.println(prefix + "curReceiver=" + curReceiver);
}
if (curApp != null) { if (curApp != null) {
pw.println(prefix + "curApp=" + curApp);
pw.println(prefix + "curComponent=" pw.println(prefix + "curComponent="
+ (curComponent != null ? curComponent.toShortString() : "--")); + (curComponent != null ? curComponent.toShortString() : "--"));
pw.println(prefix + "curSourceDir=" + curReceiver.applicationInfo.sourceDir); pw.println(prefix + "curSourceDir=" + curReceiver.applicationInfo.sourceDir);
@@ -114,7 +143,7 @@ class BroadcastRecord extends Binder {
Object o = receivers.get(i); Object o = receivers.get(i);
pw.println(prefix + "Receiver #" + i + ": " + o); pw.println(prefix + "Receiver #" + i + ": " + o);
if (o instanceof BroadcastFilter) if (o instanceof BroadcastFilter)
((BroadcastFilter)o).dump(pw, p2); ((BroadcastFilter)o).dumpBrief(pw, p2);
else if (o instanceof ResolveInfo) else if (o instanceof ResolveInfo)
((ResolveInfo)o).dump(printer, p2); ((ResolveInfo)o).dump(printer, p2);
} }
@@ -124,7 +153,7 @@ class BroadcastRecord extends Binder {
int _callingPid, int _callingUid, String _requiredPermission, int _callingPid, int _callingUid, String _requiredPermission,
List _receivers, IIntentReceiver _resultTo, int _resultCode, List _receivers, IIntentReceiver _resultTo, int _resultCode,
String _resultData, Bundle _resultExtras, boolean _serialized, String _resultData, Bundle _resultExtras, boolean _serialized,
boolean _sticky) { boolean _sticky, boolean _initialSticky) {
intent = _intent; intent = _intent;
callerApp = _callerApp; callerApp = _callerApp;
callerPackage = _callerPackage; callerPackage = _callerPackage;
@@ -138,6 +167,7 @@ class BroadcastRecord extends Binder {
resultExtras = _resultExtras; resultExtras = _resultExtras;
ordered = _serialized; ordered = _serialized;
sticky = _sticky; sticky = _sticky;
initialSticky = _initialSticky;
nextReceiver = 0; nextReceiver = 0;
state = IDLE; state = IDLE;
} }