Merge "Fix some crashes that are happening in the system process."
diff --git a/core/java/android/app/ApplicationErrorReport.java b/core/java/android/app/ApplicationErrorReport.java
index 6524c9a..588125d 100644
--- a/core/java/android/app/ApplicationErrorReport.java
+++ b/core/java/android/app/ApplicationErrorReport.java
@@ -332,20 +332,31 @@
exceptionMessage = tr.getMessage();
// Populate fields with the "root cause" exception
+ Throwable rootTr = tr;
while (tr.getCause() != null) {
tr = tr.getCause();
+ if (tr.getStackTrace() != null && tr.getStackTrace().length > 0) {
+ rootTr = tr;
+ }
String msg = tr.getMessage();
if (msg != null && msg.length() > 0) {
exceptionMessage = msg;
}
}
- exceptionClassName = tr.getClass().getName();
- StackTraceElement trace = tr.getStackTrace()[0];
- throwFileName = trace.getFileName();
- throwClassName = trace.getClassName();
- throwMethodName = trace.getMethodName();
- throwLineNumber = trace.getLineNumber();
+ exceptionClassName = rootTr.getClass().getName();
+ if (rootTr.getStackTrace().length > 0) {
+ StackTraceElement trace = rootTr.getStackTrace()[0];
+ throwFileName = trace.getFileName();
+ throwClassName = trace.getClassName();
+ throwMethodName = trace.getMethodName();
+ throwLineNumber = trace.getLineNumber();
+ } else {
+ throwFileName = "unknown";
+ throwClassName = "unknown";
+ throwMethodName = "unknown";
+ throwLineNumber = 0;
+ }
}
/**
diff --git a/core/java/android/net/Uri.java b/core/java/android/net/Uri.java
index 3b21590..2c875c8 100644
--- a/core/java/android/net/Uri.java
+++ b/core/java/android/net/Uri.java
@@ -1689,7 +1689,7 @@
return HierarchicalUri.readFrom(in);
}
- throw new AssertionError("Unknown URI type: " + type);
+ throw new IllegalArgumentException("Unknown URI type: " + type);
}
public Uri[] newArray(int size) {
@@ -1996,7 +1996,7 @@
parcel.writeInt(Representation.DECODED);
parcel.writeString(decoded);
} else {
- throw new AssertionError();
+ throw new IllegalArgumentException("Neither encoded nor decoded");
}
}
}
@@ -2037,7 +2037,8 @@
case Representation.DECODED:
return fromDecoded(parcel.readString());
default:
- throw new AssertionError();
+ throw new IllegalArgumentException("Unknown representation: "
+ + representation);
}
}
@@ -2221,7 +2222,7 @@
case Representation.DECODED:
return fromDecoded(parcel.readString());
default:
- throw new AssertionError();
+ throw new IllegalArgumentException("Bad representation: " + representation);
}
}
diff --git a/core/java/com/android/internal/os/ProcessStats.java b/core/java/com/android/internal/os/ProcessStats.java
index ea5ce09..e0e9a29 100644
--- a/core/java/com/android/internal/os/ProcessStats.java
+++ b/core/java/com/android/internal/os/ProcessStats.java
@@ -19,6 +19,7 @@
import static android.os.Process.*;
import android.os.Process;
+import android.os.StrictMode;
import android.os.SystemClock;
import android.util.Slog;
@@ -798,6 +799,10 @@
}
private String readFile(String file, char endChar) {
+ // Permit disk reads here, as /proc/meminfo isn't really "on
+ // disk" and should be fast. TODO: make BlockGuard ignore
+ // /proc/ and /sys/ files perhaps?
+ StrictMode.ThreadPolicy savedPolicy = StrictMode.allowThreadDiskReads();
FileInputStream is = null;
try {
is = new FileInputStream(file);
@@ -822,6 +827,7 @@
} catch (java.io.IOException e) {
}
}
+ StrictMode.setThreadPolicy(savedPolicy);
}
return null;
}
diff --git a/services/java/com/android/server/am/ActivityStack.java b/services/java/com/android/server/am/ActivityStack.java
index 33b21ab..ee0937d 100644
--- a/services/java/com/android/server/am/ActivityStack.java
+++ b/services/java/com/android/server/am/ActivityStack.java
@@ -276,10 +276,12 @@
public void handleMessage(Message msg) {
switch (msg.what) {
case SLEEP_TIMEOUT_MSG: {
- if (mService.isSleeping()) {
- Slog.w(TAG, "Sleep timeout! Sleeping now.");
- mSleepTimeout = true;
- checkReadyForSleepLocked();
+ synchronized (mService) {
+ if (mService.isSleeping()) {
+ Slog.w(TAG, "Sleep timeout! Sleeping now.");
+ mSleepTimeout = true;
+ checkReadyForSleepLocked();
+ }
}
} break;
case PAUSE_TIMEOUT_MSG: {
@@ -775,7 +777,6 @@
if (mService.mShuttingDown) {
mService.notifyAll();
}
-
}
public final Bitmap screenshotActivities(ActivityRecord who) {
diff --git a/services/java/com/android/server/wm/WindowManagerService.java b/services/java/com/android/server/wm/WindowManagerService.java
index 0a6e89e..558ba3e 100644
--- a/services/java/com/android/server/wm/WindowManagerService.java
+++ b/services/java/com/android/server/wm/WindowManagerService.java
@@ -8736,6 +8736,12 @@
return;
}
+ if (mDisplay == null || !mPolicy.isScreenOn()) {
+ // No need to freeze the screen before the system is ready or if
+ // the screen is off.
+ return;
+ }
+
mScreenFrozenLock.acquire();
mDisplayFrozen = true;